From aa1e3bfc5bb0f3009f3149cd04364bcebe212d85 Mon Sep 17 00:00:00 2001 From: Patrick Donnelly Date: Mon, 26 Feb 2024 19:44:27 -0500 Subject: [PATCH] mds: skip sr moves when target is an unlinked dir A directory in the stray directory cannot have any HEAD inodes with caps so there is no need to move anything to the snaprealm opened for the unlinked directory. Following the parent commit's reproducer, the behavior now looks expectedly like: 2024-02-27T02:26:59.049+0000 7f5b095f3700 10 mds.0.cache.ino(0x100000f4575) open_snaprealm snaprealm(0x100000f4575 seq 0 lc 0 cr 0 cps 1 snaps={} last_modified 0.000000 change_attr 0 0x5632a57f9680) parent is snaprealm(0x1 seq e lc e cr e cps 1 snaps={2=snap(2 0x1 'one' 2024-02-27T01:34:36.001053+0000),3=snap(3 0x1 'two' 2024-02-27T01:34:48.623349+0000),6=snap(6 0x1 'six' 2024-02-27T02:03:51.619896+0000),7=snap(7 0x1 'seven' 2024-02-27T02:04:28.375336+0000),8=snap(8 0x1 '1' 2024-02-27T02:06:14.170884+0000),9=snap(9 0x1 '2' 2024-02-27T02:09:47.158624+0000),a=snap(a 0x1 '3' 2024-02-27T02:18:24.666934+0000),b=snap(b 0x1 '4' 2024-02-27T02:18:38.268874+0000),c=snap(c 0x1 '5' 2024-02-27T02:23:13.183995+0000),d=snap(d 0x1 '6' 2024-02-27T02:25:25.593014+0000),e=snap(e 0x1 '7' 2024-02-27T02:26:55.184945+0000)} last_modified 2024-02-27T02:26:55.184945+0000 change_attr 11 0x5632861c5680) 2024-02-27T02:26:59.049+0000 7f5b095f3700 10 mds.0.cache.snaprealm(0x1 seq 14 0x5632861c5680) split_at: snaprealm(0x100000f4575 seq 0 lc 0 cr 0 cps 1 snaps={} last_modified 0.000000 change_attr 0 0x5632a57f9680) on [inode 0x100000f4575 [...f,head] ~mds0/stray0/100000f4575/ auth v1199 pv1200 ap=3 snaprealm=0x5632a57f9680 DIRTYPARENT f() n(v0 1=0+1) old_inodes=1 (ilink xlockdone x=1) (isnap xlockdone x=1) (inest lock) (ifile excl) (iversion lock w=1 last_client=4365) caps={4365=pAsLsXsFsx/AsLsXsFsx@6},l=4365 | request=1 lock=3 dirfrag=1 caps=1 dirtyparent=1 dirty=1 waiter=0 authpin=1 0x563385e94000] 2024-02-27T02:26:59.049+0000 7f5b095f3700 10 mds.0.cache.snaprealm(0x1 seq 14 0x5632861c5680) moving unlinked directory inode Discussions with Dan van der Ster led to the creation of this patch. Fixes: https://tracker.ceph.com/issues/53192 Signed-off-by: Patrick Donnelly Signed-off-by: Dan van der Ster (cherry picked from commit c190a3f1633e9282772e5ec54fe10556856a2540) --- src/mds/SnapRealm.cc | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/mds/SnapRealm.cc b/src/mds/SnapRealm.cc index 5d4d4890dad..ac8cdf8327e 100644 --- a/src/mds/SnapRealm.cc +++ b/src/mds/SnapRealm.cc @@ -328,6 +328,19 @@ void SnapRealm::split_at(SnapRealm *child) // it's a dir. + if (child->inode->get_projected_parent_dir()->inode->is_stray()) { + if (child->inode->containing_realm) { + dout(10) << " moving unlinked directory inode" << dendl; + child->inode->move_to_realm(child); + } else { + /* This shouldn't happen because an unlinked directory will have caps + * issued to the caller executing rmdir (for today's clients). + */ + dout(10) << " skipping unlinked directory inode w/o caps" << dendl; + } + return; + } + // split open_children if (!open_children.empty()) { dout(10) << " open_children are " << open_children << dendl; -- 2.39.5