From: Greg Farnum Date: Thu, 31 Jan 2013 17:07:08 +0000 (-0800) Subject: mds: cap_reconnect_t uses modern encoding X-Git-Tag: v0.58~100^2~3 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=e7bc4b8d59de0e48843956e854f2784f5087c242;p=ceph.git mds: cap_reconnect_t uses modern encoding Signed-off-by: Greg Farnum --- diff --git a/src/mds/mdstypes.cc b/src/mds/mdstypes.cc index e9da4839982f..6b87c221e56d 100644 --- a/src/mds/mdstypes.cc +++ b/src/mds/mdstypes.cc @@ -844,3 +844,49 @@ void mds_load_t::generate_test_instances(list& ls) utime_t sample; ls.push_back(new mds_load_t(sample)); } + +/* + * cap_reconnect_t + */ +void cap_reconnect_t::encode(bufferlist& bl) const { + ENCODE_START(1, 1, bl); + encode_old(bl); // extract out when something changes + ENCODE_FINISH(bl); +} + +void cap_reconnect_t::encode_old(bufferlist& bl) const { + ::encode(path, bl); + capinfo.flock_len = flockbl.length(); + ::encode(capinfo, bl); + ::encode_nohead(flockbl, bl); +} + +void cap_reconnect_t::decode(bufferlist::iterator& bl) { + DECODE_START(1, bl); + decode_old(bl); // extract out when something changes + DECODE_FINISH(bl); +} + +void cap_reconnect_t::decode_old(bufferlist::iterator& bl) { + ::decode(path, bl); + ::decode(capinfo, bl); + ::decode_nohead(capinfo.flock_len, flockbl, bl); +} + +void cap_reconnect_t::dump(Formatter *f) const +{ + f->dump_string("path", path); + f->dump_int("cap_id", capinfo.cap_id); + f->dump_string("cap wanted", ccap_string(capinfo.wanted)); + f->dump_string("cap issued", ccap_string(capinfo.issued)); + f->dump_int("snaprealm", capinfo.snaprealm); + f->dump_int("path base ino", capinfo.pathbase); + f->dump_string("has file locks", capinfo.flock_len ? "true" : "false"); +} + +void cap_reconnect_t::generate_test_instances(list& ls) +{ + ls.push_back(new cap_reconnect_t); + ls.back()->path = "/test/path"; + ls.back()->capinfo.cap_id = 1; +} diff --git a/src/mds/mdstypes.h b/src/mds/mdstypes.h index ecb1ee95cbbe..8670663ae4b9 100644 --- a/src/mds/mdstypes.h +++ b/src/mds/mdstypes.h @@ -692,18 +692,13 @@ struct cap_reconnect_t { capinfo.pathbase = pino; capinfo.flock_len = 0; } + void encode(bufferlist& bl) const; + void decode(bufferlist::iterator& bl); + void encode_old(bufferlist& bl) const; + void decode_old(bufferlist::iterator& bl); - void encode(bufferlist& bl) const { - ::encode(path, bl); - capinfo.flock_len = flockbl.length(); - ::encode(capinfo, bl); - ::encode_nohead(flockbl, bl); - } - void decode(bufferlist::iterator& bl) { - ::decode(path, bl); - ::decode(capinfo, bl); - ::decode_nohead(capinfo.flock_len, flockbl, bl); - } + void dump(Formatter *f) const; + static void generate_test_instances(list& ls); }; WRITE_CLASS_ENCODER(cap_reconnect_t) diff --git a/src/messages/MClientReconnect.h b/src/messages/MClientReconnect.h index 400159c6db64..f7d6ac9897dd 100644 --- a/src/messages/MClientReconnect.h +++ b/src/messages/MClientReconnect.h @@ -22,7 +22,7 @@ class MClientReconnect : public Message { - const static int HEAD_VERSION = 2; + const static int HEAD_VERSION = 3; public: map caps; // only head inodes @@ -53,9 +53,17 @@ public: } void encode_payload(uint64_t features) { - if (features & CEPH_FEATURE_FLOCK) { - // new protocol + if (features & CEPH_FEATURE_MDSENC) { ::encode(caps, data); + } else if (features & CEPH_FEATURE_FLOCK) { + // encode with old cap_reconnect_t encoding + __u32 n = caps.size(); + ::encode(n, data); + for (map::iterator p = caps.begin(); p != caps.end(); ++p) { + ::encode(p->first, data); + p->second.encode_old(data); + } + header.version = 2; } else { // compat crap header.version = 1; @@ -68,9 +76,17 @@ public: } void decode_payload() { bufferlist::iterator p = data.begin(); - if (header.version >= 2) { + if (header.version >= 3) { // new protocol ::decode(caps, p); + } else if (header.version == 2) { + __u32 n; + ::decode(n, p); + inodeno_t ino; + while (n--) { + ::decode(ino, p); + caps[ino].decode_old(p); + } } else { // compat crap map ocaps; diff --git a/src/test/encoding/types.h b/src/test/encoding/types.h index 799231a39f01..0979542e8f41 100644 --- a/src/test/encoding/types.h +++ b/src/test/encoding/types.h @@ -115,6 +115,7 @@ TYPE(mds_table_pending_t) TYPE(inode_load_vec_t) TYPE(dirfrag_load_vec_t) TYPE(mds_load_t) +TYPE(cap_reconnect_t) #include "mds/MDSMap.h" TYPE_FEATUREFUL(MDSMap)