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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a59f65a9b7f82d2e3e4e94eed7b1de48b9579e6a2ee40887f6de7500da9cb391
4
- data.tar.gz: 7e49394fbbef18255d4a15ac6335b7acb74d925f2c026c5b24dcf9032f37bdc9
3
+ metadata.gz: ed95c9c3d6f98ecc1b489a6a250e6d2fd4e20c592e8a5eb70e88daae63d22dc2
4
+ data.tar.gz: 41ed850e9779845be4cbd2fbf47d0a42d8b08054c9581434431c54fd931c3fb8
5
5
  SHA512:
6
- metadata.gz: 5886b25965a3fa73fb3ad3f6d7e915558f5cbf69a6dd62ab8dee23b51d64735b43d90942eadb05b44cb374cd64e00ad6eec078686511ca257f5b3f3b3fe99d48
7
- data.tar.gz: b799d8fe05a30559d593f14b13c8b9c9a9f9569b610703e904177ca177671f171e5493615a48c39dd181fb9c2a67f75945e8c592d84ae15414ca4ebef3929ed4
6
+ metadata.gz: fcdb9213a107523d7bba3728341d072c8c09ee6a8d3d250489a98445236ec0330a14e737e6e7876c26d1836d782efbdd91cdaa828a6d4d7e7c89830a701e93d2
7
+ data.tar.gz: f2f3ad35ec63079df46f2b7387e6325b25191c9b0a42d695096b5c56c9d7fe73010bd3a76350a9f9e11e512b4abf650bc1d212addd25a3ac03485674ef7670b8
@@ -3,4 +3,4 @@
3
3
  require "mkmf"
4
4
  require "rb_sys/mkmf"
5
5
 
6
- create_rust_makefile("scheduler/itsi_scheduler")
6
+ create_rust_makefile("itsi/scheduler/itsi_scheduler")
@@ -3,4 +3,4 @@
3
3
  require "mkmf"
4
4
  require "rb_sys/mkmf"
5
5
 
6
- create_rust_makefile("server/itsi_server")
6
+ create_rust_makefile("itsi/server/itsi_server")
@@ -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(self) -> Result<ServeStrategy> {
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
- call_without_gvl(move || {
222
- let strategy = rself.build_strategy()?;
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
  }
@@ -1,5 +1,6 @@
1
1
  #[derive(Debug, Clone)]
2
2
  pub enum LifecycleEvent {
3
+ Start,
3
4
  Shutdown,
4
5
  Restart,
5
6
  IncreaseWorkers,
@@ -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 {
@@ -72,6 +72,7 @@ impl ClusterMode {
72
72
  lifecycle_event: LifecycleEvent,
73
73
  ) -> Result<()> {
74
74
  match lifecycle_event {
75
+ LifecycleEvent::Start => Ok(()),
75
76
  LifecycleEvent::Shutdown => {
76
77
  self.shutdown().await?;
77
78
  Ok(())
@@ -124,6 +124,9 @@ impl SingleMode {
124
124
  }
125
125
  }
126
126
  }
127
+ if let Ok(listener) = Arc::try_unwrap(listener){
128
+ listener.unbind();
129
+ }
127
130
  });
128
131
 
129
132
  }
@@ -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
  }
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Itsi
4
4
  class Server
5
- VERSION = "0.1.2"
5
+ VERSION = "0.1.3"
6
6
  end
7
7
  end
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 TrapInterceptor
5
- def trap(signal, command = nil, &block)
6
- return super unless DEFAULT_SIGNALS.include?(command.to_s) && block.nil?
7
- Itsi::Server.reset_signal_handlers
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.2
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-13 00:00:00.000000000 Z
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