From: Yan, Zheng Date: Fri, 30 Nov 2012 01:46:31 +0000 (+0800) Subject: mds: compare sessionmap version before replaying imported sessions X-Git-Tag: v0.57~281^2~2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=a1485f959d10448224a2e79ea850fb5d56a486c3;p=ceph.git mds: compare sessionmap version before replaying imported sessions Otherwise we may wrongly increase mds->sessionmap.version, which will confuse future journal replays that involving sessionmap. Signed-off-by: Yan, Zheng --- diff --git a/src/mds/Server.cc b/src/mds/Server.cc index 02a717af61644..d59d6924047b5 100644 --- a/src/mds/Server.cc +++ b/src/mds/Server.cc @@ -5463,6 +5463,8 @@ void Server::handle_client_rename(MDRequest *mdr) } _rename_prepare(mdr, &le->metablob, &le->client_map, srcdn, destdn, straydn); + if (le->client_map.length()) + le->cmapv = mds->sessionmap.projected; // -- commit locally -- C_MDS_rename_finish *fin = new C_MDS_rename_finish(mds, mdr, srcdn, destdn, straydn); diff --git a/src/mds/events/EUpdate.h b/src/mds/events/EUpdate.h index 6ce18fea591fb..a302a5a2b6f74 100644 --- a/src/mds/events/EUpdate.h +++ b/src/mds/events/EUpdate.h @@ -23,13 +23,14 @@ public: EMetaBlob metablob; string type; bufferlist client_map; + version_t cmapv; metareqid_t reqid; bool had_slaves; EUpdate() : LogEvent(EVENT_UPDATE) { } EUpdate(MDLog *mdlog, const char *s) : LogEvent(EVENT_UPDATE), metablob(mdlog), - type(s), had_slaves(false) { } + type(s), cmapv(0), had_slaves(false) { } void print(ostream& out) { if (type.length()) @@ -38,12 +39,13 @@ public: } void encode(bufferlist &bl) const { - __u8 struct_v = 2; + __u8 struct_v = 3; ::encode(struct_v, bl); ::encode(stamp, bl); ::encode(type, bl); ::encode(metablob, bl); ::encode(client_map, bl); + ::encode(cmapv, bl); ::encode(reqid, bl); ::encode(had_slaves, bl); } @@ -55,6 +57,8 @@ public: ::decode(type, bl); ::decode(metablob, bl); ::decode(client_map, bl); + if (struct_v >= 3) + ::decode(cmapv, bl); ::decode(reqid, bl); ::decode(had_slaves, bl); } diff --git a/src/mds/journal.cc b/src/mds/journal.cc index 46adbf2bac9eb..b25096c994d47 100644 --- a/src/mds/journal.cc +++ b/src/mds/journal.cc @@ -996,14 +996,24 @@ void EUpdate::replay(MDS *mds) mds->mdcache->add_uncommitted_master(reqid, _segment, slaves); } - // open client sessions? - map cm; - map seqm; if (client_map.length()) { - bufferlist::iterator blp = client_map.begin(); - ::decode(cm, blp); - mds->server->prepare_force_open_sessions(cm, seqm); - mds->server->finish_force_open_sessions(cm, seqm); + if (mds->sessionmap.version >= cmapv) { + dout(10) << "EUpdate.replay sessionmap v " << cmapv + << " <= table " << mds->sessionmap.version << dendl; + } else { + dout(10) << "EUpdate.replay sessionmap " << mds->sessionmap.version + << " < " << cmapv << dendl; + // open client sessions? + map cm; + map seqm; + bufferlist::iterator blp = client_map.begin(); + ::decode(cm, blp); + mds->server->prepare_force_open_sessions(cm, seqm); + mds->server->finish_force_open_sessions(cm, seqm); + + assert(mds->sessionmap.version = cmapv); + mds->sessionmap.projected = mds->sessionmap.version; + } } }