Skip to content

Commit

Permalink
mds: force replay sessionmap version
Browse files Browse the repository at this point in the history
When expiring the MDLog Segments will it persist the sessionmap,
but what if the number of Segments doesn't reach up to the max
segment threshhold the expiring may won't happen.

So if the MDS failover then the sessionmap won't be persist and
couldn't be replayed by the standby MDS when it starting. We should
just force replay the sessionmap version just the inotable does.

Fixes: https://tracker.ceph.com/issues/58489
Signed-off-by: Xiubo Li <xiubli@redhat.com>
  • Loading branch information
lxbsz committed Feb 2, 2023
1 parent 8a095e9 commit 8dc13c2
Showing 1 changed file with 13 additions and 11 deletions.
24 changes: 13 additions & 11 deletions src/mds/journal.cc
Expand Up @@ -1583,13 +1583,12 @@ void EMetaBlob::replay(MDSRank *mds, LogSegment *logseg, MDPeerUpdate *peerup)
}
}
if (sessionmapv) {
unsigned diff = (used_preallocated_ino && !preallocated_inos.empty()) ? 2 : 1;
if (mds->sessionmap.get_version() >= sessionmapv) {
dout(10) << "EMetaBlob.replay sessionmap v " << sessionmapv
<< " <= table " << mds->sessionmap.get_version() << dendl;
} else if (mds->sessionmap.get_version() + diff == sessionmapv) {
} else {
dout(10) << "EMetaBlob.replay sessionmap v " << sessionmapv
<< " - " << diff << " == table " << mds->sessionmap.get_version()
<< ", table " << mds->sessionmap.get_version()
<< " prealloc " << preallocated_inos
<< " used " << used_preallocated_ino
<< dendl;
Expand All @@ -1609,7 +1608,6 @@ void EMetaBlob::replay(MDSRank *mds, LogSegment *logseg, MDPeerUpdate *peerup)
session->info.prealloc_inos.insert(preallocated_inos);
mds->sessionmap.replay_dirty_session(session);
}

} else {
dout(10) << "EMetaBlob.replay no session for " << client_name << dendl;
if (used_preallocated_ino)
Expand All @@ -1618,13 +1616,17 @@ void EMetaBlob::replay(MDSRank *mds, LogSegment *logseg, MDPeerUpdate *peerup)
if (!preallocated_inos.empty())
mds->sessionmap.replay_advance_version();
}
ceph_assert(sessionmapv == mds->sessionmap.get_version());
} else {
mds->clog->error() << "EMetaBlob.replay sessionmap v " << sessionmapv
<< " - " << diff << " > table " << mds->sessionmap.get_version();
ceph_assert(g_conf()->mds_wipe_sessions);
mds->sessionmap.wipe();
mds->sessionmap.set_version(sessionmapv);

// [repair bad sessionmap updates]
if (sessionmapv > mds->sessionmap.get_version()) {
mds->clog->error() << "EMetaBlob.replay sessionmapv mismatch "
<< sessionmapv << " -> " << mds->sessionmap.get_version();
if (g_conf()->mds_wipe_sessions) {
mds->sessionmap.wipe();
}
// force replay sessionmap version
mds->sessionmap.set_version(sessionmapv);
}
}
}

Expand Down

0 comments on commit 8dc13c2

Please sign in to comment.