From: Mykola Golub Date: Tue, 10 Mar 2020 09:03:50 +0000 (+0000) Subject: mgr/rbd_support: don't scan pools that don't have schedules X-Git-Tag: v15.1.1~11^2~2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=6eea8c50a4b1d13a356184cfef63540b19d8c5fa;p=ceph.git mgr/rbd_support: don't scan pools that don't have schedules Signed-off-by: Mykola Golub --- diff --git a/src/pybind/mgr/rbd_support/mirror_snapshot_schedule.py b/src/pybind/mgr/rbd_support/mirror_snapshot_schedule.py index a7435740410..479a967ef92 100644 --- a/src/pybind/mgr/rbd_support/mirror_snapshot_schedule.py +++ b/src/pybind/mgr/rbd_support/mirror_snapshot_schedule.py @@ -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( diff --git a/src/pybind/mgr/rbd_support/schedule.py b/src/pybind/mgr/rbd_support/schedule.py index 999fba63ec4..d791522446b 100644 --- a/src/pybind/mgr/rbd_support/schedule.py +++ b/src/pybind/mgr/rbd_support/schedule.py @@ -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 diff --git a/src/pybind/mgr/rbd_support/trash_purge_schedule.py b/src/pybind/mgr/rbd_support/trash_purge_schedule.py index de7a09b0dda..b7875c9866a 100644 --- a/src/pybind/mgr/rbd_support/trash_purge_schedule.py +++ b/src/pybind/mgr/rbd_support/trash_purge_schedule.py @@ -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]: