From: Yan, Zheng Date: Wed, 22 Jun 2016 07:56:29 +0000 (+0800) Subject: mds: add 'follows' of first pending snapflush to cap reconnect message X-Git-Tag: ses5-milestone5~375^2~13 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=dd3963a878d4bb2fb5992278ccbc9f7633fb8786;p=ceph.git mds: add 'follows' of first pending snapflush to cap reconnect message This helps the recovering MDS to reconstruct the internal states that tracking pending snapflush. Signed-off-by: Yan, Zheng --- diff --git a/src/client/Client.cc b/src/client/Client.cc index e6b5e555c990..12d4b3ee2a2a 100644 --- a/src/client/Client.cc +++ b/src/client/Client.cc @@ -2644,19 +2644,25 @@ void Client::send_reconnect(MetaSession *session) cap->issue_seq = 0; // reset seq. cap->mseq = 0; // reset seq. cap->issued = cap->implemented; + + snapid_t snap_follows = 0; + if (!in->cap_snaps.empty()) + snap_follows = in->cap_snaps.begin()->first; + m->add_cap(p->first.ino, cap->cap_id, path.get_ino(), path.get_path(), // ino in->caps_wanted(), // wanted cap->issued, // issued in->snaprealm->ino, + snap_follows, flockbl); if (did_snaprealm.count(in->snaprealm->ino) == 0) { ldout(cct, 10) << " snaprealm " << *in->snaprealm << dendl; m->add_snaprealm(in->snaprealm->ino, in->snaprealm->seq, in->snaprealm->parent); did_snaprealm.insert(in->snaprealm->ino); - } + } } } diff --git a/src/mds/mdstypes.cc b/src/mds/mdstypes.cc index 2cc04e043972..1428af65f0f8 100644 --- a/src/mds/mdstypes.cc +++ b/src/mds/mdstypes.cc @@ -996,8 +996,9 @@ void mds_load_t::generate_test_instances(list& ls) * cap_reconnect_t */ void cap_reconnect_t::encode(bufferlist& bl) const { - ENCODE_START(1, 1, bl); + ENCODE_START(2, 1, bl); encode_old(bl); // extract out when something changes + ::encode(snap_follows, bl); ENCODE_FINISH(bl); } @@ -1011,6 +1012,8 @@ void cap_reconnect_t::encode_old(bufferlist& bl) const { void cap_reconnect_t::decode(bufferlist::iterator& bl) { DECODE_START(1, bl); decode_old(bl); // extract out when something changes + if (struct_v >= 2) + ::decode(snap_follows, bl); DECODE_FINISH(bl); } diff --git a/src/mds/mdstypes.h b/src/mds/mdstypes.h index c69a655bf85a..7039e6c05c08 100644 --- a/src/mds/mdstypes.h +++ b/src/mds/mdstypes.h @@ -888,13 +888,15 @@ namespace std { struct cap_reconnect_t { string path; mutable ceph_mds_cap_reconnect capinfo; + snapid_t snap_follows; bufferlist flockbl; cap_reconnect_t() { memset(&capinfo, 0, sizeof(capinfo)); + snap_follows = 0; } cap_reconnect_t(uint64_t cap_id, inodeno_t pino, const string& p, int w, int i, - inodeno_t sr, bufferlist& lb) : + inodeno_t sr, snapid_t sf, bufferlist& lb) : path(p) { capinfo.cap_id = cap_id; capinfo.wanted = w; @@ -902,6 +904,7 @@ struct cap_reconnect_t { capinfo.snaprealm = sr; capinfo.pathbase = pino; capinfo.flock_len = 0; + snap_follows = sf; flockbl.claim(lb); } void encode(bufferlist& bl) const; diff --git a/src/messages/MClientReconnect.h b/src/messages/MClientReconnect.h index 8a9ff42f4a1c..bfb80699d141 100644 --- a/src/messages/MClientReconnect.h +++ b/src/messages/MClientReconnect.h @@ -40,9 +40,9 @@ public: } void add_cap(inodeno_t ino, uint64_t cap_id, inodeno_t pathbase, const string& path, - int wanted, int issued, inodeno_t sr, bufferlist& lb) + int wanted, int issued, inodeno_t sr, snapid_t sf, bufferlist& lb) { - caps[ino] = cap_reconnect_t(cap_id, pathbase, path, wanted, issued, sr, lb); + caps[ino] = cap_reconnect_t(cap_id, pathbase, path, wanted, issued, sr, sf, lb); } void add_snaprealm(inodeno_t ino, snapid_t seq, inodeno_t parent) { ceph_mds_snaprealm_reconnect r;