Skip to content

Commit

Permalink
Remove global ctors/dtors for CompatSet
Browse files Browse the repository at this point in the history
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 ceph#1512

Signed-off-by: Colin McCabe <[email protected]>
  • Loading branch information
cmccabe committed Sep 12, 2011
1 parent 923c60c commit e84996d
Show file tree
Hide file tree
Showing 9 changed files with 51 additions and 87 deletions.
12 changes: 3 additions & 9 deletions src/cmon.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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()
{
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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);
Expand Down
13 changes: 0 additions & 13 deletions src/include/CompatSet.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,6 @@

#include "common/Formatter.h"

#define END_FEATURE CompatSet::Feature(0, "")

struct CompatSet {

struct Feature {
Expand Down Expand Up @@ -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() { }


Expand Down
2 changes: 2 additions & 0 deletions src/mds/MDS.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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)) {
Expand Down
50 changes: 18 additions & 32 deletions src/mds/MDSMap.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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
{
Expand Down
6 changes: 3 additions & 3 deletions src/mds/MDSMap.h
Original file line number Diff line number Diff line change
Expand Up @@ -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")
Expand Down Expand Up @@ -580,7 +580,7 @@ class MDSMap {
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);
Expand Down
2 changes: 1 addition & 1 deletion src/messages/MMDSBeacon.h
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ class MMDSBeacon : public PaxosServiceMessage {
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; }
Expand Down
2 changes: 1 addition & 1 deletion src/mon/MDSMonitor.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}

Expand Down
19 changes: 10 additions & 9 deletions src/mon/Monitor.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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);

Expand Down
32 changes: 13 additions & 19 deletions src/osd/OSD.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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)
{
Expand Down Expand Up @@ -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),
Expand Down

0 comments on commit e84996d

Please sign in to comment.