#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()
{
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);
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);
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);
}
#include "include/buffer.h"
#include <vector>
+#define END_FEATURE CompatSet::Feature(0, "")
+
struct CompatSet {
struct Feature {
struct FeatureSet {
__u64 mask;
map <__u64,string> names;
+
+ FeatureSet() : mask(0), names() {}
void insert(Feature f) {
mask |= f.id;
names[f.id] = f.name;
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]);
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),
<< " ";
}
-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),
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);
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
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
+};
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),
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;
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;
}
}
};
//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
#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