[PATCH 06/39] mds: make table client/server tolerate duplicated message

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



From: "Yan, Zheng" <zheng.z.yan@xxxxxxxxx>

Anchor client re-sends queries when the anchor server becomes active.
So it's possible to get duplicated query reply.

When the table server recovers, the clients re-send commits to the
server, the server re-sends 'agree' messages to the clients. When
the clients receive the 'agree' messages, they may send another
commit/rollback message to the server.

Signed-off-by: Yan, Zheng <zheng.z.yan@xxxxxxxxx>
---
 src/mds/AnchorClient.cc   |  4 +++-
 src/mds/AnchorServer.cc   |  6 ++++--
 src/mds/MDSTableServer.cc | 22 ++++++++++++++++------
 3 files changed, 23 insertions(+), 9 deletions(-)

diff --git a/src/mds/AnchorClient.cc b/src/mds/AnchorClient.cc
index d7da9d1..bcc8710 100644
--- a/src/mds/AnchorClient.cc
+++ b/src/mds/AnchorClient.cc
@@ -41,7 +41,9 @@ void AnchorClient::handle_query_result(class MMDSTableRequest *m)
   ::decode(ino, p);
   ::decode(trace, p);
 
-  assert(pending_lookup.count(ino));
+  if (!pending_lookup.count(ino))
+    return;
+
   list<_pending_lookup> ls;
   ls.swap(pending_lookup[ino]);
   pending_lookup.erase(ino);
diff --git a/src/mds/AnchorServer.cc b/src/mds/AnchorServer.cc
index 6f37e53..594bf7b 100644
--- a/src/mds/AnchorServer.cc
+++ b/src/mds/AnchorServer.cc
@@ -213,10 +213,12 @@ bool AnchorServer::check_pending(version_t tid, MMDSTableRequest *req, list<Cont
       ++p;
     }
     assert(p != pending.end());
-    assert(p->second == NULL);
     // not the earliest pending operation, wait if it's a commit
     if (req) {
-      p->second = new C_MDS_RetryMessage(mds, req);
+      if (p->second == NULL)
+	p->second = new C_MDS_RetryMessage(mds, req);
+      else
+	req->put(); // duplicated commit
       return false;
     }
   }
diff --git a/src/mds/MDSTableServer.cc b/src/mds/MDSTableServer.cc
index 07c7d26..730606f 100644
--- a/src/mds/MDSTableServer.cc
+++ b/src/mds/MDSTableServer.cc
@@ -120,15 +120,25 @@ void MDSTableServer::_commit_logged(MMDSTableRequest *req)
 void MDSTableServer::handle_rollback(MMDSTableRequest *req)
 {
   dout(7) << "handle_rollback " << *req << dendl;
-  _rollback(req->get_tid());
-  _note_rollback(req->get_tid());
-  mds->mdlog->start_submit_entry(new ETableServer(table, TABLESERVER_OP_ROLLBACK, 0, -1, 
-						  req->get_tid(), version));
+
+  version_t tid = req->get_tid();
+  if (pending_for_mds.count(tid)) {
+    _rollback(tid);
+    _note_rollback(tid);
+    mds->mdlog->start_submit_entry(new ETableServer(table, TABLESERVER_OP_ROLLBACK, 0, -1,
+	  tid, version));
+  } else if (tid <= version) {
+    dout(0) << "got rollback for tid " << tid << " <= " << version
+	    << ", already rollbacked or committed." << dendl;
+  }
+  else {
+    // wtf.
+    dout(0) << "got rollbacked for tid " << tid << " > " << version << dendl;
+    assert(tid <= version);
+  }
   req->put();
 }
 
-
-
 // SERVER UPDATE
 
 void MDSTableServer::do_server_update(bufferlist& bl)
-- 
1.7.11.7

--
To unsubscribe from this list: send the line "unsubscribe ceph-devel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [CEPH Users]     [Ceph Large]     [Information on CEPH]     [Linux BTRFS]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]
  Powered by Linux