itsi-server 0.1.2 → 0.1.3
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/ext/itsi_scheduler/extconf.rb +1 -1
- data/ext/itsi_server/extconf.rb +1 -1
- data/ext/itsi_server/src/server/itsi_server.rs +20 -6
- data/ext/itsi_server/src/server/lifecycle_event.rs +1 -0
- data/ext/itsi_server/src/server/listener.rs +16 -0
- data/ext/itsi_server/src/server/serve_strategy/cluster_mode.rs +1 -0
- data/ext/itsi_server/src/server/serve_strategy/single_mode.rs +3 -0
- data/ext/itsi_server/src/server/signal.rs +14 -1
- data/lib/itsi/server/version.rb +1 -1
- data/lib/itsi/server.rb +14 -0
- data/lib/itsi/signals.rb +16 -11
- metadata +2 -16
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ed95c9c3d6f98ecc1b489a6a250e6d2fd4e20c592e8a5eb70e88daae63d22dc2
|
4
|
+
data.tar.gz: 41ed850e9779845be4cbd2fbf47d0a42d8b08054c9581434431c54fd931c3fb8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fcdb9213a107523d7bba3728341d072c8c09ee6a8d3d250489a98445236ec0330a14e737e6e7876c26d1836d782efbdd91cdaa828a6d4d7e7c89830a701e93d2
|
7
|
+
data.tar.gz: f2f3ad35ec63079df46f2b7387e6325b25191c9b0a42d695096b5c56c9d7fe73010bd3a76350a9f9e11e512b4abf650bc1d212addd25a3ac03485674ef7670b8
|
data/ext/itsi_server/extconf.rb
CHANGED
@@ -2,7 +2,7 @@ use super::{
|
|
2
2
|
bind::Bind,
|
3
3
|
listener::Listener,
|
4
4
|
serve_strategy::{cluster_mode::ClusterMode, single_mode::SingleMode},
|
5
|
-
signal::{reset_signal_handlers, SIGNAL_HANDLER_CHANNEL},
|
5
|
+
signal::{clear_signal_handlers, reset_signal_handlers, SIGNAL_HANDLER_CHANNEL},
|
6
6
|
};
|
7
7
|
use crate::{request::itsi_request::ItsiRequest, server::serve_strategy::ServeStrategy};
|
8
8
|
use derive_more::Debug;
|
@@ -195,9 +195,11 @@ impl Server {
|
|
195
195
|
Ok(Arc::new(listeners))
|
196
196
|
}
|
197
197
|
|
198
|
-
pub(crate) fn build_strategy(
|
198
|
+
pub(crate) fn build_strategy(
|
199
|
+
self,
|
200
|
+
listeners: Arc<Vec<Arc<Listener>>>,
|
201
|
+
) -> Result<ServeStrategy> {
|
199
202
|
let server = Arc::new(self);
|
200
|
-
let listeners = server.listeners()?;
|
201
203
|
|
202
204
|
let strategy = if server.config.workers == 1 {
|
203
205
|
ServeStrategy::Single(Arc::new(SingleMode::new(
|
@@ -218,13 +220,25 @@ impl Server {
|
|
218
220
|
pub fn start(&self) -> Result<()> {
|
219
221
|
reset_signal_handlers();
|
220
222
|
let rself = self.clone();
|
221
|
-
|
222
|
-
|
223
|
+
let listeners = self.listeners()?;
|
224
|
+
let listeners_clone = listeners.clone();
|
225
|
+
call_without_gvl(move || -> Result<()> {
|
226
|
+
let strategy = rself.build_strategy(listeners_clone)?;
|
223
227
|
if let Err(e) = strategy.run() {
|
224
228
|
error!("Error running server: {}", e);
|
225
229
|
strategy.stop()?;
|
226
230
|
}
|
231
|
+
drop(strategy);
|
227
232
|
Ok(())
|
228
|
-
})
|
233
|
+
})?;
|
234
|
+
if let Ok(listeners) = Arc::try_unwrap(listeners) {
|
235
|
+
listeners.into_iter().for_each(|listener| {
|
236
|
+
if let Ok(listener) = Arc::try_unwrap(listener) {
|
237
|
+
listener.unbind()
|
238
|
+
};
|
239
|
+
});
|
240
|
+
}
|
241
|
+
clear_signal_handlers();
|
242
|
+
Ok(())
|
229
243
|
}
|
230
244
|
}
|
@@ -41,6 +41,14 @@ pub(crate) enum TokioListener {
|
|
41
41
|
}
|
42
42
|
|
43
43
|
impl TokioListener {
|
44
|
+
pub fn unbind(self) {
|
45
|
+
match self {
|
46
|
+
TokioListener::Tcp { listener, .. } => drop(listener.into_std().unwrap()),
|
47
|
+
TokioListener::TcpTls { listener, .. } => drop(listener.into_std().unwrap()),
|
48
|
+
TokioListener::Unix { listener } => drop(listener.into_std().unwrap()),
|
49
|
+
TokioListener::UnixTls { listener, .. } => drop(listener.into_std().unwrap()),
|
50
|
+
};
|
51
|
+
}
|
44
52
|
pub(crate) async fn accept(&self) -> Result<IoStream> {
|
45
53
|
match self {
|
46
54
|
TokioListener::Tcp { listener, .. } => TokioListener::accept_tcp(listener).await,
|
@@ -166,6 +174,14 @@ impl std::fmt::Display for SockAddr {
|
|
166
174
|
}
|
167
175
|
|
168
176
|
impl Listener {
|
177
|
+
pub fn unbind(self) {
|
178
|
+
match self {
|
179
|
+
Listener::Tcp(listener) => drop(listener),
|
180
|
+
Listener::TcpTls((listener, _)) => drop(listener),
|
181
|
+
Listener::Unix(listener) => drop(listener),
|
182
|
+
Listener::UnixTls((listener, _)) => drop(listener),
|
183
|
+
};
|
184
|
+
}
|
169
185
|
pub fn to_tokio_listener(&self) -> TokioListener {
|
170
186
|
match self {
|
171
187
|
Listener::Tcp(listener) => TokioListener::Tcp {
|
@@ -45,7 +45,8 @@ fn receive_signal(signum: i32, _: sighandler_t) {
|
|
45
45
|
}
|
46
46
|
}
|
47
47
|
|
48
|
-
pub fn reset_signal_handlers() {
|
48
|
+
pub fn reset_signal_handlers() -> bool {
|
49
|
+
SIGINT_COUNT.store(0, std::sync::atomic::Ordering::SeqCst);
|
49
50
|
unsafe {
|
50
51
|
libc::signal(libc::SIGTERM, receive_signal as usize);
|
51
52
|
libc::signal(libc::SIGINT, receive_signal as usize);
|
@@ -54,4 +55,16 @@ pub fn reset_signal_handlers() {
|
|
54
55
|
libc::signal(libc::SIGTTIN, receive_signal as usize);
|
55
56
|
libc::signal(libc::SIGTTOU, receive_signal as usize);
|
56
57
|
}
|
58
|
+
true
|
59
|
+
}
|
60
|
+
|
61
|
+
pub fn clear_signal_handlers() {
|
62
|
+
unsafe {
|
63
|
+
libc::signal(libc::SIGTERM, libc::SIG_DFL);
|
64
|
+
libc::signal(libc::SIGINT, libc::SIG_DFL);
|
65
|
+
libc::signal(libc::SIGUSR1, libc::SIG_DFL);
|
66
|
+
libc::signal(libc::SIGUSR2, libc::SIG_DFL);
|
67
|
+
libc::signal(libc::SIGTTIN, libc::SIG_DFL);
|
68
|
+
libc::signal(libc::SIGTTOU, libc::SIG_DFL);
|
69
|
+
}
|
57
70
|
}
|
data/lib/itsi/server/version.rb
CHANGED
data/lib/itsi/server.rb
CHANGED
@@ -9,6 +9,20 @@ require_relative "server/rack/handler/itsi"
|
|
9
9
|
|
10
10
|
module Itsi
|
11
11
|
class Server
|
12
|
+
|
13
|
+
def self.running?
|
14
|
+
@running ||= false
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.start(app:, **opts)
|
18
|
+
server = new(app: ->{app}, **opts)
|
19
|
+
@running = true
|
20
|
+
Signal.trap('INT', 'DEFAULT')
|
21
|
+
server.start
|
22
|
+
ensure
|
23
|
+
@running = false
|
24
|
+
end
|
25
|
+
|
12
26
|
def self.call(app, request)
|
13
27
|
respond request, app.call(request.to_env)
|
14
28
|
end
|
data/lib/itsi/signals.rb
CHANGED
@@ -1,18 +1,23 @@
|
|
1
1
|
module Itsi
|
2
2
|
module Signals
|
3
3
|
DEFAULT_SIGNALS = ["DEFAULT", ""].freeze
|
4
|
-
module
|
5
|
-
def trap(signal,
|
6
|
-
|
7
|
-
|
4
|
+
module SignalTrap
|
5
|
+
def self.trap(signal, *args, &block)
|
6
|
+
if DEFAULT_SIGNALS.include?(command.to_s) && block.nil?
|
7
|
+
Itsi::Server.reset_signal_handlers
|
8
|
+
nil
|
9
|
+
else
|
10
|
+
super(signal, *args, &block)
|
11
|
+
end
|
8
12
|
end
|
9
13
|
end
|
10
|
-
[Kernel, Signal].each do |receiver|
|
11
|
-
receiver.singleton_class.prepend(TrapInterceptor)
|
12
|
-
end
|
13
|
-
|
14
|
-
[Object].each do |receiver|
|
15
|
-
receiver.include(TrapInterceptor)
|
16
|
-
end
|
17
14
|
end
|
18
15
|
end
|
16
|
+
|
17
|
+
[Kernel, Signal].each do |receiver|
|
18
|
+
receiver.singleton_class.prepend(Itsi::Signals::SignalTrap)
|
19
|
+
end
|
20
|
+
|
21
|
+
[Object].each do |receiver|
|
22
|
+
receiver.include(Itsi::Signals::SignalTrap)
|
23
|
+
end
|
metadata
CHANGED
@@ -1,28 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: itsi-server
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Wouter Coppieters
|
8
8
|
bindir: exe
|
9
9
|
cert_chain: []
|
10
|
-
date: 2025-03-
|
10
|
+
date: 2025-03-14 00:00:00.000000000 Z
|
11
11
|
dependencies:
|
12
|
-
- !ruby/object:Gem::Dependency
|
13
|
-
name: libclang
|
14
|
-
requirement: !ruby/object:Gem::Requirement
|
15
|
-
requirements:
|
16
|
-
- - "~>"
|
17
|
-
- !ruby/object:Gem::Version
|
18
|
-
version: '14.0'
|
19
|
-
type: :runtime
|
20
|
-
prerelease: false
|
21
|
-
version_requirements: !ruby/object:Gem::Requirement
|
22
|
-
requirements:
|
23
|
-
- - "~>"
|
24
|
-
- !ruby/object:Gem::Version
|
25
|
-
version: '14.0'
|
26
12
|
- !ruby/object:Gem::Dependency
|
27
13
|
name: rack
|
28
14
|
requirement: !ruby/object:Gem::Requirement
|