#include "msg/SimpleMessenger.h"
+#include "include/CompatSet.h"
#include "include/nstring.h"
#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[];
+
void usage()
{
cerr << "usage: cmon -i monid [--mon-data=pathtodata] [flags]" << std::endl;
if (g_conf.clock_tare) g_clock.tare();
+ CompatSet mon_features(ceph_mon_feature_compat, ceph_mon_feature_compat_size,
+ ceph_mon_feature_ro_compat,
+ ceph_mon_feature_ro_compat_size,
+ ceph_mon_feature_incompat,
+ ceph_mon_feature_incompat_size);
+ CompatSet ondisk_features;
+
MonitorStore store(g_conf.mon_data);
err = store.mount();
if (err < 0) {
exit(1);
}
+ bufferlist features;
+ store.get_bl_ss(features, COMPAT_SET_LOC, 0);
+ if (features.length() == 0) {
+ cerr << "mon fs missing feature list. Exiting now" << std::endl;
+ exit(1);
+ }
+ bufferlist::iterator it = features.begin();
+ ondisk_features.decode(it);
+
+ if (!mon_features.writeable(ondisk_features)) {
+ 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;
+ }
+ exit(1);
+ }
+
+
// monmap?
MonMap monmap;
{
<< " ";
}
+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 };
+
Monitor::Monitor(int w, MonitorStore *s, Messenger *m, MonMap *map) :
whoami(w),
messenger(m),
magicbl.append("\n");
store->put_bl_ss(magicbl, "magic", 0);
+ bufferlist features;
+ CompatSet mon_features(ceph_mon_feature_compat, ceph_mon_feature_compat_size,
+ ceph_mon_feature_ro_compat,
+ ceph_mon_feature_ro_compat_size,
+ ceph_mon_feature_incompat,
+ ceph_mon_feature_incompat_size);
+ mon_features.encode(features);
+ store->put_bl_ss(features, COMPAT_SET_LOC, 0);
+
bufferlist monmapbl;
monmap->encode(monmapbl);
class MAuthRotating;
class MRoute;
+#define COMPAT_SET_LOC "feature_set"
+
class Monitor : public Dispatcher {
public:
// me
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[];
+
+
#endif