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]);
+ 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() { }
incompat.decode(bl);
}
};
+WRITE_CLASS_ENCODER(CompatSet)
+
+inline ostream& operator<<(ostream& out, const CompatSet::FeatureSet& fs)
+{
+ return out << fs.names;
+}
+
+inline ostream& operator<<(ostream& out, const CompatSet& compat)
+{
+ return out << "compat=" << compat.compat
+ << ",rocompat=" << compat.ro_compat
+ << ",incompat=" << compat.incompat;
+}
+
#endif
#undef dout_prefix
#define dout_prefix *_dout << dbeginl << "mds" << whoami << '.' << incarnation << ' '
-const char *ceph_mds_feature_compat[ceph_mds_feature_compat_size] = {};
-const char *ceph_mds_feature_ro_compat[ceph_mds_feature_ro_compat_size]=
- {};
-const char *ceph_mds_feature_incompat[ceph_mds_feature_incompat_size] =
- { CEPH_MDS_FEATURE_INCOMPAT_BASE };
+
// cons/des
}
};
-#define CEPH_MDS_FEATURE_INCOMPAT_BASE "initial feature set (~v.18)"
-static const int ceph_mds_feature_compat_size = 0;
-static const int ceph_mds_feature_ro_compat_size = 0;
-static const int ceph_mds_feature_incompat_size = 1;
-extern const char *ceph_mds_feature_compat[];
-extern const char *ceph_mds_feature_ro_compat[];
-extern const char *ceph_mds_feature_incompat[];
-
#endif
#include <sstream>
using std::stringstream;
+
+// features
+
+const struct CompatSet::Feature feature_compat[] = {
+ END_FEATURE
+};
+const struct CompatSet::Feature feature_incompat[] = {
+ MDS_FEATURE_INCOMPAT_BASE,
+ END_FEATURE
+};
+const struct CompatSet::Feature feature_ro_compat[] = {
+ END_FEATURE
+};
+
+CompatSet mdsmap_compat(feature_compat,
+ feature_ro_compat,
+ feature_incompat);
+
+// 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);
+
+
+// ----
+
void MDSMap::print(ostream& out)
{
out << "epoch " << epoch << std::endl;
out << "session_timeout " << session_timeout << "\n"
<< "session_autoclose " << session_autoclose << "\n";
+ out << "\ncompat " << compat << std::endl;
out << "\nmax_mds " << max_mds << std::endl;
set<int> upset;
#include "config.h"
+#include "include/CompatSet.h"
+
/*
boot --> standby, creating, or starting.
*/
+extern CompatSet mdsmap_compat;
+extern CompatSet mdsmap_compat_base; // pre v0.20
+
+#define MDS_FEATURE_INCOMPAT_BASE CompatSet::Feature(1, "base v0.20")
+
class MDSMap {
public:
// mds states
map<int32_t,__u64> up; // who is in those roles
map<__u64,mds_info_t> mds_info;
+public:
+ CompatSet compat;
+
friend class MDSMonitor;
public:
::encode(cas_pg_pool, bl);
// kclient ignores everything from here
- __u16 ev = 2;
+ __u16 ev = 3;
::encode(ev, bl);
+ ::encode(compat, bl);
::encode(metadata_pg_pool, bl);
::encode(created, bl);
::encode(modified, bl);
// kclient ignores everything from here
__u16 ev = 1;
- if (v > 1)
+ if (v >= 2)
::decode(ev, p);
+ if (ev >= 3)
+ ::decode(compat, p);
+ else
+ compat = mdsmap_compat_base;
::decode(metadata_pg_pool, p);
::decode(created, p);
::decode(modified, p);
// service methods
-
void MDSMonitor::create_initial(bufferlist& bl)
{
dout(10) << "create_initial" << dendl;
pending_mdsmap.data_pg_pools.push_back(CEPH_DATA_RULE);
pending_mdsmap.metadata_pg_pool = CEPH_METADATA_RULE;
pending_mdsmap.cas_pg_pool = CEPH_CASDATA_RULE;
+ pending_mdsmap.compat = mdsmap_compat;
print_map(pending_mdsmap);
}