From: Colin Patrick McCabe Date: Mon, 12 Sep 2011 18:32:03 +0000 (-0700) Subject: Remove global ctors/dtors for CompatSet X-Git-Tag: v0.35~30 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=e84996de696f911f68d49179afaf9e2b93842d50;p=ceph.git Remove global ctors/dtors for CompatSet Instead of having global CompatSet objects, just have functions that can return appropriate CompatSet objects. This avoids global constructor and destructor ordering issues. Fixes bug #1512 Signed-off-by: Colin McCabe --- diff --git a/src/cmon.cc b/src/cmon.cc index c8b2e767f18..9e7f5803ce6 100644 --- a/src/cmon.cc +++ b/src/cmon.cc @@ -35,9 +35,7 @@ using namespace std; #include "common/Timer.h" #include "global/global_init.h" -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[]; +extern CompatSet get_ceph_mon_feature_compat_set(); void usage() { @@ -132,9 +130,7 @@ int main(int argc, const char **argv) return 0; } - CompatSet mon_features(ceph_mon_feature_compat, - ceph_mon_feature_ro_compat, - ceph_mon_feature_incompat); + CompatSet mon_features = get_ceph_mon_feature_compat_set(); CompatSet ondisk_features; MonitorStore store(g_conf->mon_data); @@ -165,9 +161,7 @@ int main(int argc, const char **argv) //we only want the baseline ~v.18 features assumed to be on disk. //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); + ondisk_features = get_ceph_mon_feature_compat_set(); } else { bufferlist::iterator it = features.begin(); ondisk_features.decode(it); diff --git a/src/include/CompatSet.h b/src/include/CompatSet.h index 014d231d8ed..70663abd9b0 100644 --- a/src/include/CompatSet.h +++ b/src/include/CompatSet.h @@ -19,8 +19,6 @@ #include "common/Formatter.h" -#define END_FEATURE CompatSet::Feature(0, "") - struct CompatSet { struct Feature { @@ -77,17 +75,6 @@ struct CompatSet { CompatSet(FeatureSet& _compat, FeatureSet& _ro_compat, FeatureSet& _incompat) : compat(_compat), ro_compat(_ro_compat), incompat(_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]); - for (int j = 0; _ro_compat[j].id != 0; ++j) - ro_compat.insert(_ro_compat[j]); - for (int k = 0; _incompat[k].id != 0; ++k) - incompat.insert(_incompat[k]); - } - CompatSet() : compat(), ro_compat(), incompat() { } diff --git a/src/mds/MDS.cc b/src/mds/MDS.cc index f2f4cdaa339..ea1c3ff8fcf 100644 --- a/src/mds/MDS.cc +++ b/src/mds/MDS.cc @@ -617,6 +617,7 @@ void MDS::beacon_send() beacon->set_standby_for_name(standby_for_name); // include _my_ feature set + CompatSet mdsmap_compat(get_mdsmap_compat_set()); beacon->set_compat(mdsmap_compat); monc->send_mon_message(beacon); @@ -848,6 +849,7 @@ void MDS::handle_mds_map(MMDSMap *m) monc->sub_got("mdsmap", mdsmap->get_epoch()); // verify compatset + CompatSet mdsmap_compat(get_mdsmap_compat_set()); dout(10) << " my compat " << mdsmap_compat << dendl; dout(10) << " mdsmap compat " << mdsmap->compat << dendl; if (!mdsmap_compat.writeable(mdsmap->compat)) { diff --git a/src/mds/MDSMap.cc b/src/mds/MDSMap.cc index b6b7f6929f3..c3f08c43cff 100644 --- a/src/mds/MDSMap.cc +++ b/src/mds/MDSMap.cc @@ -20,41 +20,27 @@ using std::stringstream; // features - -const struct CompatSet::Feature feature_compat[] = { - END_FEATURE -}; -const struct CompatSet::Feature feature_incompat[] = { - MDS_FEATURE_INCOMPAT_BASE, - MDS_FEATURE_INCOMPAT_CLIENTRANGES, - MDS_FEATURE_INCOMPAT_FILELAYOUT, - MDS_FEATURE_INCOMPAT_DIRINODE, - END_FEATURE -}; -const struct CompatSet::Feature feature_ro_compat[] = { - END_FEATURE -}; - -CompatSet mdsmap_compat(feature_compat, - feature_ro_compat, - feature_incompat); +CompatSet get_mdsmap_compat_set() { + CompatSet::FeatureSet feature_compat; + CompatSet::FeatureSet feature_incompat; + feature_incompat.insert(MDS_FEATURE_INCOMPAT_BASE); + feature_incompat.insert(MDS_FEATURE_INCOMPAT_CLIENTRANGES); + feature_incompat.insert(MDS_FEATURE_INCOMPAT_FILELAYOUT); + feature_incompat.insert(MDS_FEATURE_INCOMPAT_DIRINODE); + CompatSet::FeatureSet feature_ro_compat; + + return CompatSet(feature_compat, feature_incompat, feature_ro_compat); +} // base (pre v0.20) -const struct CompatSet::Feature feature_compat_base[] = { - END_FEATURE -}; -const struct CompatSet::Feature feature_incompat_base[] = { - MDS_FEATURE_INCOMPAT_BASE, - END_FEATURE -}; -const struct CompatSet::Feature feature_ro_compat_base[] = { - END_FEATURE -}; - -CompatSet mdsmap_compat_base(feature_compat_base, - feature_ro_compat_base, - feature_incompat_base); +CompatSet get_mdsmap_compat_set_base() { + CompatSet::FeatureSet feature_compat_base; + CompatSet::FeatureSet feature_incompat_base; + feature_incompat_base.insert(MDS_FEATURE_INCOMPAT_BASE); + CompatSet::FeatureSet feature_ro_compat_base; + return CompatSet(feature_compat_base, feature_incompat_base, feature_ro_compat_base); +} void MDSMap::mds_info_t::dump(Formatter *f) const { diff --git a/src/mds/MDSMap.h b/src/mds/MDSMap.h index a9c71703992..00a46e85ee7 100644 --- a/src/mds/MDSMap.h +++ b/src/mds/MDSMap.h @@ -58,8 +58,8 @@ using namespace std; class md_config_t; class CephContext; -extern CompatSet mdsmap_compat; -extern CompatSet mdsmap_compat_base; // pre v0.20 +extern CompatSet get_mdsmap_compat_set(); +extern CompatSet get_mdsmap_compat_set_base(); // pre v0.20 #define MDS_FEATURE_INCOMPAT_BASE CompatSet::Feature(1, "base v0.20") #define MDS_FEATURE_INCOMPAT_CLIENTRANGES CompatSet::Feature(2, "client writeable ranges") @@ -580,7 +580,7 @@ public: if (ev >= 3) ::decode(compat, p); else - compat = mdsmap_compat_base; + compat = get_mdsmap_compat_set_base(); if (ev < 5) { __u32 n; ::decode(n, p); diff --git a/src/messages/MMDSBeacon.h b/src/messages/MMDSBeacon.h index cc338b75917..62268bcaa77 100644 --- a/src/messages/MMDSBeacon.h +++ b/src/messages/MMDSBeacon.h @@ -54,7 +54,7 @@ public: const string& get_standby_for_name() { return standby_for_name; } CompatSet& get_compat() { return compat; } - void set_compat(CompatSet& c) { compat = c; } + void set_compat(const CompatSet& c) { compat = c; } void set_standby_for_rank(int r) { standby_for_rank = r; } void set_standby_for_name(string& n) { standby_for_name = n; } diff --git a/src/mon/MDSMonitor.cc b/src/mon/MDSMonitor.cc index 09e07b96f24..2817fea026b 100644 --- a/src/mon/MDSMonitor.cc +++ b/src/mon/MDSMonitor.cc @@ -62,7 +62,7 @@ void MDSMonitor::create_new_fs(MDSMap &m, int metadata_pool, int data_pool) m.data_pg_pools.push_back(data_pool); m.metadata_pg_pool = metadata_pool; m.cas_pg_pool = -1; - m.compat = mdsmap_compat; + m.compat = get_mdsmap_compat_set(); print_map(m); } diff --git a/src/mon/Monitor.cc b/src/mon/Monitor.cc index ac7eeafadb4..b895c2b2a26 100644 --- a/src/mon/Monitor.cc +++ b/src/mon/Monitor.cc @@ -82,12 +82,15 @@ static ostream& _prefix(std::ostream *_dout, Monitor *mon) { << " "; } -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, "")}; +CompatSet get_ceph_mon_feature_compat_set() +{ + CompatSet::FeatureSet ceph_mon_feature_compat; + CompatSet::FeatureSet ceph_mon_feature_ro_compat; + CompatSet::FeatureSet ceph_mon_feature_incompat; + ceph_mon_feature_incompat.insert(CEPH_MON_FEATURE_INCOMPAT_BASE); + return CompatSet(ceph_mon_feature_compat, ceph_mon_feature_ro_compat, + ceph_mon_feature_incompat); +} #ifdef ENABLE_COVERAGE void handle_signal(int signal) @@ -1097,9 +1100,7 @@ int Monitor::mkfs(bufferlist& osdmapbl) } bufferlist features; - CompatSet mon_features(ceph_mon_feature_compat, - ceph_mon_feature_ro_compat, - ceph_mon_feature_incompat); + CompatSet mon_features = get_ceph_mon_feature_compat_set(); mon_features.encode(features); store->put_bl_ss(features, COMPAT_SET_LOC, 0); diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc index 55287a468d6..da32a4e2e87 100644 --- a/src/osd/OSD.cc +++ b/src/osd/OSD.cc @@ -113,22 +113,18 @@ static ostream& _prefix(std::ostream* _dout, int whoami, OSDMap *osdmap) { const coll_t coll_t::META_COLL("meta"); const coll_t coll_t::TEMP_COLL("temp"); -const struct CompatSet::Feature ceph_osd_feature_compat[] = { - END_FEATURE -}; -const struct CompatSet::Feature ceph_osd_feature_incompat[] = { - CEPH_OSD_FEATURE_INCOMPAT_BASE, - CEPH_OSD_FEATURE_INCOMPAT_PGINFO, - CEPH_OSD_FEATURE_INCOMPAT_OLOC, - CEPH_OSD_FEATURE_INCOMPAT_LEC, - CEPH_OSD_FEATURE_INCOMPAT_CATEGORIES, // stat categories - END_FEATURE -}; -const struct CompatSet::Feature ceph_osd_feature_ro_compat[] = { - END_FEATURE -}; - - +static CompatSet get_osd_compat_set() { + CompatSet::FeatureSet ceph_osd_feature_compat; + CompatSet::FeatureSet ceph_osd_feature_incompat; + ceph_osd_feature_incompat.insert(CEPH_OSD_FEATURE_INCOMPAT_BASE); + ceph_osd_feature_incompat.insert(CEPH_OSD_FEATURE_INCOMPAT_PGINFO); + ceph_osd_feature_incompat.insert(CEPH_OSD_FEATURE_INCOMPAT_OLOC); + ceph_osd_feature_incompat.insert(CEPH_OSD_FEATURE_INCOMPAT_LEC); + ceph_osd_feature_incompat.insert(CEPH_OSD_FEATURE_INCOMPAT_CATEGORIES); + CompatSet::FeatureSet ceph_osd_feature_ro_compat; + return CompatSet(ceph_osd_feature_compat, ceph_osd_feature_incompat, + ceph_osd_feature_ro_compat); +} ObjectStore *OSD::create_object_store(const std::string &dev, const std::string &jdev) { @@ -521,9 +517,7 @@ OSD::OSD(int id, Messenger *internal_messenger, Messenger *external_messenger, whoami(id), dev_path(dev), journal_path(jdev), dispatch_running(false), - osd_compat(ceph_osd_feature_compat, - ceph_osd_feature_ro_compat, - ceph_osd_feature_incompat), + osd_compat(get_osd_compat_set()), state(STATE_BOOTING), boot_epoch(0), up_epoch(0), op_tp(external_messenger->cct, "OSD::op_tp", g_conf->osd_op_threads), recovery_tp(external_messenger->cct, "OSD::recovery_tp", g_conf->osd_recovery_threads),