From 50ab924a27e25936467683d0d5a70ef8c2fddcde Mon Sep 17 00:00:00 2001 From: Greg Farnum Date: Thu, 31 Jan 2013 11:36:30 -0800 Subject: [PATCH] mds: MDSMap now uses modern encoding Signed-off-by: Greg Farnum --- src/mds/MDSMap.cc | 112 ++++++++++++++++++++++++++------------ src/mds/MDSMap.h | 2 + src/test/encoding/types.h | 3 + 3 files changed, 83 insertions(+), 34 deletions(-) diff --git a/src/mds/MDSMap.cc b/src/mds/MDSMap.cc index 5406b21209238..08e1a554d2553 100644 --- a/src/mds/MDSMap.cc +++ b/src/mds/MDSMap.cc @@ -14,7 +14,6 @@ #include "MDSMap.h" -#include "include/ceph_features.h" #include using std::stringstream; @@ -117,6 +116,22 @@ void MDSMap::dump(Formatter *f) const f->dump_int("metadata_pool", metadata_pool); } +void MDSMap::generate_test_instances(list& ls) +{ + MDSMap *m = new MDSMap(); + m->max_mds = 1; + m->data_pools.insert(0); + m->metadata_pool = 1; + m->cas_pool = 2; + m->compat = get_mdsmap_compat_set(); + + // these aren't the defaults, just in case anybody gets confused + m->session_timeout = 61; + m->session_autoclose = 301; + m->max_file_size = 1<<24; + ls.push_back(m); +} + void MDSMap::print(ostream& out) { out << "epoch\t" << epoch << "\n"; @@ -314,42 +329,70 @@ void MDSMap::encode(bufferlist& bl, uint64_t features) const int32_t m = cas_pool; ::encode(m, bl); return; + } else if ((features & CEPH_FEATURE_MDSENC) == 0) { + __u16 v = 3; + ::encode(v, bl); + ::encode(epoch, bl); + ::encode(flags, bl); + ::encode(last_failure, bl); + ::encode(root, bl); + ::encode(session_timeout, bl); + ::encode(session_autoclose, bl); + ::encode(max_file_size, bl); + ::encode(max_mds, bl); + ::encode(mds_info, bl); + ::encode(data_pools, bl); + ::encode(cas_pool, bl); + + // kclient ignores everything from here + __u16 ev = 5; + ::encode(ev, bl); + ::encode(compat, bl); + ::encode(metadata_pool, bl); + ::encode(created, bl); + ::encode(modified, bl); + ::encode(tableserver, bl); + ::encode(in, bl); + ::encode(inc, bl); + ::encode(up, bl); + ::encode(failed, bl); + ::encode(stopped, bl); + ::encode(last_failure_osd_epoch, bl); + } else {// have MDS encoding feature! + ENCODE_START(4, 4, bl); + ::encode(epoch, bl); + ::encode(flags, bl); + ::encode(last_failure, bl); + ::encode(root, bl); + ::encode(session_timeout, bl); + ::encode(session_autoclose, bl); + ::encode(max_file_size, bl); + ::encode(max_mds, bl); + ::encode(mds_info, bl); + ::encode(data_pools, bl); + ::encode(cas_pool, bl); + + // kclient ignores everything from here + __u16 ev = 5; + ::encode(ev, bl); + ::encode(compat, bl); + ::encode(metadata_pool, bl); + ::encode(created, bl); + ::encode(modified, bl); + ::encode(tableserver, bl); + ::encode(in, bl); + ::encode(inc, bl); + ::encode(up, bl); + ::encode(failed, bl); + ::encode(stopped, bl); + ::encode(last_failure_osd_epoch, bl); + ENCODE_FINISH(bl); } - - __u16 v = 3; - ::encode(v, bl); - ::encode(epoch, bl); - ::encode(flags, bl); - ::encode(last_failure, bl); - ::encode(root, bl); - ::encode(session_timeout, bl); - ::encode(session_autoclose, bl); - ::encode(max_file_size, bl); - ::encode(max_mds, bl); - ::encode(mds_info, bl); - ::encode(data_pools, bl); - ::encode(cas_pool, bl); - - // kclient ignores everything from here - __u16 ev = 5; - ::encode(ev, bl); - ::encode(compat, bl); - ::encode(metadata_pool, bl); - ::encode(created, bl); - ::encode(modified, bl); - ::encode(tableserver, bl); - ::encode(in, bl); - ::encode(inc, bl); - ::encode(up, bl); - ::encode(failed, bl); - ::encode(stopped, bl); - ::encode(last_failure_osd_epoch, bl); } void MDSMap::decode(bufferlist::iterator& p) { - __u16 v; - ::decode(v, p); + DECODE_START_LEGACY_COMPAT_LEN_16(4, 4, 4, p); ::decode(epoch, p); ::decode(flags, p); ::decode(last_failure, p); @@ -359,7 +402,7 @@ void MDSMap::decode(bufferlist::iterator& p) ::decode(max_file_size, p); ::decode(max_mds, p); ::decode(mds_info, p); - if (v < 3) { + if (struct_v < 3) { __u32 n; ::decode(n, p); while (n--) { @@ -377,7 +420,7 @@ void MDSMap::decode(bufferlist::iterator& p) // kclient ignores everything from here __u16 ev = 1; - if (v >= 2) + if (struct_v >= 2) ::decode(ev, p); if (ev >= 3) ::decode(compat, p); @@ -400,4 +443,5 @@ void MDSMap::decode(bufferlist::iterator& p) ::decode(stopped, p); if (ev >= 4) ::decode(last_failure_osd_epoch, p); + DECODE_FINISH(p); } diff --git a/src/mds/MDSMap.h b/src/mds/MDSMap.h index a683df641a6da..2a5ee888169c5 100644 --- a/src/mds/MDSMap.h +++ b/src/mds/MDSMap.h @@ -30,6 +30,7 @@ using namespace std; #include "common/config.h" #include "include/CompatSet.h" +#include "include/ceph_features.h" #include "common/Formatter.h" /* @@ -487,6 +488,7 @@ public: void print_summary(ostream& out); void dump(Formatter *f) const; + static void generate_test_instances(list& ls); }; WRITE_CLASS_ENCODER(MDSMap::mds_info_t) WRITE_CLASS_ENCODER_FEATURES(MDSMap) diff --git a/src/test/encoding/types.h b/src/test/encoding/types.h index a2fa626e7c351..c36da829a34cd 100644 --- a/src/test/encoding/types.h +++ b/src/test/encoding/types.h @@ -109,6 +109,9 @@ TYPE(string_snap_t) TYPE(MDSCacheObjectInfo) TYPE(mds_table_pending_t) +#include "mds/MDSMap.h" +TYPE_FEATUREFUL(MDSMap) + #ifdef WITH_RADOSGW #include "rgw/rgw_rados.h" -- 2.39.5