Skip to content

Commit 16509db

Browse files
simonwickyjstuczyn
authored andcommitted
allow overwriting existing sdk shutdown manager
1 parent b907ccb commit 16509db

File tree

5 files changed

+43
-29
lines changed

5 files changed

+43
-29
lines changed

common/client-core/src/client/base_client/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1005,7 +1005,7 @@ where
10051005
// or get one from the registry
10061006
let shutdown_tracker = match self.shutdown {
10071007
Some(parent_tracker) => parent_tracker.clone(),
1008-
None => nym_task::get_sdk_shutdown_tracker()?,
1008+
None => nym_task::create_sdk_shutdown_tracker()?,
10091009
};
10101010

10111011
Self::start_event_control(self.event_tx, event_receiver, &shutdown_tracker);

common/client-core/src/client/cover_traffic_stream.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -205,7 +205,7 @@ impl LoopCoverTrafficStream<OsRng> {
205205
TrySendError::Full(_) => {
206206
// This isn't a problem, if the channel is full means we're already sending the
207207
// max amount of messages downstream can handle.
208-
tracing::debug!("Failed to send cover message - channel full");
208+
tracing::trace!("Failed to send cover message - channel full");
209209
}
210210
TrySendError::Closed(_) => {
211211
tracing::warn!("Failed to send cover message - channel closed");

common/task/src/lib.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,6 @@ pub use crate::runtime_registry::RegistryAccessError;
2424

2525
/// Get or create a ShutdownTracker for SDK use.
2626
/// This provides automatic task management without requiring manual setup.
27-
pub fn get_sdk_shutdown_tracker() -> Result<ShutdownTracker, RegistryAccessError> {
28-
Ok(runtime_registry::RuntimeRegistry::get_or_create_sdk()?.shutdown_tracker_owned())
27+
pub fn create_sdk_shutdown_tracker() -> Result<ShutdownTracker, RegistryAccessError> {
28+
Ok(runtime_registry::RuntimeRegistry::create_sdk()?.shutdown_tracker_owned())
2929
}

common/task/src/runtime_registry.rs

Lines changed: 34 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -19,32 +19,47 @@ pub(crate) struct RuntimeRegistry {
1919
pub enum RegistryAccessError {
2020
#[error("the runtime registry is poisoned")]
2121
Poisoned,
22+
23+
#[error("The SDK ShutdownManager already exists")]
24+
ExistingShutdownManager,
25+
26+
#[error("No existing SDK ShutdownManager")]
27+
MissingShutdownManager,
2228
}
2329

2430
impl RuntimeRegistry {
25-
/// Get or create a ShutdownManager for SDK use.
31+
/// Create a ShutdownManager for SDK use.
2632
/// This manager doesn't listen to OS signals, making it suitable for library use.
27-
pub(crate) fn get_or_create_sdk() -> Result<Arc<ShutdownManager>, RegistryAccessError> {
28-
let guard = REGISTRY
29-
.sdk_manager
30-
.read()
31-
.map_err(|_| RegistryAccessError::Poisoned)?;
32-
if let Some(manager) = guard.as_ref() {
33-
return Ok(manager.clone());
34-
}
35-
drop(guard);
36-
33+
/// This function overwrite any existing manager!
34+
pub(crate) fn create_sdk() -> Result<Arc<ShutdownManager>, RegistryAccessError> {
3735
let mut guard = REGISTRY
3836
.sdk_manager
3937
.write()
4038
.map_err(|_| RegistryAccessError::Poisoned)?;
39+
4140
Ok(guard
42-
.get_or_insert_with(|| {
43-
Arc::new(ShutdownManager::new_without_signals().with_cancel_on_panic())
44-
})
41+
.insert(Arc::new(
42+
ShutdownManager::new_without_signals().with_cancel_on_panic(),
43+
))
4544
.clone())
4645
}
4746

47+
/// Get the ShutdownManager for SDK use.
48+
/// This manager doesn't listen to OS signals, making it suitable for library use.
49+
/// Not yet used, but maybe in the future
50+
#[allow(dead_code)]
51+
pub(crate) fn get_sdk() -> Result<Arc<ShutdownManager>, RegistryAccessError> {
52+
let guard = REGISTRY
53+
.sdk_manager
54+
.read()
55+
.map_err(|_| RegistryAccessError::Poisoned)?;
56+
if let Some(manager) = guard.as_ref() {
57+
Ok(manager.clone())
58+
} else {
59+
Err(RegistryAccessError::MissingShutdownManager)
60+
}
61+
}
62+
4863
/// Check if an SDK manager has been created.
4964
/// Useful for testing and debugging.
5065
#[allow(dead_code)]
@@ -85,10 +100,13 @@ mod tests {
85100

86101
assert!(!RuntimeRegistry::has_sdk_manager().unwrap());
87102

88-
let manager1 = RuntimeRegistry::get_or_create_sdk().unwrap();
103+
// Error if nothing was created
104+
assert!(RuntimeRegistry::get_sdk().is_err());
105+
106+
let manager1 = RuntimeRegistry::create_sdk().unwrap();
89107
assert!(RuntimeRegistry::has_sdk_manager().unwrap());
90108

91-
let manager2 = RuntimeRegistry::get_or_create_sdk().unwrap();
109+
let manager2 = RuntimeRegistry::get_sdk().unwrap();
92110
// Should return the same instance
93111
assert!(Arc::ptr_eq(&manager1, &manager2));
94112

sdk/rust/nym-sdk/src/mixnet/client.rs

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -736,15 +736,11 @@ where
736736
base_builder = base_builder.with_topology_provider(topology_provider);
737737
}
738738

739-
// Use custom shutdown if provided, otherwise get from registry
740-
let shutdown_tracker = match self.custom_shutdown {
741-
Some(custom) => custom,
742-
None => {
743-
// Auto-create from registry for SDK use
744-
nym_task::get_sdk_shutdown_tracker()?
745-
}
746-
};
747-
base_builder = base_builder.with_shutdown(shutdown_tracker);
739+
// Use custom shutdown if provided, otherwise the sdk one will be used later down the line
740+
if let Some(shutdown_tracker) = self.custom_shutdown {
741+
base_builder = base_builder.with_shutdown(shutdown_tracker);
742+
}
743+
748744
if let Some(event_tx) = self.event_tx {
749745
base_builder = base_builder.with_event_tx(event_tx);
750746
}

0 commit comments

Comments
 (0)