From 233d2d8087f4beb367dd904c2fadcc2ff4aa28bf Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Tue, 9 Mar 2010 10:41:42 -0800 Subject: [PATCH] mds: fix MDentryUnlink Need to replicate mds dir + stray dir dentry as well as the stray inode, dir, dentry. This was overlooked when the /.ceph and per-mds directories were set up. --- src/mds/MDCache.cc | 11 ++++++++--- src/mds/Server.cc | 2 ++ 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src/mds/MDCache.cc b/src/mds/MDCache.cc index 473235309562f..0b9c917057ea2 100644 --- a/src/mds/MDCache.cc +++ b/src/mds/MDCache.cc @@ -8030,10 +8030,15 @@ void MDCache::handle_dentry_unlink(MDentryUnlink *m) // straydn bufferlist::iterator p = m->straybl.begin(); list finished; - CInode *strayin = add_replica_inode(p, NULL, finished); - CDir *straydir = add_replica_dir(p, strayin, m->get_source().num(), finished); + int from = m->get_source().num(); + CInode *mdsin = get_inode(MDS_INO_MDSDIR(from)); + CDir *mdsdir = add_replica_dir(p, mdsin, from, finished); + CDentry *straydirdn = add_replica_dentry(p, mdsdir, finished); + CInode *strayin = add_replica_inode(p, straydirdn, finished); + CDir *straydir = add_replica_dir(p, strayin, from, finished); CDentry *straydn = add_replica_dentry(p, straydir, finished); - if (!finished.empty()) mds->queue_waiters(finished); + if (!finished.empty()) + mds->queue_waiters(finished); // open inode? if (dnl->is_primary()) { diff --git a/src/mds/Server.cc b/src/mds/Server.cc index 824f16c3c5e61..e3a38fce8a59d 100644 --- a/src/mds/Server.cc +++ b/src/mds/Server.cc @@ -3817,6 +3817,8 @@ void Server::_unlink_local_finish(MDRequest *mdr, dout(7) << "_unlink_local_finish sending MDentryUnlink to mds" << it->first << dendl; MDentryUnlink *unlink = new MDentryUnlink(dn->get_dir()->dirfrag(), dn->name); if (straydn) { + mdcache->replicate_dir(straydn->get_dir()->inode->get_parent_dn()->get_dir(), it->first, unlink->straybl); + mdcache->replicate_dentry(straydn->get_dir()->inode->get_parent_dn(), it->first, unlink->straybl); mdcache->replicate_inode(straydn->get_dir()->inode, it->first, unlink->straybl); mdcache->replicate_dir(straydn->get_dir(), it->first, unlink->straybl); mdcache->replicate_dentry(straydn, it->first, unlink->straybl); -- 2.39.5