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: v15.2.9~123^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=9901ad2f962a810cc2f1f8a23bcbfd4336c42da0;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) --- diff --git a/src/pybind/mgr/rbd_support/task.py b/src/pybind/mgr/rbd_support/task.py index 78c7db071907..87d43eca15a6 100644 --- a/src/pybind/mgr/rbd_support/task.py +++ b/src/pybind/mgr/rbd_support/task.py @@ -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)