itsi-server 0.2.18 → 0.2.19
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/Cargo.lock +1 -1
- data/ext/itsi_scheduler/Cargo.toml +1 -1
- data/ext/itsi_server/Cargo.toml +1 -1
- data/ext/itsi_server/extconf.rb +7 -4
- data/ext/itsi_server/src/server/serve_strategy/cluster_mode.rs +5 -1
- data/ext/itsi_server/src/server/signal.rs +34 -12
- data/lib/itsi/server/config/middleware/rate_limit.md +1 -1
- data/lib/itsi/server/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d77f7c74603a2d05018b9317c3855346c4ff44cf442d0978dba6ccc36c833846
|
4
|
+
data.tar.gz: 31b214b857e740b6e1bacd1e84c191624620ad6a34f12c9c63a8dc9a83bac102
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a7d218b57fdddce2884ad7fcbf29c33e14caed2b82f17cf8cf2a2ca4a0e8e527facde280b0ee4887f164533646cad02ad13c309e618bff6d7fef5e0d8503ef55
|
7
|
+
data.tar.gz: c27e6d3d97bd5a9320c20cc19cca2da0416bc967aaabe5a6ba812874e966d57a1bf61aca491a7a2b0248618428da398a732b908920e59c6e174cc054d975c7ff
|
data/Cargo.lock
CHANGED
data/ext/itsi_server/Cargo.toml
CHANGED
data/ext/itsi_server/extconf.rb
CHANGED
@@ -1,8 +1,11 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
4
|
-
require
|
3
|
+
require 'mkmf'
|
4
|
+
require 'rb_sys/mkmf'
|
5
5
|
|
6
|
-
create_rust_makefile(
|
7
|
-
r.extra_rustflags = [
|
6
|
+
create_rust_makefile('itsi/server/itsi_server') do |r|
|
7
|
+
r.extra_rustflags = ['-C target-cpu=native']
|
8
|
+
r.env = {
|
9
|
+
'BINDGEN_EXTRA_CLANG_ARGS' => '-include stdbool.h -std=c99'
|
10
|
+
}
|
8
11
|
end
|
@@ -377,9 +377,13 @@ impl ClusterMode {
|
|
377
377
|
}
|
378
378
|
lifecycle_event = lifecycle_rx.recv() => match lifecycle_event{
|
379
379
|
Ok(lifecycle_event) => {
|
380
|
+
debug!("Cluster mode received lifecycle event: {:?}", lifecycle_event);
|
380
381
|
if let Err(e) = self_ref.clone().handle_lifecycle_event(lifecycle_event).await{
|
381
382
|
match e {
|
382
|
-
ItsiError::Break =>
|
383
|
+
ItsiError::Break => {
|
384
|
+
debug!("Lifecycle event triggered shutdown, breaking cluster monitor loop");
|
385
|
+
break;
|
386
|
+
},
|
383
387
|
_ => error!("Error in handle_lifecycle_event {:?}", e)
|
384
388
|
}
|
385
389
|
}
|
@@ -1,11 +1,12 @@
|
|
1
1
|
use std::{
|
2
2
|
collections::VecDeque,
|
3
|
-
sync::atomic::{AtomicBool, AtomicI8},
|
3
|
+
sync::atomic::{AtomicBool, AtomicI8, Ordering},
|
4
4
|
};
|
5
5
|
|
6
6
|
use nix::libc::{self, sighandler_t};
|
7
7
|
use parking_lot::Mutex;
|
8
8
|
use tokio::sync::broadcast;
|
9
|
+
use tracing::{debug, warn};
|
9
10
|
|
10
11
|
use super::lifecycle_event::LifecycleEvent;
|
11
12
|
|
@@ -21,12 +22,14 @@ pub fn subscribe_runtime_to_signals() -> broadcast::Receiver<LifecycleEvent> {
|
|
21
22
|
if let Some(sender) = guard.as_ref() {
|
22
23
|
return sender.subscribe();
|
23
24
|
}
|
24
|
-
let (sender, receiver) = broadcast::channel(
|
25
|
+
let (sender, receiver) = broadcast::channel(32);
|
25
26
|
let sender_clone = sender.clone();
|
26
27
|
std::thread::spawn(move || {
|
27
|
-
std::thread::sleep(std::time::Duration::from_millis(
|
28
|
+
std::thread::sleep(std::time::Duration::from_millis(10));
|
28
29
|
for event in PENDING_QUEUE.lock().drain(..) {
|
29
|
-
sender_clone.send(event)
|
30
|
+
if let Err(e) = sender_clone.send(event) {
|
31
|
+
eprintln!("Warning: Failed to send pending lifecycle event {:?}", e);
|
32
|
+
}
|
30
33
|
}
|
31
34
|
});
|
32
35
|
|
@@ -41,22 +44,36 @@ pub fn unsubscribe_runtime() {
|
|
41
44
|
|
42
45
|
pub fn send_lifecycle_event(event: LifecycleEvent) {
|
43
46
|
if let Some(sender) = SIGNAL_HANDLER_CHANNEL.lock().as_ref() {
|
44
|
-
sender.send(event)
|
47
|
+
if let Err(e) = sender.send(event) {
|
48
|
+
// Channel full or receivers dropped - this is a critical error for shutdown signals
|
49
|
+
eprintln!("Critical: Failed to send lifecycle event {:?}", e);
|
50
|
+
// For shutdown events, try to force exit if channel delivery fails
|
51
|
+
if matches!(
|
52
|
+
e.0,
|
53
|
+
LifecycleEvent::Shutdown | LifecycleEvent::ForceShutdown
|
54
|
+
) {
|
55
|
+
eprintln!("Emergency shutdown due to signal delivery failure");
|
56
|
+
std::process::exit(1);
|
57
|
+
}
|
58
|
+
}
|
45
59
|
} else {
|
46
60
|
PENDING_QUEUE.lock().push_back(event);
|
47
61
|
}
|
48
62
|
}
|
49
63
|
|
50
64
|
fn receive_signal(signum: i32, _: sighandler_t) {
|
51
|
-
|
65
|
+
debug!("Received signal: {}", signum);
|
66
|
+
SIGINT_COUNT.fetch_add(-1, Ordering::SeqCst);
|
52
67
|
let event = match signum {
|
53
68
|
libc::SIGTERM | libc::SIGINT => {
|
54
|
-
|
55
|
-
|
56
|
-
|
69
|
+
debug!("Received shutdown signal (SIGTERM/SIGINT)");
|
70
|
+
SHUTDOWN_REQUESTED.store(true, Ordering::SeqCst);
|
71
|
+
SIGINT_COUNT.fetch_add(2, Ordering::SeqCst);
|
72
|
+
if SIGINT_COUNT.load(Ordering::SeqCst) < 2 {
|
73
|
+
debug!("First shutdown signal, requesting graceful shutdown");
|
57
74
|
Some(LifecycleEvent::Shutdown)
|
58
75
|
} else {
|
59
|
-
|
76
|
+
warn!("Multiple shutdown signals received, forcing immediate shutdown");
|
60
77
|
Some(LifecycleEvent::ForceShutdown)
|
61
78
|
}
|
62
79
|
}
|
@@ -70,13 +87,17 @@ fn receive_signal(signum: i32, _: sighandler_t) {
|
|
70
87
|
};
|
71
88
|
|
72
89
|
if let Some(event) = event {
|
90
|
+
debug!("Signal {} mapped to lifecycle event: {:?}", signum, event);
|
73
91
|
send_lifecycle_event(event);
|
92
|
+
} else {
|
93
|
+
debug!("Signal {} not mapped to any lifecycle event", signum);
|
74
94
|
}
|
75
95
|
}
|
76
96
|
|
77
97
|
pub fn reset_signal_handlers() -> bool {
|
78
|
-
|
79
|
-
|
98
|
+
debug!("Resetting signal handlers");
|
99
|
+
SIGINT_COUNT.store(0, Ordering::SeqCst);
|
100
|
+
SHUTDOWN_REQUESTED.store(false, Ordering::SeqCst);
|
80
101
|
|
81
102
|
unsafe {
|
82
103
|
libc::signal(libc::SIGTERM, receive_signal as usize);
|
@@ -92,6 +113,7 @@ pub fn reset_signal_handlers() -> bool {
|
|
92
113
|
}
|
93
114
|
|
94
115
|
pub fn clear_signal_handlers() {
|
116
|
+
debug!("Clearing signal handlers");
|
95
117
|
unsafe {
|
96
118
|
libc::signal(libc::SIGTERM, libc::SIG_DFL);
|
97
119
|
libc::signal(libc::SIGINT, libc::SIG_DFL);
|
data/lib/itsi/server/version.rb
CHANGED