From 818c73ea2ff5ea37607bb63ef53f2e140ae33fb0 Mon Sep 17 00:00:00 2001 From: Greg Farnum Date: Tue, 19 Jan 2010 12:24:31 -0800 Subject: [PATCH] Change CompatSet usage to be compatible with new struct --- src/cmon.cc | 28 +++++++++++----------------- src/include/CompatSet.h | 6 +++++- src/mds/MDS.cc | 3 --- src/mon/Monitor.cc | 16 ++++++++-------- src/mon/Monitor.h | 11 ++++------- src/osd/OSD.cc | 31 ++++++++++++++++++------------- src/osd/OSD.h | 10 +++------- src/osd/osd_types.h | 4 ++-- 8 files changed, 51 insertions(+), 58 deletions(-) diff --git a/src/cmon.cc b/src/cmon.cc index 5c35cf81ef8da..9c49a423ac173 100644 --- a/src/cmon.cc +++ b/src/cmon.cc @@ -35,12 +35,9 @@ using namespace std; #include "common/Timer.h" #include "common/common_init.h" -extern const int ceph_mon_feature_compat_size; -extern const char *ceph_mon_feature_compat[]; -extern const int ceph_mon_feature_ro_compat_size; -extern const char *ceph_mon_feature_ro_compat[]; -extern const int ceph_mon_feature_incompat_size; -extern const char *ceph_mon_feature_incompat[]; +extern const CompatSet::Feature ceph_mon_feature_compat[]; +extern const CompatSet::Feature ceph_mon_feature_ro_compat[]; +extern const CompatSet::Feature ceph_mon_feature_incompat[]; void usage() { @@ -74,11 +71,9 @@ int main(int argc, const char **argv) if (g_conf.clock_tare) g_clock.tare(); - CompatSet mon_features(ceph_mon_feature_compat, ceph_mon_feature_compat_size, + CompatSet mon_features(ceph_mon_feature_compat, ceph_mon_feature_ro_compat, - ceph_mon_feature_ro_compat_size, - ceph_mon_feature_incompat, - ceph_mon_feature_incompat_size); + ceph_mon_feature_incompat); CompatSet ondisk_features; MonitorStore store(g_conf.mon_data); @@ -114,10 +109,11 @@ int main(int argc, const char **argv) cerr << "WARNING: mon fs missing feature list.\n" << "Assuming it is old-style and introducing one." << std::endl; //we only want the baseline ~v.18 features assumed to be on disk. - //They'll be first in the incompat list. - ondisk_features = CompatSet(NULL, 0, NULL, 0, - ceph_mon_feature_incompat, - 1); + //If new features are introduced this code needs to disappear or + //be made smarter. + ondisk_features = CompatSet(ceph_mon_feature_compat, + ceph_mon_feature_ro_compat, + ceph_mon_feature_incompat); } else { bufferlist::iterator it = features.begin(); ondisk_features.decode(it); @@ -127,9 +123,7 @@ int main(int argc, const char **argv) cerr << "monitor executable cannot read disk! Missing features: " << std::endl; CompatSet diff = mon_features.unsupported(ondisk_features); - for (CompatSet::iterator iter = diff.begin(); iter != diff.end(); ++iter) { - cerr << *iter << std::endl; - } + //NEEDS_COMPATSET_ITER exit(1); } diff --git a/src/include/CompatSet.h b/src/include/CompatSet.h index 4555bbc0842c3..41e3b4ed93fdb 100644 --- a/src/include/CompatSet.h +++ b/src/include/CompatSet.h @@ -17,6 +17,8 @@ #include "include/buffer.h" #include +#define END_FEATURE CompatSet::Feature(0, "") + struct CompatSet { struct Feature { @@ -30,6 +32,8 @@ struct CompatSet { struct FeatureSet { __u64 mask; map <__u64,string> names; + + FeatureSet() : mask(0), names() {} void insert(Feature f) { mask |= f.id; names[f.id] = f.name; @@ -51,7 +55,7 @@ struct CompatSet { CompatSet(FeatureSet& _compat, FeatureSet& _ro_compat, FeatureSet& _incompat) : compat(_compat), ro_compat(_ro_compat), incompat(_incompat) {} - CompatSet(Feature _compat[], Feature _ro_compat[], Feature _incompat[]) : + CompatSet(const Feature _compat[], const Feature _ro_compat[], const Feature _incompat[]) : compat(), ro_compat(), incompat() { for (int i = 0; _compat[i].id != 0; ++i) compat.insert(_compat[i]); diff --git a/src/mds/MDS.cc b/src/mds/MDS.cc index 9ffe89ee43217..a8725353f1559 100644 --- a/src/mds/MDS.cc +++ b/src/mds/MDS.cc @@ -83,9 +83,6 @@ MDS::MDS(const char *n, Messenger *m, MonClient *mc) : timer(mds_lock), name(n), whoami(-1), incarnation(0), - mds_features(ceph_mds_feature_compat, ceph_mds_feature_compat_size, - ceph_mds_feature_ro_compat, ceph_mds_feature_ro_compat_size, - ceph_mds_feature_incompat, ceph_mds_feature_incompat_size), standby_for_rank(-1), standby_replay_for(-1), messenger(m), diff --git a/src/mon/Monitor.cc b/src/mon/Monitor.cc index d02131b6664e1..39e6bb9e3ba3c 100644 --- a/src/mon/Monitor.cc +++ b/src/mon/Monitor.cc @@ -72,10 +72,12 @@ static ostream& _prefix(Monitor *mon) { << " "; } -const char *ceph_mon_feature_compat[ceph_mon_feature_compat_size] = {}; -const char *ceph_mon_feature_ro_compat[ceph_mon_feature_ro_compat_size] = {}; -const char *ceph_mon_feature_incompat[ceph_mon_feature_incompat_size] = - { CEPH_MON_FEATURE_INCOMPAT_BASE }; +const CompatSet::Feature ceph_mon_feature_compat[] = + {END_FEATURE}; +const CompatSet::Feature ceph_mon_feature_ro_compat[] = + {END_FEATURE}; +const CompatSet::Feature ceph_mon_feature_incompat[] = + { CEPH_MON_FEATURE_INCOMPAT_BASE , CompatSet::Feature(0, "")}; Monitor::Monitor(int w, MonitorStore *s, Messenger *m, MonMap *map) : whoami(w), @@ -897,11 +899,9 @@ int Monitor::mkfs(bufferlist& osdmapbl) store->put_bl_ss(magicbl, "magic", 0); bufferlist features; - CompatSet mon_features(ceph_mon_feature_compat, ceph_mon_feature_compat_size, + CompatSet mon_features(ceph_mon_feature_compat, ceph_mon_feature_ro_compat, - ceph_mon_feature_ro_compat_size, - ceph_mon_feature_incompat, - ceph_mon_feature_incompat_size); + ceph_mon_feature_incompat); mon_features.encode(features); store->put_bl_ss(features, COMPAT_SET_LOC, 0); diff --git a/src/mon/Monitor.h b/src/mon/Monitor.h index a1a32f31677fe..d1201f769ff53 100644 --- a/src/mon/Monitor.h +++ b/src/mon/Monitor.h @@ -228,13 +228,10 @@ public: LogClient *get_logclient() { return &logclient; } }; -#define CEPH_MON_FEATURE_INCOMPAT_BASE "initial feature set (~v.18)" -static const int ceph_mon_feature_compat_size = 0; -static const int ceph_mon_feature_ro_compat_size = 0; -static const int ceph_mon_feature_incompat_size = 1; -extern const char *ceph_mon_feature_compat[]; -extern const char *ceph_mon_feature_ro_compat[]; -extern const char *ceph_mon_feature_incompat[]; +#define CEPH_MON_FEATURE_INCOMPAT_BASE CompatSet::Feature (1, "initial feature set (~v.18)") +extern const CompatSet::Feature ceph_mon_feature_compat[]; +extern const CompatSet::Feature ceph_mon_feature_ro_compat[]; +extern const CompatSet::Feature ceph_mon_feature_incompat[]; #endif diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc index 426ff479fdb0a..2e6ef3a6106f6 100644 --- a/src/osd/OSD.cc +++ b/src/osd/OSD.cc @@ -106,10 +106,17 @@ static ostream& _prefix(ostream& out, int whoami, OSDMap *osdmap) { const coll_t meta_coll; -const char *ceph_osd_feature_compat[ceph_osd_feature_compat_size] = {}; -const char *ceph_osd_feature_ro_compat[ceph_osd_feature_ro_compat_size] = {}; -const char *ceph_osd_feature_incompat[ceph_osd_feature_incompat_size] = - { CEPH_OSD_FEATURE_INCOMPAT_BASE }; + +const struct CompatSet::Feature ceph_osd_feature_compat[] = { + END_FEATURE +}; +const struct CompatSet::Feature ceph_osd_feature_incompat[] = { + CEPH_OSD_FEATURE_INCOMPAT_BASE, + END_FEATURE +}; +const struct CompatSet::Feature ceph_osd_feature_ro_compat[] = { + END_FEATURE +}; @@ -241,9 +248,9 @@ OSD::OSD(int id, Messenger *m, Messenger *hbm, MonClient *mc, const char *dev, c logclient(messenger, &mc->monmap), whoami(id), dev_path(dev), journal_path(jdev), - osd_compat(ceph_osd_feature_compat, ceph_osd_feature_compat_size, - ceph_osd_feature_ro_compat, ceph_osd_feature_ro_compat_size, - ceph_osd_feature_incompat, ceph_osd_feature_incompat_size), + osd_compat(ceph_osd_feature_compat, + ceph_osd_feature_ro_compat, + ceph_osd_feature_incompat), state(STATE_BOOTING), boot_epoch(0), up_epoch(0), op_tp("OSD::op_tp", g_conf.osd_op_threads), recovery_tp("OSD::recovery_tp", g_conf.osd_recovery_threads), @@ -584,7 +591,8 @@ void OSD::write_superblock(ObjectStore::Transaction& t) dout(10) << "write_superblock " << superblock << dendl; //hack: at minimum it's using the baseline feature set - if (!superblock.compat_features.incompat.count(CEPH_OSD_FEATURE_INCOMPAT_BASE)) + if (!superblock.compat_features.incompat.mask | + CEPH_OSD_FEATURE_INCOMPAT_BASE.id) superblock.compat_features.incompat.insert(CEPH_OSD_FEATURE_INCOMPAT_BASE); bufferlist bl; @@ -609,15 +617,12 @@ int OSD::read_superblock() if (osd_compat.writeable(superblock.compat_features)) { dout(5) << "it is still writeable, though. Missing features:" << dendl; CompatSet diff = osd_compat.unsupported(superblock.compat_features); - for (CompatSet::iterator i = diff.begin(); i != diff.end(); ++i) { - dout(5) << *i << dendl; - } + //NEEDS_ITER } else { dout(0) << "Cannot write to disk! Missing features:" << dendl; CompatSet diff = osd_compat.unsupported(superblock.compat_features); - for (CompatSet::iterator i = diff.begin(); i != diff.end(); ++i) - dout(0) << *i << dendl;; + //NEEDS_ITER return -EOPNOTSUPP; } } diff --git a/src/osd/OSD.h b/src/osd/OSD.h index c7edd8f6dd7d7..da0820220dceb 100644 --- a/src/osd/OSD.h +++ b/src/osd/OSD.h @@ -876,13 +876,9 @@ protected: }; //compatibility of the executable -#define CEPH_OSD_FEATURE_INCOMPAT_BASE "initial feature set(~v.18)" -extern const char *ceph_osd_feature_compat[]; -extern const char *ceph_osd_feature_ro_compat[]; -extern const char *ceph_osd_feature_incompat[]; -static const int ceph_osd_feature_compat_size = 0; -static const int ceph_osd_feature_ro_compat_size = 0; -static const int ceph_osd_feature_incompat_size = 1; +extern const CompatSet::Feature ceph_osd_feature_compat[]; +extern const CompatSet::Feature ceph_osd_feature_ro_compat[]; +extern const CompatSet::Feature ceph_osd_feature_incompat[]; #endif diff --git a/src/osd/osd_types.h b/src/osd/osd_types.h index 365874f73b73f..d333f97b0c477 100644 --- a/src/osd/osd_types.h +++ b/src/osd/osd_types.h @@ -29,8 +29,8 @@ #define CEPH_OSD_NEARFULL_RATIO .8 #define CEPH_OSD_FULL_RATIO .95 -//this #define copied from OSD.h -#define CEPH_OSD_FEATURE_INCOMPAT_BASE "initial feature set(~v.18)" + +#define CEPH_OSD_FEATURE_INCOMPAT_BASE CompatSet::Feature(1, "initial feature set(~v.18)") /* osdreqid_t - caller name + incarnation# + tid to unique identify this request -- 2.39.5