From 8883cd22d9b47d651f863f7b761c4232e47f12e9 Mon Sep 17 00:00:00 2001 From: Greg Farnum Date: Thu, 14 Jan 2010 11:12:23 -0800 Subject: [PATCH] mon: use CompatSet in disk format --- src/cmon.cc | 35 +++++++++++++++++++++++++++++++++++ src/mon/Monitor.cc | 14 ++++++++++++++ src/mon/Monitor.h | 11 +++++++++++ 3 files changed, 60 insertions(+) diff --git a/src/cmon.cc b/src/cmon.cc index e1190f556812d..9631e7f310f40 100644 --- a/src/cmon.cc +++ b/src/cmon.cc @@ -29,11 +29,19 @@ using namespace std; #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; @@ -66,6 +74,13 @@ int main(int argc, const char **argv) 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) { @@ -93,6 +108,26 @@ int main(int argc, const char **argv) 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; { diff --git a/src/mon/Monitor.cc b/src/mon/Monitor.cc index 1df96f6bbb35e..d02131b6664e1 100644 --- a/src/mon/Monitor.cc +++ b/src/mon/Monitor.cc @@ -72,6 +72,11 @@ static ostream& _prefix(Monitor *mon) { << " "; } +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), @@ -891,6 +896,15 @@ int Monitor::mkfs(bufferlist& osdmapbl) 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); diff --git a/src/mon/Monitor.h b/src/mon/Monitor.h index 6f161caed1b4a..a1a32f31677fe 100644 --- a/src/mon/Monitor.h +++ b/src/mon/Monitor.h @@ -51,6 +51,8 @@ class MClass; class MAuthRotating; class MRoute; +#define COMPAT_SET_LOC "feature_set" + class Monitor : public Dispatcher { public: // me @@ -226,4 +228,13 @@ public: 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 -- 2.39.5