]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mon: fix mds metadata lost in one case. 53883/head
authorshimin <shimin@kuaishou.com>
Sun, 8 Oct 2023 11:15:09 +0000 (19:15 +0800)
committershimin <shimin@kuaishou.com>
Wed, 11 Oct 2023 02:41:50 +0000 (10:41 +0800)
In most cases, peon's pending_metadata is inconsistent with mon's db.
When a peon turns into leader, and at the same time a active mds stops,
the new leader may flush wrong mds metadata into db. So we meed to
update mds metadata from db at every fsmap change.

This phenomenon can be reproduce like this:
A Cluster with 3 mon and 3 mds (one active, other two standby), 6 osd.
step 1. stop two standby mds;
step 2. restart all mon; (make pending_medata consistent with db)
step 3. start other two mds
step 4. stop leader mon
step 5. run "ceph mds metadata" command to check mds metadata
step 6. stop active mds
step 7. run "ceph mds metadata" command to check mds metadata again

In step 7, we would find mds metadata lost.

Fixes: https://tracker.ceph.com/issues/63166
Signed-off-by: shimin <shimin@kuaishou.com>
src/mon/MDSMonitor.cc

index 3042bdca30d86f596039742e6761327df5db0f05..e24d7388f9cdcef373395d2e39f5a43e0863e5a9 100644 (file)
@@ -136,6 +136,7 @@ void MDSMonitor::update_from_paxos(bool *need_bootstrap)
           << ", my e " << get_fsmap().get_epoch() << dendl;
   ceph_assert(version > get_fsmap().get_epoch());
 
+  load_metadata(pending_metadata);
   load_health();
 
   // read and decode