From cd6f38171034ad14384f74ea12df7a471da98f1b Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Mon, 23 Nov 2009 15:43:36 -0800 Subject: [PATCH] mds: update pending_for_mds during table server replay Otherwise we our replay of AGREE after recovery is wrong; we just replay what was saved, without taking additional journaled items into account. --- src/mds/MDSTableServer.cc | 4 ---- src/mds/MDSTableServer.h | 10 ++++++++++ src/mds/journal.cc | 2 ++ 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/src/mds/MDSTableServer.cc b/src/mds/MDSTableServer.cc index 999df03cb0af6..db085519bbe04 100644 --- a/src/mds/MDSTableServer.cc +++ b/src/mds/MDSTableServer.cc @@ -46,9 +46,6 @@ void MDSTableServer::handle_prepare(MMDSTableRequest *req) bufferlist bl = req->bl; _prepare(req->bl, req->reqid, from); - pending_for_mds[version].mds = from; - pending_for_mds[version].reqid = req->reqid; - pending_for_mds[version].tid = version; ETableServer *le = new ETableServer(table, TABLESERVER_OP_PREPARE, req->reqid, from, version, version); le->mutation = bl; // original request, NOT modified return value coming out of _prepare! @@ -76,7 +73,6 @@ void MDSTableServer::handle_commit(MMDSTableRequest *req) if (pending_for_mds.count(tid)) { _commit(tid); - pending_for_mds.erase(tid); mds->mdlog->submit_entry(new ETableServer(table, TABLESERVER_OP_COMMIT, 0, -1, tid, version)); mds->mdlog->wait_for_sync(new C_Commit(this, req)); } diff --git a/src/mds/MDSTableServer.h b/src/mds/MDSTableServer.h index c7de09a26f8e8..cc2023ddd9d30 100644 --- a/src/mds/MDSTableServer.h +++ b/src/mds/MDSTableServer.h @@ -78,6 +78,16 @@ private: virtual void _rollback(version_t tid) = 0; virtual void _server_update(bufferlist& bl) { assert(0); } + void _note_prepare(int mds, __u64 reqid) { + pending_for_mds[version].mds = mds; + pending_for_mds[version].reqid = reqid; + pending_for_mds[version].tid = version; + } + void _note_commit(__u64 tid) { + pending_for_mds.erase(tid); + } + + MDSTableServer(MDS *m, int tab) : MDSTable(m, get_mdstable_name(tab), false), table(tab) {} virtual ~MDSTableServer() {} diff --git a/src/mds/journal.cc b/src/mds/journal.cc index 8107cd32056c4..b5caed12a490a 100644 --- a/src/mds/journal.cc +++ b/src/mds/journal.cc @@ -779,9 +779,11 @@ void ETableServer::replay(MDS *mds) switch (op) { case TABLESERVER_OP_PREPARE: server->_prepare(mutation, reqid, bymds); + server->_note_prepare(bymds, reqid); break; case TABLESERVER_OP_COMMIT: server->_commit(tid); + server->_note_commit(tid); break; case TABLESERVER_OP_SERVER_UPDATE: server->_server_update(mutation); -- 2.39.5