From: Jason Dillaman Date: Thu, 19 Nov 2020 20:59:34 +0000 (-0500) Subject: pybind/mgr/rbd_support: delay creation of progress event X-Git-Tag: v14.2.17~74^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=6e28df442ca876ba99957eb564da57b78edcf281;p=ceph.git pybind/mgr/rbd_support: delay creation of progress event 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 (cherry picked from commit c0069b00e4748974d4bf5cfa1bdab68d6f043abb) Conflicts: src/pybind/mgr/rbd_support/task.py - file does not exist in nautilus: applied the changes manually --- diff --git a/src/pybind/mgr/rbd_support/module.py b/src/pybind/mgr/rbd_support/module.py index 9f45c497854..f8789339970 100644 --- a/src/pybind/mgr/rbd_support/module.py +++ b/src/pybind/mgr/rbd_support/module.py @@ -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)