From 15fa5885350129880e8db6ba312e850da0acd2bc Mon Sep 17 00:00:00 2001 From: Greg Farnum Date: Thu, 14 Jan 2010 11:11:51 -0800 Subject: [PATCH] mds: use CompatSet in disk format --- src/mds/CInode.cc | 21 +++++++++++++++++---- src/mds/CInode.h | 5 +++++ src/mds/MDS.cc | 8 ++++++++ src/mds/MDS.h | 11 ++++++++++- 4 files changed, 40 insertions(+), 5 deletions(-) diff --git a/src/mds/CInode.cc b/src/mds/CInode.cc index e641b2bed4263..e9e049f5d1ff4 100644 --- a/src/mds/CInode.cc +++ b/src/mds/CInode.cc @@ -42,7 +42,6 @@ #undef dout_prefix #define dout_prefix *_dout << dbeginl << "mds" << mdcache->mds->get_nodeid() << ".cache.ino(" << inode.ino << ") " - boost::pool<> CInode::pool(sizeof(CInode)); boost::pool<> Capability::pool(sizeof(Capability)); @@ -664,6 +663,9 @@ void CInode::store(Context *fin) bufferlist bl; nstring magic = CEPH_FS_ONDISK_MAGIC; ::encode(magic, bl); + //hack: in future will want to only write USED features + //since we currently only have one feature, though, this works + mdcache->mds->mds_features.encode(bl); encode_store(bl); // write it. @@ -733,9 +735,20 @@ void CInode::_fetched(bufferlist& bl, Context *fin) << "'" << dendl; fin->finish(-EINVAL); } else { - decode_store(p); - dout(10) << "_fetched " << *this << dendl; - fin->finish(0); + ondisk_ino_features.decode(p); + CompatSet& mds_features = mdcache->mds->mds_features; + if ( !mds_features.writeable(ondisk_ino_features)) { + dout(0) << "mds data on-disk uses unknown features!" << dendl; + CompatSet diff = mds_features.unsupported(ondisk_ino_features); + dout(0) << "missing features:" << dendl; + for (CompatSet::iterator i = diff.begin(); i != diff.end(); ++i) + dout(0) << *i << dendl; + fin->finish(-EOPNOTSUPP); + } else { + decode_store(p); + dout(10) << "_fetched " << *this << dendl; + fin->finish(0); + } } delete fin; } diff --git a/src/mds/CInode.h b/src/mds/CInode.h index 17d45a463af9d..2b74308c15aae 100644 --- a/src/mds/CInode.h +++ b/src/mds/CInode.h @@ -18,6 +18,7 @@ #define __CINODE_H #include "config.h" +#include "include/CompatSet.h" #include "include/types.h" #include "include/lru.h" @@ -53,11 +54,13 @@ class ObjectOperation; ostream& operator<<(ostream& out, CInode& in); + // cached inode wrapper class CInode : public MDSCacheObject { private: static boost::pool<> pool; public: + CompatSet ondisk_ino_features; static void *operator new(size_t num_bytes) { return pool.malloc(); } @@ -919,4 +922,6 @@ public: }; + + #endif diff --git a/src/mds/MDS.cc b/src/mds/MDS.cc index ce32957003b51..9ffe89ee43217 100644 --- a/src/mds/MDS.cc +++ b/src/mds/MDS.cc @@ -70,6 +70,11 @@ #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 @@ -78,6 +83,9 @@ MDS::MDS(const char *n, Messenger *m, MonClient *mc) : 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), diff --git a/src/mds/MDS.h b/src/mds/MDS.h index cf77a34fde26c..0bce1daae40de 100644 --- a/src/mds/MDS.h +++ b/src/mds/MDS.h @@ -20,6 +20,7 @@ #include "mdstypes.h" #include "msg/Dispatcher.h" +#include "include/CompatSet.h" #include "include/types.h" #include "include/Context.h" #include "common/DecayCounter.h" @@ -144,6 +145,8 @@ class MDS : public Dispatcher { string name; int whoami; int incarnation; + + CompatSet mds_features; int standby_for_rank; string standby_for_name; @@ -395,6 +398,12 @@ public: } }; - +#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 -- 2.39.5