]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: don't set xlocks on dentries done when early reply rename
authorYan, Zheng <zheng.z.yan@intel.com>
Sat, 19 Jan 2013 00:30:23 +0000 (08:30 +0800)
committerYan, Zheng <zheng.z.yan@intel.com>
Tue, 29 Jan 2013 02:17:05 +0000 (10:17 +0800)
_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 <zheng.z.yan@intel.com>
src/mds/Locker.cc
src/mds/Locker.h
src/mds/Server.cc

index e0c149fb7628aca0280a7cd3216a54660cfb6ba3..8847db69339305280ebf19c145b3babfc0a4f5dc 100644 (file)
@@ -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<SimpleLock*>::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();
   }
index 04a5252fcade84f44a23ab1202ed7ea65e1958d5..f00592587bb6ca7e7c1c766d1334a88c95e3d51c 100644 (file)
@@ -93,7 +93,7 @@ public:
 
   void cancel_locking(Mutation *mut, set<CInode*> *pneed_issue);
   void drop_locks(Mutation *mut, set<CInode*> *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<CInode*> *pneed_issue=0);
   void drop_rdlocks(Mutation *mut, set<CInode*> *pneed_issue=0);
 
index eced76fe5f5f7d3f99faf40b5736336c2368285f..92062f74f597bf0128ff98e62c5d6bd975730d49 100644 (file)
@@ -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()