def load_from_pool(self, ioctx: rados.Ioctx, namespace_validator: Optional[Callable], image_validator: Optional[Callable]) -> None: pool_id = ioctx.get_pool_id() pool_name = ioctx.get_pool_name() stale_keys = [] start_after = '' try: while True: with rados.ReadOpCtx() as read_op: self.handler.log.info( "load_schedules: {}, start_after={}".format( pool_name, start_after)) it, ret = ioctx.get_omap_vals(read_op, start_after, "", 128) ioctx.operate_read_op(read_op, self.handler.SCHEDULE_OID) it = list(it) for k, v in it: start_after = k v = v.decode() self.handler.log.info("load_schedule: {} {}".format( k, v)) try: try: level_spec = LevelSpec.from_id( self.handler, k, namespace_validator, image_validator) except ValueError: self.handler.log.debug( "Stale schedule key %s in pool %s", k, pool_name) stale_keys.append(k) continue self.level_specs[level_spec.id] = level_spec schedule = Schedule.from_json(level_spec.name, v) self.schedules[level_spec.id] = schedule except ValueError: self.handler.log.error( "Failed to decode schedule: pool={}, {} {}". format(pool_name, k, v)) if not it: break except StopIteration: pass except rados.ObjectNotFound: pass if stale_keys: with rados.WriteOpCtx() as write_op: ioctx.remove_omap_keys(write_op, stale_keys) ioctx.operate_write_op(write_op, self.handler.SCHEDULE_OID)
def _load_legacy_object(self, ioctx: rados.Ioctx, oid: str) -> bool: MAX_OMAP = 10000 self.log.debug(f"loading object {oid}") if re.search(self.devre, oid) is None: return False with rados.ReadOpCtx() as op: it, rc = ioctx.get_omap_vals(op, None, None, MAX_OMAP) if rc == 0: ioctx.operate_read_op(op, oid) count = 0 for t, raw_smart in it: self.log.debug(f"putting {oid} {t}") self._legacy_put_device_metrics(t, oid, raw_smart) count += 1 assert count < MAX_OMAP self.log.debug(f"removing object {oid}") ioctx.remove_object(oid) return True
def load_task_queue(self, ioctx: rados.Ioctx, pool_name: str) -> None: pool_spec = pool_name if ioctx.nspace: pool_spec += "/{}".format(ioctx.nspace) start_after = '' try: while True: with rados.ReadOpCtx() as read_op: self.log.info("load_task_task: {}, start_after={}".format( pool_spec, start_after)) it, ret = ioctx.get_omap_vals(read_op, start_after, "", 128) ioctx.operate_read_op(read_op, RBD_TASK_OID) it = list(it) for k, v in it: start_after = k v = v.decode() self.log.info("load_task_task: task={}".format(v)) try: task = Task.from_json(v) self.append_task(task) except ValueError: self.log.error( "Failed to decode task: pool_spec={}, task={}". format(pool_spec, v)) if not it: break except StopIteration: pass except rados.ObjectNotFound: # rbd_task DNE pass