serverengine 2.3.1 → 2.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8b802588a6e93b69c2dc9810ab33b9e3195e14d93c5f977961a04cc6d88cacf1
4
- data.tar.gz: 9921383ec5ae39cfe982da9ce8c0b432bbc553c2ea5d2090a2d849ec2500c230
3
+ metadata.gz: 7350069b97302faf3d6c50118875bf055a7094bc31845185cd4e6b4d3e0a9f61
4
+ data.tar.gz: 02e1c1e261b6ea6dde6a77a984c8f94dccf237093dda7949174acd2658c9897b
5
5
  SHA512:
6
- metadata.gz: ea4c0e4b34490665e4287c0f43e4ea1f32c10fe022464a69326505ec21aad2650e53b842c2aaeec2a969d914f73715ee059b2bdbb3d72d14b0bce51192bf217c
7
- data.tar.gz: 3e30810b08b8667f2295b41fca60c4683126d8936e32169d0789b8ec02ba3965fc631dbe069c9a8cf057e109ccaa9ad3ad14f4507b2388dcd9ae27463ce39651
6
+ metadata.gz: 66ae31cea3ff4779a648d64c00e54ff01e76912cd2a4ce1f6105b83657bdbdaea0e9b2c54972cc171ed2aa2a01794dd4c2c3b2e73fdb1754a7013cee2fd0c1a5
7
+ data.tar.gz: 8b023a4052650036480ce2f899ac367279dcc341a3d98536c7a3fc91cf227622a3707f7315a9eead3a0a2335792700723dda3a527aa422c5aa06d2ff27824b11
@@ -11,7 +11,7 @@ jobs:
11
11
  strategy:
12
12
  fail-fast: false
13
13
  matrix:
14
- ruby: [ '3.1', '3.0', '2.7' ]
14
+ ruby: [ '3.2', '3.1', '3.0', '2.7' ]
15
15
  os:
16
16
  - ubuntu-latest
17
17
  name: Unit testing with Ruby ${{ matrix.ruby }} on ${{ matrix.os }}
@@ -11,7 +11,7 @@ jobs:
11
11
  strategy:
12
12
  fail-fast: false
13
13
  matrix:
14
- ruby: [ '3.1', '2.7' ]
14
+ ruby: [ '3.2', '3.1', '2.7' ]
15
15
  os:
16
16
  - windows-latest
17
17
  include:
data/Changelog CHANGED
@@ -1,3 +1,9 @@
1
+ 2023-03-14 version 2.3.2
2
+
3
+ * Accept `nil` for `ServerEngine::SocketManager::Server.open` to select path automatically
4
+ * Care excluded port ranges of Windows in `ServerEngine::SocketManager.generate_path`
5
+ * Update to Rake 13 and RSpec 3 to support running tests on Ruby 3.2
6
+
1
7
  2022-12-22 version 2.3.1
2
8
 
3
9
  * Don't treat as error when worker shuts down with exit status 0
data/README.md CHANGED
@@ -370,8 +370,8 @@ se.run
370
370
  ```ruby
371
371
  module MyServer
372
372
  def before_run
373
- @socket_manager_path = ServerEngine::SocketManager::Server.generate_path
374
- @socket_manager_server = ServerEngine::SocketManager::Server.open(@socket_manager_path)
373
+ @socket_manager_server = ServerEngine::SocketManager::Server.open
374
+ @socket_manager_path = @socket_manager_server.path
375
375
  end
376
376
 
377
377
  def after_run
data/examples/server.rb CHANGED
@@ -41,8 +41,8 @@ module MyServer
41
41
  attr_reader :socket_manager_path
42
42
 
43
43
  def before_run
44
- @socket_manager_path = ServerEngine::SocketManager::Server.generate_path
45
- @socket_manager_server = ServerEngine::SocketManager::Server.open(@socket_manager_path)
44
+ @socket_manager_server = ServerEngine::SocketManager::Server.open
45
+ @socket_manager_path = @socket_manager_server.path
46
46
  rescue Exception => e
47
47
  logger.error "unexpected error in server, class #{e.class}: #{e.message}"
48
48
  raise
@@ -77,19 +77,23 @@ module ServerEngine
77
77
  port = ENV['SERVERENGINE_SOCKETMANAGER_PORT']
78
78
  return port.to_i if port
79
79
 
80
- for port in get_dynamic_port_range
81
- if `netstat -na | findstr "#{port}"`.length == 0
82
- return port
83
- end
84
- end
80
+ excluded_port_ranges = get_excluded_port_ranges
81
+ get_dynamic_port_range
82
+ .reject { |port| excluded_port_ranges.any? { |range| range.cover?(port) } }
83
+ .find { |port| `netstat -na | findstr "#{port}"`.length == 0 }
85
84
  else
86
85
  base_dir = (ENV['SERVERENGINE_SOCKETMANAGER_SOCK_DIR'] || '/tmp')
87
86
  File.join(base_dir, 'SERVERENGINE_SOCKETMANAGER_' + Time.now.utc.iso8601 + '_' + Process.pid.to_s)
88
87
  end
89
88
  end
90
89
 
91
- def self.open(path)
92
- new(path)
90
+ def self.open(path = nil)
91
+ return new(path) unless path.nil?
92
+ if ServerEngine.windows?
93
+ new(0)
94
+ else
95
+ new(self.generate_path)
96
+ end
93
97
  end
94
98
 
95
99
  def initialize(path)
@@ -198,6 +202,27 @@ module ServerEngine
198
202
  return 49152..65535
199
203
  end
200
204
  end
205
+
206
+ def self.get_excluded_port_ranges
207
+ # Example output of netsh:
208
+ #
209
+ # Protocol tcp Port Exclusion Ranges
210
+ #
211
+ # Start Port End Port
212
+ # ---------- --------
213
+ # 2869 2869
214
+ # 49152 49251
215
+ # 50000 50059 *
216
+ # 57095 57194
217
+ #
218
+ # * - Administered port exclusions.
219
+ #
220
+ `netsh int ipv4 show excludedportrange tcp`
221
+ .force_encoding("ASCII-8BIT")
222
+ .lines
223
+ .map { |line| line.match(/\s*(\d+)\s*(\d+)[\s\*]*/) ? $1.to_i..$2.to_i : nil }
224
+ .compact
225
+ end
201
226
  end
202
227
  end
203
228
 
@@ -108,8 +108,9 @@ module ServerEngine
108
108
  end
109
109
 
110
110
  def start_server(addr)
111
- # TODO: use TCPServer, but this is risky because using not conflict path is easy,
112
- # but using not conflict port is difficult. Then We had better implement using NamedPipe.
111
+ # We need to take care about selecting an available port.
112
+ # By passing `nil` or `0` as `addr`, an available port is automatically selected.
113
+ # However, we should consider using NamedPipe instead of TCPServer.
113
114
  @server = TCPServer.new("127.0.0.1", addr)
114
115
  @thread = Thread.new do
115
116
  begin
@@ -123,7 +124,7 @@ module ServerEngine
123
124
  end
124
125
  end
125
126
 
126
- return path
127
+ return @server.addr[1]
127
128
  end
128
129
 
129
130
  def stop_server
@@ -1,3 +1,3 @@
1
1
  module ServerEngine
2
- VERSION = "2.3.1"
2
+ VERSION = "2.3.2"
3
3
  end
data/serverengine.gemspec CHANGED
@@ -16,13 +16,13 @@ Gem::Specification.new do |gem|
16
16
  gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
17
17
  gem.require_paths = ["lib"]
18
18
 
19
- gem.required_ruby_version = ">= 2.1.0"
19
+ gem.required_ruby_version = ">= 2.3.0"
20
20
 
21
21
  gem.add_dependency "sigdump", ["~> 0.2.2"]
22
22
 
23
23
  # rake v12.x doesn't work with rspec 2. rspec should be updated to 3
24
- gem.add_development_dependency "rake", ["~> 11.0"]
25
- gem.add_development_dependency "rspec", ["~> 2.13.0"]
24
+ gem.add_development_dependency "rake", ["~> 13.0"]
25
+ gem.add_development_dependency "rspec", ["~> 3.12.0"]
26
26
 
27
27
  gem.add_development_dependency 'rake-compiler-dock', ['~> 0.5.0']
28
28
  gem.add_development_dependency 'rake-compiler', ['~> 0.9.4']
@@ -150,7 +150,7 @@ describe ServerEngine::DaemonLogger do
150
150
  end
151
151
 
152
152
  it 'inter-process locking on rotation' do
153
- pending "fork is not implemented in Windows" if ServerEngine.windows?
153
+ skip "fork is not implemented in Windows" if ServerEngine.windows?
154
154
 
155
155
  log = DaemonLogger.new("tmp/se4.log", level: 'trace', log_rotate_age: 3, log_rotate_size: 10)
156
156
  r, w = IO.pipe
@@ -175,7 +175,7 @@ describe ServerEngine::DaemonLogger do
175
175
  end
176
176
 
177
177
  it 'reopen log when path is renamed' do
178
- pending "rename isn't supported on windows" if ServerEngine.windows?
178
+ skip "rename isn't supported on windows" if ServerEngine.windows?
179
179
 
180
180
  log = DaemonLogger.new("tmp/rotate.log", { level: 'info', log_rotate_age: 0 })
181
181
 
data/spec/daemon_spec.rb CHANGED
@@ -11,7 +11,7 @@ describe ServerEngine::Daemon do
11
11
  end
12
12
 
13
13
  it 'run and graceful stop by signal' do
14
- pending "not supported signal base commands on Windows" if ServerEngine.windows?
14
+ skip "not supported signal base commands on Windows" if ServerEngine.windows?
15
15
 
16
16
  dm = Daemon.new(TestServer, TestWorker, daemonize: true, pid_path: "tmp/pid", command_sender: "signal")
17
17
  dm.main
@@ -33,7 +33,7 @@ describe ServerEngine::Daemon do
33
33
  end
34
34
 
35
35
  it 'signals' do
36
- pending "not supported signal base commands on Windows" if ServerEngine.windows?
36
+ skip "not supported signal base commands on Windows" if ServerEngine.windows?
37
37
  dm = Daemon.new(TestServer, TestWorker, daemonize: true, pid_path: "tmp/pid", command_sender: "signal")
38
38
  dm.main
39
39
 
@@ -112,7 +112,7 @@ describe ServerEngine::Daemon do
112
112
  end
113
113
 
114
114
  it 'exits with status 0 when it was stopped normally' do
115
- pending "worker type process(fork) cannot be used in Windows" if ServerEngine.windows?
115
+ skip "worker type process(fork) cannot be used in Windows" if ServerEngine.windows?
116
116
  dm = Daemon.new(
117
117
  TestServer,
118
118
  TestWorker,
@@ -135,7 +135,7 @@ describe ServerEngine::Daemon do
135
135
  end
136
136
 
137
137
  it 'exits with status of workers if worker exits with status specified in unrecoverable_exit_codes, without supervisor' do
138
- pending "worker type process(fork) cannot be used in Windows" if ServerEngine.windows?
138
+ skip "worker type process(fork) cannot be used in Windows" if ServerEngine.windows?
139
139
 
140
140
  dm = Daemon.new(
141
141
  TestServer,
@@ -159,7 +159,7 @@ describe ServerEngine::Daemon do
159
159
  end
160
160
 
161
161
  it 'exits with status of workers if worker exits with status specified in unrecoverable_exit_codes, with supervisor' do
162
- pending "worker type process(fork) cannot be used in Windows" if ServerEngine.windows?
162
+ skip "worker type process(fork) cannot be used in Windows" if ServerEngine.windows?
163
163
 
164
164
  dm = Daemon.new(
165
165
  TestServer,
@@ -17,7 +17,7 @@ require 'securerandom'
17
17
  end
18
18
 
19
19
  it 'scale up' do
20
- pending "Windows environment does not support fork" if ServerEngine.windows? && impl_class == ServerEngine::MultiProcessServer
20
+ skip "Windows environment does not support fork" if ServerEngine.windows? && impl_class == ServerEngine::MultiProcessServer
21
21
 
22
22
  config = {
23
23
  workers: 2,
@@ -50,7 +50,7 @@ require 'securerandom'
50
50
  end
51
51
 
52
52
  it 'scale down' do
53
- pending "Windows environment does not support fork" if ServerEngine.windows? && impl_class == ServerEngine::MultiProcessServer
53
+ skip "Windows environment does not support fork" if ServerEngine.windows? && impl_class == ServerEngine::MultiProcessServer
54
54
 
55
55
  config = {
56
56
  workers: 2,
@@ -98,7 +98,7 @@ end
98
98
  end
99
99
 
100
100
  it 'raises SystemExit when all workers exit with specified code by unrecoverable_exit_codes' do
101
- pending "Windows environment does not support fork" if ServerEngine.windows? && impl_class == ServerEngine::MultiProcessServer
101
+ skip "Windows environment does not support fork" if ServerEngine.windows? && impl_class == ServerEngine::MultiProcessServer
102
102
 
103
103
  config = {
104
104
  workers: 4,
@@ -127,7 +127,7 @@ end
127
127
  end
128
128
 
129
129
  it 'raises SystemExit immediately when a worker exits if stop_immediately_at_unrecoverable_exit specified' do
130
- pending "Windows environment does not support fork" if ServerEngine.windows? && impl_class == ServerEngine::MultiProcessServer
130
+ skip "Windows environment does not support fork" if ServerEngine.windows? && impl_class == ServerEngine::MultiProcessServer
131
131
 
132
132
  config = {
133
133
  workers: 4,
@@ -172,7 +172,7 @@ describe "log level for exited proccess" do
172
172
  end
173
173
 
174
174
  it 'stop' do
175
- pending "Windows environment does not support fork" if ServerEngine.windows?
175
+ skip "Windows environment does not support fork" if ServerEngine.windows?
176
176
 
177
177
  config = {
178
178
  workers: 1,
@@ -197,7 +197,7 @@ describe "log level for exited proccess" do
197
197
  end
198
198
 
199
199
  it 'non zero exit status' do
200
- pending "Windows environment does not support fork" if ServerEngine.windows?
200
+ skip "Windows environment does not support fork" if ServerEngine.windows?
201
201
 
202
202
  config = {
203
203
  workers: 1,
@@ -232,7 +232,7 @@ describe "log level for exited proccess" do
232
232
  end
233
233
 
234
234
  it 'zero exit status' do
235
- pending "Windows environment does not support fork" if ServerEngine.windows?
235
+ skip "Windows environment does not support fork" if ServerEngine.windows?
236
236
 
237
237
  config = {
238
238
  workers: 1,
@@ -1,4 +1,5 @@
1
1
  require 'socket'
2
+ require 'rr'
2
3
 
3
4
  describe ServerEngine::SocketManager do
4
5
  include_context 'test server and worker'
@@ -21,9 +22,23 @@ describe ServerEngine::SocketManager do
21
22
 
22
23
  if ServerEngine.windows?
23
24
  context 'Server.generate_path' do
24
- it 'returns socket path as port number' do
25
- path = SocketManager::Server.generate_path
26
- expect(path).to be_between(49152, 65535)
25
+ context 'with socket path as port number' do
26
+ it 'returns a port in the dynamic port range' do
27
+ path = SocketManager::Server.generate_path
28
+ expect(path).to be_between(49152, 65535)
29
+ end
30
+
31
+ it 'returns a port which is not excluded' do
32
+ excluded_port_ranges = [
33
+ 49152..49251,
34
+ 50000..50059,
35
+ ]
36
+ RR.stub(SocketManager::Server).get_excluded_port_ranges { excluded_port_ranges }
37
+ path = SocketManager::Server.generate_path
38
+ excluded_port_ranges.each do |range|
39
+ expect(path).not_to be_between(range.first, range.last)
40
+ end
41
+ end
27
42
  end
28
43
 
29
44
  it 'can be changed via environment variable' do
@@ -33,6 +48,13 @@ describe ServerEngine::SocketManager do
33
48
  ENV.delete('SERVERENGINE_SOCKETMANAGER_PORT')
34
49
  end
35
50
  end
51
+
52
+ context 'Server.open' do
53
+ it 'returns server with automatically selected socket path as port number' do
54
+ server = SocketManager::Server.open
55
+ expect(server.path).to be_between(49152, 65535)
56
+ end
57
+ end
36
58
  else
37
59
  context 'Server.generate_path' do
38
60
  it 'returns socket path under /tmp' do
@@ -47,6 +69,13 @@ describe ServerEngine::SocketManager do
47
69
  ENV.delete('SERVERENGINE_SOCKETMANAGER_SOCK_DIR')
48
70
  end
49
71
  end
72
+
73
+ context 'Server.open' do
74
+ it 'returns server with automatically selected socket path under /tmp' do
75
+ server = SocketManager::Server.open
76
+ expect(server.path).to include('/tmp/SERVERENGINE_SOCKETMANAGER_')
77
+ end
78
+ end
50
79
  end
51
80
 
52
81
  context 'with thread' do
data/spec/spec_helper.rb CHANGED
@@ -1,9 +1,6 @@
1
1
  require 'bundler'
2
2
  require 'rspec'
3
-
4
- RSpec.configure do |config|
5
- config.color_enabled = true
6
- end
3
+ require 'fileutils'
7
4
 
8
5
  begin
9
6
  Bundler.setup(:default, :test)
@@ -90,7 +90,7 @@ describe ServerEngine::Supervisor do
90
90
  context "when using #{sender} as command_sender" do
91
91
 
92
92
  it 'start and graceful stop' do
93
- pending 'not supported on Windows' if ServerEngine.windows? && sender == 'signal'
93
+ skip 'not supported on Windows' if ServerEngine.windows? && sender == 'signal'
94
94
 
95
95
  sv, t = start_supervisor(command_sender: sender)
96
96
 
@@ -113,7 +113,7 @@ describe ServerEngine::Supervisor do
113
113
  end
114
114
 
115
115
  it 'immediate stop' do
116
- pending 'not supported on Windows' if ServerEngine.windows? && sender == 'signal'
116
+ skip 'not supported on Windows' if ServerEngine.windows? && sender == 'signal'
117
117
 
118
118
  sv, t = start_supervisor(command_sender: sender)
119
119
 
@@ -131,7 +131,7 @@ describe ServerEngine::Supervisor do
131
131
  end
132
132
 
133
133
  it 'graceful restart' do
134
- pending 'not supported on Windows' if ServerEngine.windows? && sender == 'signal'
134
+ skip 'not supported on Windows' if ServerEngine.windows? && sender == 'signal'
135
135
 
136
136
  sv, t = start_supervisor(command_sender: sender)
137
137
 
@@ -155,7 +155,7 @@ describe ServerEngine::Supervisor do
155
155
  end
156
156
 
157
157
  it 'immediate restart' do
158
- pending 'not supported on Windows' if ServerEngine.windows? && sender == 'signal'
158
+ skip 'not supported on Windows' if ServerEngine.windows? && sender == 'signal'
159
159
 
160
160
  sv, t = start_supervisor(command_sender: sender)
161
161
 
@@ -179,7 +179,7 @@ describe ServerEngine::Supervisor do
179
179
  end
180
180
 
181
181
  it 'reload' do
182
- pending 'not supported on Windows' if ServerEngine.windows? && sender == 'signal'
182
+ skip 'not supported on Windows' if ServerEngine.windows? && sender == 'signal'
183
183
 
184
184
  sv, t = start_supervisor(command_sender: sender)
185
185
 
@@ -200,7 +200,7 @@ describe ServerEngine::Supervisor do
200
200
  # TODO detach
201
201
 
202
202
  it 'auto restart in limited ratio' do
203
- pending 'not supported on Windows' if ServerEngine.windows? && sender == 'signal'
203
+ skip 'not supported on Windows' if ServerEngine.windows? && sender == 'signal'
204
204
 
205
205
  RR.stub(ServerEngine).dump_uncaught_error
206
206
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: serverengine
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.3.1
4
+ version: 2.3.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sadayuki Furuhashi
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-12-28 00:00:00.000000000 Z
11
+ date: 2023-03-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: sigdump
@@ -30,28 +30,28 @@ dependencies:
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '11.0'
33
+ version: '13.0'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '11.0'
40
+ version: '13.0'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rspec
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: 2.13.0
47
+ version: 3.12.0
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: 2.13.0
54
+ version: 3.12.0
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: rake-compiler-dock
57
57
  requirement: !ruby/object:Gem::Requirement
@@ -175,14 +175,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
175
175
  requirements:
176
176
  - - ">="
177
177
  - !ruby/object:Gem::Version
178
- version: 2.1.0
178
+ version: 2.3.0
179
179
  required_rubygems_version: !ruby/object:Gem::Requirement
180
180
  requirements:
181
181
  - - ">="
182
182
  - !ruby/object:Gem::Version
183
183
  version: '0'
184
184
  requirements: []
185
- rubygems_version: 3.3.7
185
+ rubygems_version: 3.4.1
186
186
  signing_key:
187
187
  specification_version: 4
188
188
  summary: ServerEngine - multiprocess server framework