diff options
author | Sage Weil <sage@newdream.net> | 2009-11-23 15:43:36 -0800 |
---|---|---|
committer | Sage Weil <sage@newdream.net> | 2009-11-24 19:02:06 -0800 |
commit | cd6f38171034ad14384f74ea12df7a471da98f1b (patch) | |
tree | cb8b7f3230772dfbefd8384eea4b26f4db4d8aa1 | |
parent | fd21693fa6b8bf33fc214248730610a8b9730c97 (diff) | |
download | ceph-cd6f38171034ad14384f74ea12df7a471da98f1b.tar.gz |
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.
-rw-r--r-- | src/mds/MDSTableServer.cc | 4 | ||||
-rw-r--r-- | src/mds/MDSTableServer.h | 10 | ||||
-rw-r--r-- | 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 999df03cb0a..db085519bbe 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 c7de09a26f8..cc2023ddd9d 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 8107cd32056..b5caed12a49 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); |