]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: fix rename notify
authorYan, Zheng <zheng.z.yan@intel.com>
Fri, 8 Nov 2013 10:42:33 +0000 (18:42 +0800)
committerYan, Zheng <zheng.z.yan@intel.com>
Mon, 16 Dec 2013 04:15:23 +0000 (12:15 +0800)
commit 1d86f77edf (mds: fix cross-authorty rename race) introduced
rename notify, but it puts the code in wrong bracket.

This patch also fixes a rename notify related bug in
MDCache::handle_mds_failure()

Signed-off-by: Yan, Zheng <zheng.z.yan@intel.com>
src/mds/MDCache.cc
src/mds/Server.cc

index 7c4c982ab7bda55b10f32b4504e6810d773e12fb..b6edaa46c632b32089252a181545bac81f7f5fa4 100644 (file)
@@ -2677,7 +2677,7 @@ void MDCache::handle_mds_failure(int who)
        dout(10) << " slave request " << *p->second << " no longer need rename notity ack from mds."
                 << who << dendl;
        p->second->more()->waiting_on_slave.erase(who);
-       if (p->second->more()->waiting_on_slave.empty())
+       if (p->second->more()->waiting_on_slave.empty() && p->second->slave_request)
          mds->queue_waiter(new C_MDS_RetryRequest(this, p->second));
       }
 
index 1c8a34f94397a00e095bf1fa80bcafed9aa86bc7..7bd7c5b466da86d39cfeef8947e3d23f3d1b1d1b 100644 (file)
@@ -6484,15 +6484,17 @@ void Server::handle_slave_rename_prep(MDRequest *mdr)
       if (mdr->slave_request->witnesses.size() > 1) {
        dout(10) << " set srci ambiguous auth; providing srcdn replica list" << dendl;
        reply_witness = true;
-       for (set<int>::iterator p = srcdnrep.begin(); p != srcdnrep.end(); ++p) {
-         if (*p == mdr->slave_to_mds ||
-             !mds->mdsmap->is_clientreplay_or_active_or_stopping(*p))
-           continue;
-         MMDSSlaveRequest *notify = new MMDSSlaveRequest(mdr->reqid, mdr->attempt,
-                                                         MMDSSlaveRequest::OP_RENAMENOTIFY);
-         mds->send_message_mds(notify, *p);
-         mdr->more()->waiting_on_slave.insert(*p);
-       }
+      }
+
+      // make sure bystanders have received all lock related messages
+      for (set<int>::iterator p = srcdnrep.begin(); p != srcdnrep.end(); ++p) {
+       if (*p == mdr->slave_to_mds ||
+           !mds->mdsmap->is_clientreplay_or_active_or_stopping(*p))
+         continue;
+       MMDSSlaveRequest *notify = new MMDSSlaveRequest(mdr->reqid, mdr->attempt,
+           MMDSSlaveRequest::OP_RENAMENOTIFY);
+       mds->send_message_mds(notify, *p);
+       mdr->more()->waiting_on_slave.insert(*p);
       }
     }