]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mgr/volumes: allow canceling a single asynchronous job for a volume
authorVenky Shankar <vshankar@redhat.com>
Tue, 14 Jan 2020 09:19:42 +0000 (04:19 -0500)
committerRamana Raja <rraja@redhat.com>
Thu, 19 Mar 2020 12:59:24 +0000 (18:29 +0530)
Signed-off-by: Venky Shankar <vshankar@redhat.com>
(cherry picked from commit 89a16c7867415085dd20c06d87e97bfa7de34fb2)

src/pybind/mgr/volumes/fs/async_job.py

index a83fc6dc91698a757b4c1665eb3a47f1bcac9fdb..b64590e5878719a5ebb9fa8468d77afb04eb63a3 100644 (file)
@@ -156,7 +156,7 @@ class AsyncJobs(object):
         thread_id.reset_cancel()
 
         # wake up cancellation waiters if needed
-        if not self.jobs[volname] and cancelled:
+        if cancelled:
             logging.info("waking up cancellation waiters")
             self.cancel_cv.notifyAll()
 
@@ -194,6 +194,32 @@ class AsyncJobs(object):
         except (KeyError, ValueError):
             pass
 
+    def _cancel_job(self, volname, job):
+        """
+        cancel a executing job for a given volume. return True if canceled, False
+        otherwise (volume/job not found).
+        """
+        canceled = False
+        log.info("canceling job {0} for volume {1}".format(job, volname))
+        try:
+            if not volname in self.q and not volname in self.jobs and not job in self.jobs[volname]:
+                return canceled
+            for j in self.jobs[volname]:
+                if j[0] == job:
+                    j[1].cancel_job()
+                    # be safe against _cancel_jobs() running concurrently
+                    while j in self.jobs.get(volname, []):
+                        self.cancel_cv.wait()
+                    canceled = True
+                    break
+        except (KeyError, ValueError):
+            pass
+        return canceled
+
+    def cancel_job(self, volname, job):
+        with self.lock:
+            return self._cancel_job(volname, job)
+
     def cancel_jobs(self, volname):
         """
         cancel all executing jobs for a given volume.