Skip to content

Commit c1a48f7

Browse files
committed
add teardown to Configurator trait
1 parent bc75162 commit c1a48f7

File tree

3 files changed

+33
-0
lines changed

3 files changed

+33
-0
lines changed

rust/cubestore/cubestore/src/cluster/mod.rs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -251,6 +251,13 @@ impl Configurator for WorkerConfigurator {
251251
};
252252
Ok(config)
253253
}
254+
255+
fn teardown() {
256+
let teardown = SELECT_WORKER_SHUTDOWN.read().unwrap();
257+
if teardown.is_some() {
258+
teardown.as_ref().unwrap()();
259+
}
260+
}
254261
}
255262

256263
#[cfg(not(target_os = "windows"))]
@@ -369,12 +376,23 @@ lazy_static! {
369376
std::sync::RwLock::new(None);
370377
}
371378

379+
lazy_static! {
380+
static ref SELECT_WORKER_SHUTDOWN: std::sync::RwLock<Option<Box<dyn Fn() + Send + Sync>>> =
381+
std::sync::RwLock::new(None);
382+
}
383+
372384
pub fn register_select_worker_setup(f: fn(&Runtime)) {
373385
let mut setup = SELECT_WORKER_SETUP.write().unwrap();
374386
assert!(setup.is_none(), "select worker setup already registered");
375387
*setup = Some(Box::new(f));
376388
}
377389

390+
pub fn register_select_worker_teardown(f: fn()) {
391+
let mut setup = SELECT_WORKER_SHUTDOWN.write().unwrap();
392+
assert!(setup.is_none(), "select worker teardown already registered");
393+
*setup = Some(Box::new(f));
394+
}
395+
378396
pub fn register_select_worker_configure_fn(f: fn() -> BoxFuture<'static, Config>) {
379397
let mut func = SELECT_WORKER_CONFIGURE_FN.write().unwrap();
380398
assert!(

rust/cubestore/cubestore/src/cluster/worker_pool.rs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -376,6 +376,14 @@ pub struct WorkerProcessArgs<C: Configurator, P: WorkerProcessing, S: ServicesTr
376376
timeout: Duration,
377377
}
378378

379+
struct TeardownGuard<C: Configurator>(PhantomData<C>);
380+
381+
impl<C: Configurator> Drop for TeardownGuard<C> {
382+
fn drop(&mut self) {
383+
C::teardown();
384+
}
385+
}
386+
379387
pub fn worker_main<C, P, S>(a: WorkerProcessArgs<C, P, S>) -> i32
380388
where
381389
C: Configurator,
@@ -399,6 +407,7 @@ where
399407
tokio_builder.thread_stack_size(stack_size);
400408
let runtime = tokio_builder.build().unwrap();
401409
C::setup(&runtime);
410+
let _teardown_guard = TeardownGuard::<C>(PhantomData);
402411
runtime.block_on(async move {
403412
let services_client = S::connect(services_sender, services_reciever, timeout);
404413
let config = match C::configure(services_client).await {
@@ -503,6 +512,8 @@ mod tests {
503512
config.configure_injector().await;
504513
Ok(config)
505514
}
515+
516+
fn teardown() {}
506517
}
507518

508519
pub struct Processor;
@@ -711,6 +722,8 @@ mod tests {
711722
let config = TestConfig { services_client };
712723
Ok(config)
713724
}
725+
726+
fn teardown() {}
714727
}
715728

716729
pub struct ServProcessor;

rust/cubestore/cubestore/src/cluster/worker_services.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@ pub trait Configurator: Send + Sync + 'static {
3434
dyn Callable<Request = Self::ServicesRequest, Response = Self::ServicesResponse>,
3535
>,
3636
) -> Result<Self::Config, CubeError>;
37+
38+
fn teardown();
3739
}
3840

3941
#[async_trait]

0 commit comments

Comments
 (0)