]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
pybind/mgr/rbd_support: delay creation of progress event 38344/head
authorJason Dillaman <dillaman@redhat.com>
Thu, 19 Nov 2020 20:59:34 +0000 (15:59 -0500)
committerNathan Cutler <ncutler@suse.com>
Mon, 30 Nov 2020 12:14:01 +0000 (13:14 +0100)
Create the progress module event upon receipt of the first
progress callback from the librbd API. This will help to ensure
that all prereqs have been validated for retryable errors like
scheduling an image to be removed while it still has attached
cloned children.

Fixes: https://tracker.ceph.com/issues/48296
Signed-off-by: Jason Dillaman <dillaman@redhat.com>
(cherry picked from commit c0069b00e4748974d4bf5cfa1bdab68d6f043abb)

src/pybind/mgr/rbd_support/task.py

index 78c7db07190704e16fd002e6d0cf0a1eb57da254..87d43eca15a6e97bd103d088df2a793614e6d18b 100644 (file)
@@ -81,6 +81,7 @@ class Task:
         self.progress = 0.0
         self.canceled = False
         self.failed = False
+        self.progress_posted = False
 
     def __str__(self):
         return self.to_json()
@@ -373,7 +374,6 @@ class TaskHandler:
                 else:
                     task.in_progress = True
                     self.in_progress_task = task
-                    self.update_progress(task, 0)
 
                     self.lock.release()
                     try:
@@ -430,7 +430,12 @@ class TaskHandler:
         finally:
             self.lock.release()
 
-        self.throttled_update_progress(task, progress)
+        if not task.progress_posted:
+            # delayed creation of progress event until first callback
+            self.post_progress(task, progress)
+        else:
+            self.throttled_update_progress(task, progress)
+
         return 0
 
     def execute_flatten(self, ioctx, task):
@@ -506,6 +511,10 @@ class TaskHandler:
             self.log.info("{}: task={}".format(task.failure_message, str(task)))
 
     def complete_progress(self, task):
+        if not task.progress_posted:
+            # ensure progress event exists before we complete/fail it
+            self.post_progress(task, 0)
+
         self.log.debug("complete_progress: task={}".format(str(task)))
         try:
             if task.failed:
@@ -517,7 +526,7 @@ class TaskHandler:
             # progress module is disabled
             pass
 
-    def update_progress(self, task, progress):
+    def _update_progress(self, task, progress):
         self.log.debug("update_progress: task={}, progress={}".format(str(task), progress))
         try:
             refs = {"origin": "rbd_support"}
@@ -529,6 +538,14 @@ class TaskHandler:
             # progress module is disabled
             pass
 
+    def post_progress(self, task, progress):
+        self._update_progress(task, progress)
+        task.progress_posted = True
+
+    def update_progress(self, task, progress):
+        if task.progress_posted:
+            self._update_progress(task, progress)
+
     @Throttle(timedelta(seconds=1))
     def throttled_update_progress(self, task, progress):
         self.update_progress(task, progress)