]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
Remove global ctors/dtors for CompatSet
authorColin Patrick McCabe <cmccabe@alumni.cmu.edu>
Mon, 12 Sep 2011 18:32:03 +0000 (11:32 -0700)
committerColin Patrick McCabe <cmccabe@alumni.cmu.edu>
Mon, 12 Sep 2011 18:38:10 +0000 (11:38 -0700)
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 <colin.mccabe@dreamhost.com>
src/cmon.cc
src/include/CompatSet.h
src/mds/MDS.cc
src/mds/MDSMap.cc
src/mds/MDSMap.h
src/messages/MMDSBeacon.h
src/mon/MDSMonitor.cc
src/mon/Monitor.cc
src/osd/OSD.cc

index c8b2e767f188044c6d70b75a604ffdbebcb6108e..9e7f5803ce675d4627790c1bf2077ed7b8a7f5f0 100644 (file)
@@ -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);
index 014d231d8eddd3dfd049532cf60cb1db411f6156..70663abd9b07b36d786b403bdf346b65ccd19a92 100644 (file)
@@ -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() { }
 
 
index f2f4cdaa339ab16fa1cd5bb02a87bdfa17ccd320..ea1c3ff8fcf15e3b4a5e4b3b38b48b07d830db0f 100644 (file)
@@ -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)) {
index b6b7f6929f3add82cb6dd7b0b4ccbf84baee8f50..c3f08c43cff870a5edf1bc02896d67ec0a92b2b5 100644 (file)
@@ -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
 {
index a9c71703992da7c37c9b010516f825f3ab61aab0..00a46e85ee78e44d344ee6f45cf6ab5f916a697b 100644 (file)
@@ -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);
index cc338b7591777b20b951f0ac70f04cc611fea706..62268bcaa77991eae1afd3cae13c0a52afa61d3f 100644 (file)
@@ -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; }
index 09e07b96f24bc131a8d38001d4590896f3d576ef..2817fea026b0bc4bb23eeee78aff295fd19f236f 100644 (file)
@@ -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);
 }
 
index ac7eeafadb4bcfde35f9863ad8fab0fd31d4eaa8..b895c2b2a2663d29dacb9f16ce0fabd84ed7ce07 100644 (file)
@@ -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);
 
index 55287a468d6bf91ead7c487a2482fbb6bf3f8fce..da32a4e2e8715d630ad0717c4ed6f152eda06e54 100644 (file)
@@ -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),