From 196a3cdbc9164fa58cc91e5a11800065997fa87f Mon Sep 17 00:00:00 2001 From: Ilya Dryomov Date: Fri, 17 Jun 2022 10:28:55 +0200 Subject: [PATCH] mgr/rbd_support: refresh schedule queue immediately after delay elapses The existing logic often leads to refresh_pools() and refresh_images() being invoked after a 120 second delay instead of after an intended 60 second delay. Signed-off-by: Ilya Dryomov (cherry picked from commit ef3edd399adc99f3ff2acf580727d3dd5439d862) Conflicts: src/pybind/mgr/rbd_support/mirror_snapshot_schedule.py [ commit e4a16e261370 ("mgr/rbd_support: add type annotation") not in pacific ] src/pybind/mgr/rbd_support/trash_purge_schedule.py [ ditto ] --- .../mgr/rbd_support/mirror_snapshot_schedule.py | 13 ++++++++----- src/pybind/mgr/rbd_support/trash_purge_schedule.py | 13 ++++++++----- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/src/pybind/mgr/rbd_support/mirror_snapshot_schedule.py b/src/pybind/mgr/rbd_support/mirror_snapshot_schedule.py index d41d7b1c402df..a5516da66c09e 100644 --- a/src/pybind/mgr/rbd_support/mirror_snapshot_schedule.py +++ b/src/pybind/mgr/rbd_support/mirror_snapshot_schedule.py @@ -421,6 +421,7 @@ class MirrorSnapshotScheduleHandler: MODULE_OPTION_NAME = "mirror_snapshot_schedule" MODULE_OPTION_NAME_MAX_CONCURRENT_SNAP_CREATE = "max_concurrent_snap_create" SCHEDULE_OID = "rbd_mirror_snapshot_schedule" + REFRESH_DELAY_SECONDS = 60.0 lock = Lock() condition = Condition(lock) @@ -445,11 +446,11 @@ class MirrorSnapshotScheduleHandler: try: self.log.info("MirrorSnapshotScheduleHandler: starting") while True: - self.refresh_images() + refresh_delay = self.refresh_images() with self.lock: (image_spec, wait_time) = self.dequeue() if not image_spec: - self.condition.wait(min(wait_time, 60)) + self.condition.wait(min(wait_time, refresh_delay)) continue pool_id, namespace, image_id = image_spec self.create_snapshot_requests.add(pool_id, namespace, image_id) @@ -476,8 +477,9 @@ class MirrorSnapshotScheduleHandler: self.schedules = schedules def refresh_images(self): - if (datetime.now() - self.last_refresh_images).seconds < 60: - return + elapsed = (datetime.now() - self.last_refresh_images).total_seconds() + if elapsed < self.REFRESH_DELAY_SECONDS: + return self.REFRESH_DELAY_SECONDS - elapsed self.log.debug("MirrorSnapshotScheduleHandler: refresh_images") @@ -490,7 +492,7 @@ class MirrorSnapshotScheduleHandler: self.images = {} self.queue = {} self.last_refresh_images = datetime.now() - return + return self.REFRESH_DELAY_SECONDS epoch = int(datetime.now().strftime('%s')) images = {} @@ -508,6 +510,7 @@ class MirrorSnapshotScheduleHandler: self.watchers.unregister_stale(epoch) self.last_refresh_images = datetime.now() + return self.REFRESH_DELAY_SECONDS def load_pool_images(self, ioctx, epoch, images): pool_id = str(ioctx.get_pool_id()) diff --git a/src/pybind/mgr/rbd_support/trash_purge_schedule.py b/src/pybind/mgr/rbd_support/trash_purge_schedule.py index a1ab4f881dba7..08f8ab3af120d 100644 --- a/src/pybind/mgr/rbd_support/trash_purge_schedule.py +++ b/src/pybind/mgr/rbd_support/trash_purge_schedule.py @@ -15,6 +15,7 @@ from .schedule import LevelSpec, Interval, StartTime, Schedule, Schedules class TrashPurgeScheduleHandler: MODULE_OPTION_NAME = "trash_purge_schedule" SCHEDULE_OID = "rbd_trash_purge_schedule" + REFRESH_DELAY_SECONDS = 60.0 lock = Lock() condition = Condition(lock) @@ -34,11 +35,11 @@ class TrashPurgeScheduleHandler: try: self.log.info("TrashPurgeScheduleHandler: starting") while True: - self.refresh_pools() + refresh_delay = self.refresh_pools() with self.lock: (ns_spec, wait_time) = self.dequeue() if not ns_spec: - self.condition.wait(min(wait_time, 60)) + self.condition.wait(min(wait_time, refresh_delay)) continue pool_id, namespace = ns_spec self.trash_purge(pool_id, namespace) @@ -74,8 +75,9 @@ class TrashPurgeScheduleHandler: self.schedules = schedules def refresh_pools(self): - if (datetime.now() - self.last_refresh_pools).seconds < 60: - return + elapsed = (datetime.now() - self.last_refresh_pools).total_seconds() + if elapsed < self.REFRESH_DELAY_SECONDS: + return self.REFRESH_DELAY_SECONDS - elapsed self.log.debug("TrashPurgeScheduleHandler: refresh_pools") @@ -87,7 +89,7 @@ class TrashPurgeScheduleHandler: self.pools = {} self.queue = {} self.last_refresh_pools = datetime.now() - return + return self.REFRESH_DELAY_SECONDS pools = {} @@ -103,6 +105,7 @@ class TrashPurgeScheduleHandler: self.pools = pools self.last_refresh_pools = datetime.now() + return self.REFRESH_DELAY_SECONDS def load_pool(self, ioctx, pools): pool_id = str(ioctx.get_pool_id()) -- 2.39.5