From c3776ddd18011fad8c4eafb6e652d3fbd54e161a Mon Sep 17 00:00:00 2001 From: "Lei, Huang" <6406592+v0y4g3r@users.noreply.github.com> Date: Thu, 10 Nov 2022 11:33:33 +0800 Subject: [PATCH] fix: stop background task when LogFile is dropped (#440) --- src/log-store/src/fs/file.rs | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/src/log-store/src/fs/file.rs b/src/log-store/src/fs/file.rs index 05dcc72659..8f3afb92b3 100644 --- a/src/log-store/src/fs/file.rs +++ b/src/log-store/src/fs/file.rs @@ -113,6 +113,13 @@ pub struct LogFile { append_buffer_size: usize, } +impl Drop for LogFile { + fn drop(&mut self) { + self.state.stopped.store(true, Ordering::Relaxed); + info!("Stopping log file {}", self.name); + } +} + impl LogFile { /// Opens a file in path with given log config. pub async fn open(path: impl Into, config: &LogConfig) -> Result { @@ -826,4 +833,24 @@ mod tests { .collect::>() ); } + + #[tokio::test] + async fn test_shutdown() { + logging::init_default_ut_logging(); + let config = LogConfig::default(); + let dir = TempDir::new("greptimedb-store-test").unwrap(); + let path_buf = dir.path().join("0010.log"); + let path = path_buf.to_str().unwrap().to_string(); + File::create(path.as_str()).unwrap(); + + let mut file = LogFile::open(path.clone(), &config) + .await + .unwrap_or_else(|_| panic!("Failed to open file: {}", path)); + + let state = file.state.clone(); + file.start().await.unwrap(); + drop(file); + + assert!(state.stopped.load(Ordering::Relaxed)); + } }