serverengine 2.3.1 → 2.3.2

Sign up to get free protection for your applications and to get access to all the features.
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