From 78e94415645ea2299497a6e492ca828db8aa5f5d Mon Sep 17 00:00:00 2001 From: Sayan Nandan Date: Fri, 14 May 2021 21:07:37 +0530 Subject: [PATCH] Spawn blocking I/O tasks on a dedicated thread --- server/src/coredb/mod.rs | 4 ++++ server/src/diskstore/flock.rs | 6 ++++++ server/src/diskstore/mod.rs | 17 ++++++++++++++++- 3 files changed, 26 insertions(+), 1 deletion(-) diff --git a/server/src/coredb/mod.rs b/server/src/coredb/mod.rs index 16be5d14..63e93e2b 100644 --- a/server/src/coredb/mod.rs +++ b/server/src/coredb/mod.rs @@ -243,6 +243,10 @@ impl CoreDB { println!("{:#?}", self.acquire_read()); } } + + pub fn poison(&self) { + (*self.shared).table.write().poisoned = true; + } /// Check if snapshotting is enabled pub fn is_snapshot_enabled(&self) -> bool { diff --git a/server/src/diskstore/flock.rs b/server/src/diskstore/flock.rs index f9bd8306..77d400bd 100644 --- a/server/src/diskstore/flock.rs +++ b/server/src/diskstore/flock.rs @@ -98,6 +98,12 @@ impl FileLock { // Now write to the file self.file.write_all(bytes) } + pub fn try_clone(&self) -> Result { + Ok(FileLock { + file: self.file.try_clone()?, + unlocked: self.unlocked, + }) + } } impl Drop for FileLock { diff --git a/server/src/diskstore/mod.rs b/server/src/diskstore/mod.rs index 17ab33e9..f4d26d2d 100644 --- a/server/src/diskstore/mod.rs +++ b/server/src/diskstore/mod.rs @@ -201,7 +201,22 @@ pub async fn bgsave_scheduler( tokio::select! { // Sleep until `duration` from the current time instant _ = time::sleep_until(time::Instant::now() + duration) => { - if !handle.shared.run_bgsave(&mut file) {break;} + let clone_file = match file.try_clone() { + Ok(cloned_descriptor) => cloned_descriptor, + Err(e) => { + // failed to get a clone of the descriptor ugh + handle.poison(); + log::error!("BGSAVE service failed to clone descriptor: '{}'", e); + continue; + } + }; + let cloned_handle = handle.clone(); + let continue_running = tokio::task::spawn_blocking(move || { + let mut owned_file = clone_file; + let owned_handle = cloned_handle; + owned_handle.shared.run_bgsave(&mut owned_file) + }).await.expect("Something caused the background service to panic"); + if !continue_running {break;} } // Otherwise wait for a notification _ = handle.shared.bgsave_task.notified() => {