From: Yan, Zheng Date: Sat, 19 Jan 2013 00:30:23 +0000 (+0800) Subject: mds: don't set xlocks on dentries done when early reply rename X-Git-Tag: v0.57~88^2~23 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=cd8d91078c65b1e029354f0fdddbd0574f03d26b;p=ceph.git mds: don't set xlocks on dentries done when early reply rename _rename_finish() does not send dentry link/unlink message to replicas. We should prevent dentries that are modified by the rename operation from getting new replicas while the rename operation is committing. So don't set xlocks on dentries "done". Signed-off-by: Yan, Zheng --- diff --git a/src/mds/Locker.cc b/src/mds/Locker.cc index e0c149fb7628..8847db693393 100644 --- a/src/mds/Locker.cc +++ b/src/mds/Locker.cc @@ -460,11 +460,14 @@ bool Locker::acquire_locks(MDRequest *mdr, } -void Locker::set_xlocks_done(Mutation *mut) +void Locker::set_xlocks_done(Mutation *mut, bool skip_dentry) { for (set::iterator p = mut->xlocks.begin(); p != mut->xlocks.end(); p++) { + if (skip_dentry && + ((*p)->get_type() == CEPH_LOCK_DN || (*p)->get_type() == CEPH_LOCK_DVERSION)) + continue; dout(10) << "set_xlocks_done on " << **p << " " << *(*p)->get_parent() << dendl; (*p)->set_xlock_done(); } diff --git a/src/mds/Locker.h b/src/mds/Locker.h index 04a5252fcade..f00592587bb6 100644 --- a/src/mds/Locker.h +++ b/src/mds/Locker.h @@ -93,7 +93,7 @@ public: void cancel_locking(Mutation *mut, set *pneed_issue); void drop_locks(Mutation *mut, set *pneed_issue=0); - void set_xlocks_done(Mutation *mut); + void set_xlocks_done(Mutation *mut, bool skip_dentry=false); void drop_non_rdlocks(Mutation *mut, set *pneed_issue=0); void drop_rdlocks(Mutation *mut, set *pneed_issue=0); diff --git a/src/mds/Server.cc b/src/mds/Server.cc index eced76fe5f5f..92062f74f597 100644 --- a/src/mds/Server.cc +++ b/src/mds/Server.cc @@ -811,8 +811,12 @@ void Server::early_reply(MDRequest *mdr, CInode *tracei, CDentry *tracedn) MClientReply *reply = new MClientReply(mdr->client_request, 0); reply->set_unsafe(); - // mark xlocks "done", indicating that we are exposing uncommitted changes - mds->locker->set_xlocks_done(mdr); + // mark xlocks "done", indicating that we are exposing uncommitted changes. + // + //_rename_finish() does not send dentry link/unlink message to replicas. + // so do not set xlocks on dentries "done", the xlocks prevent dentries + // that have projected linkages from getting new replica. + mds->locker->set_xlocks_done(mdr, mdr->client_request->get_op() == CEPH_MDS_OP_RENAME); char buf[80]; dout(10) << "early_reply " << reply->get_result()