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