From 6e28df442ca876ba99957eb564da57b78edcf281 Mon Sep 17 00:00:00 2001 From: Jason Dillaman Date: Thu, 19 Nov 2020 15:59:34 -0500 Subject: [PATCH] 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 --- src/pybind/mgr/rbd_support/module.py | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/src/pybind/mgr/rbd_support/module.py b/src/pybind/mgr/rbd_support/module.py index 9f45c4978545..f87893399705 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) -- 2.47.3