]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mgr/snap_schedule: restart old schedules
authorMilind Changire <mchangir@redhat.com>
Mon, 28 Feb 2022 06:26:09 +0000 (11:56 +0530)
committerMilind Changire <mchangir@redhat.com>
Thu, 24 Mar 2022 12:31:44 +0000 (18:01 +0530)
Old schedules were not picked up from database when mgr was restarted.
Restart old schedules on mgr restart.

Fixes: https://tracker.ceph.com/issues/54052
Signed-off-by: Milind Changire <mchangir@redhat.com>
src/pybind/mgr/snap_schedule/fs/schedule.py
src/pybind/mgr/snap_schedule/fs/schedule_client.py

index eb347367a64d36827da56a5bcb3419b695c28cfa..d0c9f1098b470a27fe10521b5207ef98b3f6b5c0 100644 (file)
@@ -241,6 +241,14 @@ class Schedule(object):
                                (f'{path}',))
             return [cls._from_db_row(row, fs) for row in c.fetchall()]
 
+    @classmethod
+    def list_all_schedules(cls,
+                           db: sqlite3.Connection,
+                           fs: str) -> List['Schedule']:
+        with db:
+            c = db.execute(cls.PROTO_GET_SCHEDULES + " path LIKE '%'")
+            return [cls._from_db_row(row, fs) for row in c.fetchall()]
+
     INSERT_SCHEDULE = '''INSERT INTO
         schedules(path, subvol, retention, rel_path)
         Values(?, ?, ?, ?);'''
index cf1ba78aac7322e0b5d3975cab3cbafc47d5d2ae..a22f658dffed94d0562276c7123b5bc270a9b6ff 100644 (file)
@@ -144,8 +144,6 @@ class SnapSchedClient(CephfsClient):
 
     def __init__(self, mgr: Any) -> None:
         super(SnapSchedClient, self).__init__(mgr)
-        # TODO maybe iterate over all fs instance in fsmap and load snap dbs?
-        #
         # Each db connection is now guarded by a Lock; this is required to
         # avoid concurrent DB transactions when more than one paths in a
         # file-system are scheduled at the same interval eg. 1h; without the
@@ -155,6 +153,14 @@ class SnapSchedClient(CephfsClient):
         self.active_timers: Dict[Tuple[str, str], List[Timer]] = {}
         self.conn_lock: Lock = Lock()  # lock to protect add/lookup db connections
 
+        # restart old schedules
+        for fs_name in self.get_all_filesystems():
+            with self.get_schedule_db(fs_name) as conn_mgr:
+                db = conn_mgr.dbinfo.db
+                sched_list = Schedule.list_all_schedules(db, fs_name)
+                for sched in sched_list:
+                    self.refresh_snap_timers(fs_name, sched.path, db)
+
     @property
     def allow_minute_snaps(self) -> None:
         return self.mgr.get_module_option('allow_m_granularity')