]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
pybind/mgr/rbd_support: delay creation of progress event 38833/head
authorJason Dillaman <dillaman@redhat.com>
Thu, 19 Nov 2020 20:59:34 +0000 (15:59 -0500)
committerNathan Cutler <ncutler@suse.com>
Sat, 9 Jan 2021 08:53:59 +0000 (09:53 +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)

Conflicts:
        src/pybind/mgr/rbd_support/task.py
- file does not exist in nautilus: applied the changes manually

src/pybind/mgr/rbd_support/module.py

index 9f45c49785457115bee8384041a63e026ea93b75..f87893399705c1b607085d0f6082b28cad83f436 100644 (file)
@@ -563,6 +563,7 @@ class Task:
         self.progress = 0.0
         self.canceled = False
         self.failed = False
+        self.progress_posted = False
 
     def __str__(self):
         return self.to_json()
@@ -855,7 +856,6 @@ class TaskHandler:
                 else:
                     task.in_progress = True
                     self.in_progress_task = task
-                    self.update_progress(task, 0)
 
                     self.lock.release()
                     try:
@@ -912,7 +912,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):
@@ -988,6 +993,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:
@@ -999,7 +1008,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"}
@@ -1011,6 +1020,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)