]> git.proxmox.com Git - proxmox-backup.git/commitdiff
garbage_collect: call fail_on_abort to abort GV when requested.
authorDietmar Maurer <dietmar@proxmox.com>
Tue, 5 May 2020 07:06:34 +0000 (09:06 +0200)
committerDietmar Maurer <dietmar@proxmox.com>
Tue, 5 May 2020 07:06:34 +0000 (09:06 +0200)
src/api2/admin/datastore.rs
src/backup/chunk_store.rs
src/backup/datastore.rs
src/server/worker_task.rs

index 3203734cda81dde454bb2e9333552f7fd22b404e..3fe919859ceccb45def2aa77c904bdc8e8227c72 100644 (file)
@@ -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))
index 7ea0cb5f29ee5ba365077de6cd6cdbfabed4686b..139c9fd2dc0f18a8a6b8a34c393c7b1873451c7e 100644 (file)
@@ -291,7 +291,7 @@ impl ChunkStore {
         &self,
         oldest_writer: i64,
         status: &mut GarbageCollectionStatus,
-        worker: Arc<WorkerTask>,
+        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 {
index 790f4d1739a59e49e4ac07263a7bc626cc9006b2..ebfa1beaccf70fb15a991351b09c4468cf80b0d0 100644 (file)
@@ -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<WorkerTask>) -> 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));
index aa8f1bf355668da9354070e5b69449d4f72f245a..3d2b4a047cdd31188cfb74c59c8052fa7eff7bc9 100644 (file)
@@ -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(())
     }