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 +4 -4
- data/.github/workflows/linux.yml +1 -1
- data/.github/workflows/windows.yml +1 -1
- data/Changelog +6 -0
- data/README.md +2 -2
- data/examples/server.rb +2 -2
- data/lib/serverengine/socket_manager.rb +32 -7
- data/lib/serverengine/socket_manager_win.rb +4 -3
- data/lib/serverengine/version.rb +1 -1
- data/serverengine.gemspec +3 -3
- data/spec/daemon_logger_spec.rb +2 -2
- data/spec/daemon_spec.rb +5 -5
- data/spec/multi_process_server_spec.rb +7 -7
- data/spec/socket_manager_spec.rb +32 -3
- data/spec/spec_helper.rb +1 -4
- data/spec/supervisor_spec.rb +6 -6
- metadata +8 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7350069b97302faf3d6c50118875bf055a7094bc31845185cd4e6b4d3e0a9f61
|
4
|
+
data.tar.gz: 02e1c1e261b6ea6dde6a77a984c8f94dccf237093dda7949174acd2658c9897b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 66ae31cea3ff4779a648d64c00e54ff01e76912cd2a4ce1f6105b83657bdbdaea0e9b2c54972cc171ed2aa2a01794dd4c2c3b2e73fdb1754a7013cee2fd0c1a5
|
7
|
+
data.tar.gz: 8b023a4052650036480ce2f899ac367279dcc341a3d98536c7a3fc91cf227622a3707f7315a9eead3a0a2335792700723dda3a527aa422c5aa06d2ff27824b11
|
data/.github/workflows/linux.yml
CHANGED
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
|
-
@
|
374
|
-
@
|
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
|
-
@
|
45
|
-
@
|
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
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
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
|
-
#
|
112
|
-
#
|
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
|
127
|
+
return @server.addr[1]
|
127
128
|
end
|
128
129
|
|
129
130
|
def stop_server
|
data/lib/serverengine/version.rb
CHANGED
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.
|
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", ["~>
|
25
|
-
gem.add_development_dependency "rspec", ["~>
|
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']
|
data/spec/daemon_logger_spec.rb
CHANGED
@@ -150,7 +150,7 @@ describe ServerEngine::DaemonLogger do
|
|
150
150
|
end
|
151
151
|
|
152
152
|
it 'inter-process locking on rotation' do
|
153
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
235
|
+
skip "Windows environment does not support fork" if ServerEngine.windows?
|
236
236
|
|
237
237
|
config = {
|
238
238
|
workers: 1,
|
data/spec/socket_manager_spec.rb
CHANGED
@@ -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
|
-
|
25
|
-
|
26
|
-
|
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
data/spec/supervisor_spec.rb
CHANGED
@@ -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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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.
|
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:
|
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: '
|
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: '
|
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:
|
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:
|
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.
|
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.
|
185
|
+
rubygems_version: 3.4.1
|
186
186
|
signing_key:
|
187
187
|
specification_version: 4
|
188
188
|
summary: ServerEngine - multiprocess server framework
|