During shutdown, `ceph fs set <fs> down true` sets max_mds to 0 before
the MDS daemons have finished exporting their subtrees. shutdown_pass()
iterates over auth subtrees and skips any dir whose inode is
ephemerally pinned, expecting handle_export_pins() to re-place them.
However, handle_export_pins() calls hash_into_rank_bucket() which (after
the companion fix) now returns MDS_RANK_NONE when max_mds == 0. With
no valid target rank the export is never scheduled, so the ephemerally-
pinned dirs are skipped by shutdown_pass() indefinitely and the daemon
loops.
Fixes: https://tracker.ceph.com/issues/76059
Signed-off-by: chungfengz <chungfengz@synology.com>
dir->is_freezing() ||
dir->is_ambiguous_dir_auth() ||
dir->state_test(CDir::STATE_EXPORTING) ||
- dir->get_inode()->is_ephemerally_pinned()) {
+ (mds->mdsmap->get_max_mds() > 0 &&
+ dir->get_inode()->is_ephemerally_pinned())) {
continue;
}
ls.push_back(dir);