]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: fix shutdown hang when ephemeral pins active and max_mds is 0 68413/head
authorchungfengz <chungfengz@synology.com>
Thu, 16 Apr 2026 06:54:16 +0000 (06:54 +0000)
committerVenky Shankar <vshankar@redhat.com>
Mon, 8 Jun 2026 09:05:19 +0000 (14:35 +0530)
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>
src/mds/MDCache.cc

index 268f71220695052056065655975c5bbd47ede354..521ed40a109e559c2d5f664b2b06e15de8915dc8 100644 (file)
@@ -8018,7 +8018,8 @@ bool MDCache::shutdown_pass()
           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);