]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mgr/rbd_support: refresh schedule queue immediately after delay elapses
authorIlya Dryomov <idryomov@gmail.com>
Fri, 17 Jun 2022 08:28:55 +0000 (10:28 +0200)
committerIlya Dryomov <idryomov@gmail.com>
Tue, 21 Jun 2022 16:35:50 +0000 (18:35 +0200)
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 <idryomov@gmail.com>
(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 ]

src/pybind/mgr/rbd_support/mirror_snapshot_schedule.py
src/pybind/mgr/rbd_support/trash_purge_schedule.py

index d41d7b1c402dff94bb0b56ce21f4574dbfd7f74d..a5516da66c09e992fcad4349b7c0aaceb57d3054 100644 (file)
@@ -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())
index a1ab4f881dba76c1ea97bd189882544a86c203f6..08f8ab3af120daa368844153e466c9424666193b 100644 (file)
@@ -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())