]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mgr/rbd_support: don't scan pools that don't have schedules
authorMykola Golub <mgolub@suse.com>
Tue, 10 Mar 2020 09:03:50 +0000 (09:03 +0000)
committerMykola Golub <mgolub@suse.com>
Tue, 10 Mar 2020 09:08:26 +0000 (09:08 +0000)
Signed-off-by: Mykola Golub <mgolub@suse.com>
src/pybind/mgr/rbd_support/mirror_snapshot_schedule.py
src/pybind/mgr/rbd_support/schedule.py
src/pybind/mgr/rbd_support/trash_purge_schedule.py

index a7435740410172dc161afe8f5da9e411ca799a33..479a967ef923df308f0d94bd5d18f2fc153af18f 100644 (file)
@@ -104,16 +104,12 @@ class MirrorSnapshotScheduleHandler:
 
         self.load_schedules()
 
-        with self.lock:
-            if not self.schedules:
-                self.images = {}
-                self.queue = {}
-                self.last_refresh_images = datetime.now()
-                return
-
         images = {}
 
         for pool_id, pool_name in get_rbd_pools(self.module).items():
+            if not self.schedules.intersects(
+                    LevelSpec.from_pool_spec(pool_id, pool_name)):
+                continue
             with self.module.rados.open_ioctx2(int(pool_id)) as ioctx:
                 self.load_pool_images(ioctx, images)
 
@@ -128,9 +124,16 @@ class MirrorSnapshotScheduleHandler:
         pool_name = ioctx.get_pool_name()
         images[pool_id] = {}
 
+        self.log.debug("load_pool_images: pool={}".format(pool_name))
+
         try:
             namespaces = [''] + rbd.RBD().namespace_list(ioctx)
             for namespace in namespaces:
+                if not self.schedules.intersects(
+                        LevelSpec.from_pool_spec(pool_id, pool_name, namespace)):
+                    continue
+                self.log.debug("load_pool_images: pool={}, namespace={}".format(
+                    pool_name, namespace))
                 images[pool_id][namespace] = {}
                 ioctx.set_namespace(namespace)
                 mirror_images = dict(rbd.RBD().mirror_image_info_list(
index 999fba63ec4c73cfbfb0fa124fd600879448ea95..d791522446b4385ebd12ffac0effbd7b094b5e70 100644 (file)
@@ -52,10 +52,35 @@ class LevelSpec:
             return False
         return True
 
+    def intersects(self, level_spec):
+        if self.pool_id is None or level_spec.pool_id is None:
+            return True
+        if self.pool_id != level_spec.pool_id:
+            return False
+        if self.namespace is None or level_spec.namespace is None:
+            return True
+        if self.namespace != level_spec.namespace:
+            return False
+        if self.image_id is None or level_spec.image_id is None:
+            return True
+        if self.image_id != level_spec.image_id:
+            return False
+        return True
+
     @classmethod
     def make_global(cls):
         return LevelSpec("", "", None, None, None)
 
+    @classmethod
+    def from_pool_spec(cls, pool_id, pool_name, namespace=None):
+        if namespace is None:
+            id = "{}".format(pool_id)
+            name = "{}/".format(pool_name)
+        else:
+            id = "{}/{}".format(pool_id, namespace)
+            name = "{}/{}/".format(pool_name, namespace)
+        return LevelSpec(name, id, str(pool_id), namespace, None)
+
     @classmethod
     def from_name(cls, handler, name, namespace_validator=None,
                   image_validator=None, allow_image_level=True):
@@ -445,6 +470,12 @@ class Schedules:
             del levels[-1]
         return None
 
+    def intersects(self, level_spec):
+        for ls in self.level_specs.values():
+            if ls.intersects(level_spec):
+                return True
+        return False
+
     def to_list(self, level_spec):
         if level_spec.id in self.schedules:
             parent = level_spec
index de7a09b0ddafcbb232301314da159c4c34c78a40..b7875c9866a4bc4c224e32eca601fb434bf24200 100644 (file)
@@ -81,16 +81,12 @@ class TrashPurgeScheduleHandler:
 
         self.load_schedules()
 
-        with self.lock:
-            if not self.schedules:
-                self.images = {}
-                self.queue = {}
-                self.last_refresh_pools = datetime.now()
-                return
-
         pools = {}
 
         for pool_id, pool_name in get_rbd_pools(self.module).items():
+            if not self.schedules.intersects(
+                    LevelSpec.from_pool_spec(pool_id, pool_name)):
+                continue
             with self.module.rados.open_ioctx2(int(pool_id)) as ioctx:
                 self.load_pool(ioctx, pools)
 
@@ -106,6 +102,8 @@ class TrashPurgeScheduleHandler:
         pools[pool_id] = {}
         pool_namespaces = ['']
 
+        self.log.debug("load_pool: {}".format(pool_name))
+
         try:
             pool_namespaces += rbd.RBD().namespace_list(ioctx)
         except rbd.OperationNotSupported:
@@ -163,7 +161,7 @@ class TrashPurgeScheduleHandler:
         schedule_time = schedule.next_run(now)
         if schedule_time not in self.queue:
             self.queue[schedule_time] = []
-        self.log.debug("schedule image {}/{} at {}".format(
+        self.log.debug("schedule {}/{} at {}".format(
             pool_id, namespace, schedule_time))
         ns_spec = (pool_id, namespace)
         if ns_spec not in self.queue[schedule_time]: