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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: deb929709a8dccdf23ec4cdbf7c5880277b9d12f23a1f2d962ed06dcb51c9223
4
- data.tar.gz: 137a2e85d1e3d57cdfc007c004b3b385c2db2e90f9b1d613c5d4e0bb0bad129f
3
+ metadata.gz: d77f7c74603a2d05018b9317c3855346c4ff44cf442d0978dba6ccc36c833846
4
+ data.tar.gz: 31b214b857e740b6e1bacd1e84c191624620ad6a34f12c9c63a8dc9a83bac102
5
5
  SHA512:
6
- metadata.gz: f72ed322a1dd7a738f28c13943394ca34f4c095bb9221770f02cdf918fa06c12ccb5332e4302f1ca837853afb4e3380710d82f6274c6316a68e1922bbeddcbd1
7
- data.tar.gz: 4570d5e0bb716b56703cd6f8a33e9ddf6684c01c18e3b7a35039e292d26aa17620737aeb887034f4cfadd5d0f1a5edcadb6239e2d163974c4087caf580abf7ce
6
+ metadata.gz: a7d218b57fdddce2884ad7fcbf29c33e14caed2b82f17cf8cf2a2ca4a0e8e527facde280b0ee4887f164533646cad02ad13c309e618bff6d7fef5e0d8503ef55
7
+ data.tar.gz: c27e6d3d97bd5a9320c20cc19cca2da0416bc967aaabe5a6ba812874e966d57a1bf61aca491a7a2b0248618428da398a732b908920e59c6e174cc054d975c7ff
data/Cargo.lock CHANGED
@@ -1644,7 +1644,7 @@ checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c"
1644
1644
 
1645
1645
  [[package]]
1646
1646
  name = "itsi-server"
1647
- version = "0.2.18"
1647
+ version = "0.2.19"
1648
1648
  dependencies = [
1649
1649
  "argon2",
1650
1650
  "async-channel",
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "itsi-scheduler"
3
- version = "0.2.18"
3
+ version = "0.2.19"
4
4
  edition = "2021"
5
5
  authors = ["Wouter Coppieters <wc@pico.net.nz>"]
6
6
  license = "MIT"
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "itsi-server"
3
- version = "0.2.18"
3
+ version = "0.2.19"
4
4
  edition = "2021"
5
5
  authors = ["Wouter Coppieters <wc@pico.net.nz>"]
6
6
  license = "MIT"
@@ -1,8 +1,11 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "mkmf"
4
- require "rb_sys/mkmf"
3
+ require 'mkmf'
4
+ require 'rb_sys/mkmf'
5
5
 
6
- create_rust_makefile("itsi/server/itsi_server") do |r|
7
- r.extra_rustflags = ["-C target-cpu=native"]
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 => 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(5);
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(50));
28
+ std::thread::sleep(std::time::Duration::from_millis(10));
28
29
  for event in PENDING_QUEUE.lock().drain(..) {
29
- sender_clone.send(event).ok();
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).ok();
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
- SIGINT_COUNT.fetch_add(-1, std::sync::atomic::Ordering::SeqCst);
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
- SHUTDOWN_REQUESTED.store(true, std::sync::atomic::Ordering::SeqCst);
55
- SIGINT_COUNT.fetch_add(2, std::sync::atomic::Ordering::SeqCst);
56
- if SIGINT_COUNT.load(std::sync::atomic::Ordering::SeqCst) < 2 {
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
- // Not messing about. Force shutdown.
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
- SIGINT_COUNT.store(0, std::sync::atomic::Ordering::SeqCst);
79
- SHUTDOWN_REQUESTED.store(false, std::sync::atomic::Ordering::SeqCst);
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);
@@ -39,7 +39,7 @@ How to identify the client:
39
39
  ```
40
40
  or
41
41
  ```ruby
42
- key: { parameter: { query: { name: "user_id" } } }
42
+ key: { parameter: { query: "user_id" } }
43
43
  ```
44
44
 
45
45
  ### `store_config`
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Itsi
4
4
  class Server
5
- VERSION = "0.2.18"
5
+ VERSION = "0.2.19"
6
6
  end
7
7
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: itsi-server
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.18
4
+ version: 0.2.19
5
5
  platform: ruby
6
6
  authors:
7
7
  - Wouter Coppieters