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<cap_reconnect_t*>& ls)
+{
+ ls.push_back(new cap_reconnect_t);
+ ls.back()->path = "/test/path";
+ ls.back()->capinfo.cap_id = 1;
+}
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<cap_reconnect_t*>& ls);
};
WRITE_CLASS_ENCODER(cap_reconnect_t)
class MClientReconnect : public Message {
- const static int HEAD_VERSION = 2;
+ const static int HEAD_VERSION = 3;
public:
map<inodeno_t, cap_reconnect_t> caps; // only head inodes
}
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<inodeno_t,cap_reconnect_t>::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;
}
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<inodeno_t, old_cap_reconnect_t> ocaps;
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)