summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSage Weil <sage@newdream.net>2009-11-23 15:43:36 -0800
committerSage Weil <sage@newdream.net>2009-11-24 19:02:06 -0800
commitcd6f38171034ad14384f74ea12df7a471da98f1b (patch)
treecb8b7f3230772dfbefd8384eea4b26f4db4d8aa1
parentfd21693fa6b8bf33fc214248730610a8b9730c97 (diff)
downloadceph-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.cc4
-rw-r--r--src/mds/MDSTableServer.h10
-rw-r--r--src/mds/journal.cc2
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);