From 99641a6bbbb30ba67c36d4850c4c1d6ddd3e8a79 Mon Sep 17 00:00:00 2001 From: Dietmar Maurer Date: Tue, 5 May 2020 09:06:34 +0200 Subject: [PATCH] garbage_collect: call fail_on_abort to abort GV when requested. --- src/api2/admin/datastore.rs | 2 +- src/backup/chunk_store.rs | 3 ++- src/backup/datastore.rs | 15 +++++++++------ src/server/worker_task.rs | 2 +- 4 files changed, 13 insertions(+), 9 deletions(-) diff --git a/src/api2/admin/datastore.rs b/src/api2/admin/datastore.rs index 3203734c..3fe91985 100644 --- a/src/api2/admin/datastore.rs +++ b/src/api2/admin/datastore.rs @@ -630,7 +630,7 @@ fn start_garbage_collection( "garbage_collection", Some(store.clone()), "root@pam", to_stdout, move |worker| { worker.log(format!("starting garbage collection on store {}", store)); - datastore.garbage_collection(worker) + datastore.garbage_collection(&worker) })?; Ok(json!(upid_str)) diff --git a/src/backup/chunk_store.rs b/src/backup/chunk_store.rs index 7ea0cb5f..139c9fd2 100644 --- a/src/backup/chunk_store.rs +++ b/src/backup/chunk_store.rs @@ -291,7 +291,7 @@ impl ChunkStore { &self, oldest_writer: i64, status: &mut GarbageCollectionStatus, - worker: Arc, + worker: &WorkerTask, ) -> Result<(), Error> { use nix::sys::stat::fstatat; @@ -314,6 +314,7 @@ impl ChunkStore { worker.log(format!("percentage done: {}, chunk count: {}", percentage, chunk_count)); } + worker.fail_on_abort()?; tools::fail_on_shutdown()?; let (dirfd, entry) = match entry { diff --git a/src/backup/datastore.rs b/src/backup/datastore.rs index 790f4d17..ebfa1bea 100644 --- a/src/backup/datastore.rs +++ b/src/backup/datastore.rs @@ -352,12 +352,14 @@ impl DataStore { index: I, file_name: &Path, // only used for error reporting status: &mut GarbageCollectionStatus, + worker: &WorkerTask, ) -> Result<(), Error> { status.index_file_count += 1; status.index_data_bytes += index.index_bytes(); for pos in 0..index.index_count() { + worker.fail_on_abort()?; tools::fail_on_shutdown()?; let digest = index.index_digest(pos).unwrap(); if let Err(err) = self.chunk_store.touch_chunk(digest) { @@ -368,21 +370,22 @@ impl DataStore { Ok(()) } - fn mark_used_chunks(&self, status: &mut GarbageCollectionStatus) -> Result<(), Error> { + fn mark_used_chunks(&self, status: &mut GarbageCollectionStatus, worker: &WorkerTask) -> Result<(), Error> { let image_list = self.list_images()?; for path in image_list { + worker.fail_on_abort()?; tools::fail_on_shutdown()?; if let Ok(archive_type) = archive_type(&path) { if archive_type == ArchiveType::FixedIndex { let index = self.open_fixed_reader(&path)?; - self.index_mark_used_chunks(index, &path, status)?; + self.index_mark_used_chunks(index, &path, status, worker)?; } else if archive_type == ArchiveType::DynamicIndex { let index = self.open_dynamic_reader(&path)?; - self.index_mark_used_chunks(index, &path, status)?; + self.index_mark_used_chunks(index, &path, status, worker)?; } } } @@ -394,7 +397,7 @@ impl DataStore { self.last_gc_status.lock().unwrap().clone() } - pub fn garbage_collection(&self, worker: Arc) -> Result<(), Error> { + pub fn garbage_collection(&self, worker: &WorkerTask) -> Result<(), Error> { if let Ok(ref mut _mutex) = self.gc_mutex.try_lock() { @@ -409,10 +412,10 @@ impl DataStore { worker.log("Start GC phase1 (mark used chunks)"); - self.mark_used_chunks(&mut gc_status)?; + self.mark_used_chunks(&mut gc_status, &worker)?; worker.log("Start GC phase2 (sweep unused chunks)"); - self.chunk_store.sweep_unused_chunks(oldest_writer, &mut gc_status, worker.clone())?; + self.chunk_store.sweep_unused_chunks(oldest_writer, &mut gc_status, &worker)?; worker.log(&format!("Removed bytes: {}", gc_status.removed_bytes)); worker.log(&format!("Removed chunks: {}", gc_status.removed_chunks)); diff --git a/src/server/worker_task.rs b/src/server/worker_task.rs index aa8f1bf3..3d2b4a04 100644 --- a/src/server/worker_task.rs +++ b/src/server/worker_task.rs @@ -514,7 +514,7 @@ impl WorkerTask { /// Fail if abort was requested. pub fn fail_on_abort(&self) -> Result<(), Error> { if self.abort_requested() { - bail!("task '{}': abort requested - aborting task", self.upid); + bail!("abort requested - aborting task"); } Ok(()) } -- 2.39.2