#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()
{
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);
//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);
#include "common/Formatter.h"
-#define END_FEATURE CompatSet::Feature(0, "")
-
struct CompatSet {
struct Feature {
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() { }
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);
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)) {
// 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
{
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")
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);
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; }
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);
}
<< " ";
}
-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)
}
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);
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)
{
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),