From: Sage Weil Date: Wed, 30 Dec 2015 20:13:36 +0000 (-0500) Subject: mds: pass features to various CInode encoders and helpers X-Git-Tag: v10.1.0~241^2~21 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=7dcf39f7ca2ab8a8f000b3507930d9e9487eb31f;p=ceph.git mds: pass features to various CInode encoders and helpers We'll need this shortly. Signed-off-by: Sage Weil --- diff --git a/src/mds/CDir.cc b/src/mds/CDir.cc index f43c768ad60c..f4fde58e1e26 100644 --- a/src/mds/CDir.cc +++ b/src/mds/CDir.cc @@ -2116,7 +2116,7 @@ void CDir::_encode_dentry(CDentry *dn, bufferlist& bl, bufferlist snap_blob; in->encode_snap_blob(snap_blob); - in->encode_bare(bl, &snap_blob); + in->encode_bare(bl, cache->mds->mdsmap->get_up_features(), &snap_blob); } } diff --git a/src/mds/CInode.cc b/src/mds/CInode.cc index 68ebd76a7ae0..20493fefe981 100644 --- a/src/mds/CInode.cc +++ b/src/mds/CInode.cc @@ -970,7 +970,7 @@ void CInode::store(MDSInternalContextBase *fin) bufferlist bl; string magic = CEPH_FS_ONDISK_MAGIC; ::encode(magic, bl); - encode_store(bl); + encode_store(bl, mdcache->mds->mdsmap->get_up_features()); // write it. SnapContext snapc; @@ -1294,7 +1294,8 @@ void CInode::verify_diri_backtrace(bufferlist &bl, int err) // parent dir -void InodeStoreBase::encode_bare(bufferlist &bl, const bufferlist *snap_blob) const +void InodeStoreBase::encode_bare(bufferlist &bl, uint64_t features, + const bufferlist *snap_blob) const { ::encode(inode, bl); if (is_symlink()) @@ -1310,18 +1311,20 @@ void InodeStoreBase::encode_bare(bufferlist &bl, const bufferlist *snap_blob) co ::encode(damage_flags, bl); } -void InodeStoreBase::encode(bufferlist &bl, const bufferlist *snap_blob) const +void InodeStoreBase::encode(bufferlist &bl, uint64_t features, + const bufferlist *snap_blob) const { ENCODE_START(6, 4, bl); - encode_bare(bl, snap_blob); + encode_bare(bl, features, snap_blob); ENCODE_FINISH(bl); } -void CInode::encode_store(bufferlist& bl) +void CInode::encode_store(bufferlist& bl, uint64_t features) { bufferlist snap_blob; encode_snap_blob(snap_blob); - InodeStoreBase::encode(bl, &snap_blob); + InodeStoreBase::encode(bl, mdcache->mds->mdsmap->get_up_features(), + &snap_blob); } void InodeStoreBase::decode_bare(bufferlist::iterator &bl, @@ -3370,7 +3373,7 @@ void CInode::encode_cap_message(MClientCaps *m, Capability *cap) -void CInode::_encode_base(bufferlist& bl) +void CInode::_encode_base(bufferlist& bl, uint64_t features) { ::encode(first, bl); ::encode(inode, bl); @@ -3486,8 +3489,8 @@ void CInode::_decode_locks_rejoin(bufferlist::iterator& p, listmds->mdsmap->get_up_features()); ::encode(state, bl); diff --git a/src/mds/CInode.h b/src/mds/CInode.h index 15fef42e99bb..851e7e71510f 100644 --- a/src/mds/CInode.h +++ b/src/mds/CInode.h @@ -89,11 +89,11 @@ public: static object_t get_object_name(inodeno_t ino, frag_t fg, const char *suffix); /* Full serialization for use in ".inode" root inode objects */ - void encode(bufferlist &bl, const bufferlist *snap_blob=NULL) const; + void encode(bufferlist &bl, uint64_t features, const bufferlist *snap_blob=NULL) const; void decode(bufferlist::iterator &bl, bufferlist& snap_blob); /* Serialization without ENCODE_START/FINISH blocks for use embedded in dentry */ - void encode_bare(bufferlist &bl, const bufferlist *snap_blob=NULL) const; + void encode_bare(bufferlist &bl, uint64_t features, const bufferlist *snap_blob=NULL) const; void decode_bare(bufferlist::iterator &bl, bufferlist &snap_blob, __u8 struct_v=5); /* For test/debug output */ @@ -108,14 +108,14 @@ class InodeStore : public InodeStoreBase { public: bufferlist snap_blob; // Encoded copy of SnapRealm, because we can't // rehydrate it without full MDCache - void encode(bufferlist &bl) const { - InodeStoreBase::encode(bl, &snap_blob); + void encode(bufferlist &bl, uint64_t features) const { + InodeStoreBase::encode(bl, features, &snap_blob); } void decode(bufferlist::iterator &bl) { InodeStoreBase::decode(bl, snap_blob); } - void encode_bare(bufferlist &bl) const { - InodeStoreBase::encode_bare(bl, &snap_blob); + void encode_bare(bufferlist &bl, uint64_t features) const { + InodeStoreBase::encode_bare(bl, features, &snap_blob); } void decode_bare(bufferlist::iterator &bl) { InodeStoreBase::decode_bare(bl, snap_blob); @@ -123,6 +123,7 @@ public: static void generate_test_instances(std::list& ls); }; +WRITE_CLASS_ENCODER_FEATURES(InodeStore) // cached inode wrapper class CInode : public MDSCacheObject, public InodeStoreBase { @@ -743,10 +744,10 @@ public: void encode_snap_blob(bufferlist &bl); void decode_snap_blob(bufferlist &bl); - void encode_store(bufferlist& bl); + void encode_store(bufferlist& bl, uint64_t features); void decode_store(bufferlist::iterator& bl); - void encode_replica(mds_rank_t rep, bufferlist& bl) { + void encode_replica(mds_rank_t rep, bufferlist& bl, uint64_t features) { assert(is_auth()); // relax locks? @@ -756,7 +757,7 @@ public: __u32 nonce = add_replica(rep); ::encode(nonce, bl); - _encode_base(bl); + _encode_base(bl, features); _encode_locks_state_for_replica(bl); } void decode_replica(bufferlist::iterator& p, bool is_new) { @@ -781,7 +782,7 @@ public: void take_waiting(uint64_t tag, std::list& ls); // -- encode/decode helpers -- - void _encode_base(bufferlist& bl); + void _encode_base(bufferlist& bl, uint64_t features); void _decode_base(bufferlist::iterator& p); void _encode_locks_full(bufferlist& bl); void _decode_locks_full(bufferlist::iterator& p); diff --git a/src/mds/MDCache.cc b/src/mds/MDCache.cc index 0441f84e120f..aff51be39a5b 100644 --- a/src/mds/MDCache.cc +++ b/src/mds/MDCache.cc @@ -4414,7 +4414,7 @@ void MDCache::handle_cache_rejoin_weak(MMDSCacheRejoin *weak) if (ack) { acked_inodes.insert(in->vino()); - ack->add_inode_base(in); + ack->add_inode_base(in, mds->mdsmap->get_up_features()); bufferlist bl; in->_encode_locks_state_for_rejoin(bl, from); ack->add_inode_locks(in, inonce, bl); @@ -4435,7 +4435,7 @@ void MDCache::handle_cache_rejoin_weak(MMDSCacheRejoin *weak) if (ack) { acked_inodes.insert(in->vino()); - ack->add_inode_base(in); + ack->add_inode_base(in, mds->mdsmap->get_up_features()); bufferlist bl; in->_encode_locks_state_for_rejoin(bl, from); ack->add_inode_locks(in, inonce, bl); @@ -4453,7 +4453,7 @@ void MDCache::handle_cache_rejoin_weak(MMDSCacheRejoin *weak) assert(in); dout(10) << " including base inode (due to potential scatterlock update) " << *in << dendl; acked_inodes.insert(in->vino()); - ack->add_inode_base(in); + ack->add_inode_base(in, mds->mdsmap->get_up_features()); } rejoin_scour_survivor_replicas(from, ack, acked_inodes, gather_locks); @@ -5890,7 +5890,7 @@ void MDCache::rejoin_send_acks() for (compact_map::iterator r = in->replicas_begin(); r != in->replicas_end(); ++r) { - ack[r->first]->add_inode_base(in); + ack[r->first]->add_inode_base(in, mds->mdsmap->get_up_features()); bufferlist bl; in->_encode_locks_state_for_rejoin(bl, r->first); ack[r->first]->add_inode_locks(in, ++r->second, bl); @@ -5907,7 +5907,7 @@ void MDCache::rejoin_send_acks() for (compact_map::iterator r = root->replicas_begin(); r != root->replicas_end(); ++r) { - ack[r->first]->add_inode_base(root); + ack[r->first]->add_inode_base(root, mds->mdsmap->get_up_features()); bufferlist bl; root->_encode_locks_state_for_rejoin(bl, r->first); ack[r->first]->add_inode_locks(root, ++r->second, bl); @@ -5916,7 +5916,7 @@ void MDCache::rejoin_send_acks() for (compact_map::iterator r = myin->replicas_begin(); r != myin->replicas_end(); ++r) { - ack[r->first]->add_inode_base(myin); + ack[r->first]->add_inode_base(myin, mds->mdsmap->get_up_features()); bufferlist bl; myin->_encode_locks_state_for_rejoin(bl, r->first); ack[r->first]->add_inode_locks(myin, ++r->second, bl); @@ -5930,7 +5930,7 @@ void MDCache::rejoin_send_acks() for (compact_map::iterator r = in->replicas_begin(); r != in->replicas_end(); ++r) - ack[r->first]->add_inode_base(in); + ack[r->first]->add_inode_base(in, mds->mdsmap->get_up_features()); } // send acks @@ -9516,7 +9516,7 @@ void MDCache::handle_discover(MDiscover *dis) // add root reply->starts_with = MDiscoverReply::INODE; - replicate_inode(cur, from, reply->trace); + replicate_inode(cur, from, reply->trace, mds->mdsmap->get_up_features()); dout(10) << "added base " << *cur << dendl; } else { @@ -9741,7 +9741,7 @@ void MDCache::handle_discover(MDiscover *dis) CInode *next = dnl->get_inode(); assert(next->is_auth()); - replicate_inode(next, from, reply->trace); + replicate_inode(next, from, reply->trace, mds->mdsmap->get_up_features()); dout(7) << "handle_discover added inode " << *next << dendl; // descend, keep going. @@ -10020,10 +10020,11 @@ CInode *MDCache::add_replica_inode(bufferlist::iterator& p, CDentry *dn, listmdsmap->get_up_features(); + replicate_inode(get_myin(), who, bl, features); replicate_dir(straydn->get_dir()->inode->get_parent_dn()->get_dir(), who, bl); replicate_dentry(straydn->get_dir()->inode->get_parent_dn(), who, bl); - replicate_inode(straydn->get_dir()->inode, who, bl); + replicate_inode(straydn->get_dir()->inode, who, bl, features); replicate_dir(straydn->get_dir(), who, bl); replicate_dentry(straydn, who, bl); } @@ -10150,7 +10151,8 @@ void MDCache::send_dentry_link(CDentry *dn, MDRequestRef& mdr) dn->name, dnl->is_primary()); if (dnl->is_primary()) { dout(10) << " primary " << *dnl->get_inode() << dendl; - replicate_inode(dnl->get_inode(), p->first, m->bl); + replicate_inode(dnl->get_inode(), p->first, m->bl, + mds->mdsmap->get_up_features()); } else if (dnl->is_remote()) { inodeno_t ino = dnl->get_remote_ino(); __u8 d_type = dnl->get_remote_d_type(); diff --git a/src/mds/MDCache.h b/src/mds/MDCache.h index 3b44d0c7f672..6b054130dd8c 100644 --- a/src/mds/MDCache.h +++ b/src/mds/MDCache.h @@ -989,10 +989,11 @@ public: ::encode(dn->last, bl); dn->encode_replica(to, bl); } - void replicate_inode(CInode *in, mds_rank_t to, bufferlist& bl) { + void replicate_inode(CInode *in, mds_rank_t to, bufferlist& bl, + uint64_t features) { ::encode(in->inode.ino, bl); // bleh, minor assymetry here ::encode(in->last, bl); - in->encode_replica(to, bl); + in->encode_replica(to, bl, features); } CDir* add_replica_dir(bufferlist::iterator& p, CInode *diri, mds_rank_t from, list& finished); diff --git a/src/mds/Migrator.cc b/src/mds/Migrator.cc index 4dce94fafff1..3bf7ce248aeb 100644 --- a/src/mds/Migrator.cc +++ b/src/mds/Migrator.cc @@ -1019,7 +1019,8 @@ void Migrator::export_frozen(CDir *dir, uint64_t tid) bufferlist bl; cache->replicate_dentry(cur->inode->parent, it->second.peer, bl); dout(7) << " added " << *cur->inode->parent << dendl; - cache->replicate_inode(cur->inode, it->second.peer, bl); + cache->replicate_inode(cur->inode, it->second.peer, bl, + mds->mdsmap->get_up_features()); dout(7) << " added " << *cur->inode << dendl; bl.claim_append(tracebl); tracebl.claim(bl); diff --git a/src/messages/MMDSCacheRejoin.h b/src/messages/MMDSCacheRejoin.h index 979fe9a49abd..111a24460176 100644 --- a/src/messages/MMDSCacheRejoin.h +++ b/src/messages/MMDSCacheRejoin.h @@ -224,11 +224,11 @@ public: ::encode(nonce, inode_locks); ::encode(bl, inode_locks); } - void add_inode_base(CInode *in) { + void add_inode_base(CInode *in, uint64_t features) { ::encode(in->inode.ino, inode_base); ::encode(in->last, inode_base); bufferlist bl; - in->_encode_base(bl); + in->_encode_base(bl, features); ::encode(bl, inode_base); } void add_inode_authpin(vinodeno_t ino, const metareqid_t& ri, __u32 attempt) { diff --git a/src/test/encoding/types.h b/src/test/encoding/types.h index 0815c14a56b2..ed37b976a4b1 100644 --- a/src/test/encoding/types.h +++ b/src/test/encoding/types.h @@ -187,7 +187,7 @@ TYPE_FEATUREFUL(file_layout_t) TYPE(ceph_file_layout_wrapper) #include "mds/CInode.h" -TYPE(InodeStore) +TYPE_FEATUREFUL(InodeStore) #include "mds/MDSMap.h" TYPE_FEATUREFUL(MDSMap) diff --git a/src/tools/cephfs/DataScan.cc b/src/tools/cephfs/DataScan.cc index f076310b7115..fd01d96ef077 100644 --- a/src/tools/cephfs/DataScan.cc +++ b/src/tools/cephfs/DataScan.cc @@ -289,7 +289,7 @@ int MetadataDriver::inject_unlinked_inode( // Serialize bufferlist inode_bl; ::encode(std::string(CEPH_FS_ONDISK_MAGIC), inode_bl); - inode.encode(inode_bl); + inode.encode(inode_bl, CEPH_FEATURES_SUPPORTED_DEFAULT); // Write r = metadata_io.write_full(oid.name, inode_bl); @@ -1430,7 +1430,7 @@ int MetadataDriver::inject_linkage( bufferlist dentry_bl; ::encode(snap, dentry_bl); ::encode('I', dentry_bl); - inode.encode_bare(dentry_bl); + inode.encode_bare(dentry_bl, CEPH_FEATURES_SUPPORTED_DEFAULT); // Write out std::map vals; diff --git a/src/tools/cephfs/JournalTool.cc b/src/tools/cephfs/JournalTool.cc index 43ba9d354372..9311eeaf5e3e 100644 --- a/src/tools/cephfs/JournalTool.cc +++ b/src/tools/cephfs/JournalTool.cc @@ -960,7 +960,7 @@ int JournalTool::replay_offline(EMetaBlob const &metablob, bool const dry_run) inode_bl.clear(); std::string magic = CEPH_FS_ONDISK_MAGIC; ::encode(magic, inode_bl); - inode.encode(inode_bl); + inode.encode(inode_bl, CEPH_FEATURES_SUPPORTED_DEFAULT); if (!dry_run) { r = io.write_full(root_oid.name, inode_bl); @@ -1043,7 +1043,7 @@ int JournalTool::replay_offline(EMetaBlob const &metablob, bool const dry_run) inode.snap_blob = fb.snapbl; inode.symlink = fb.symlink; inode.old_inodes = fb.old_inodes; - inode.encode_bare(dentry_bl); + inode.encode_bare(dentry_bl, CEPH_FEATURES_SUPPORTED_DEFAULT); vals[key] = dentry_bl; if (!dry_run) { @@ -1184,9 +1184,9 @@ void JournalTool::encode_fullbit_as_inode( // Serialize InodeStore if (bare) { - new_inode.encode_bare(*out_bl); + new_inode.encode_bare(*out_bl, CEPH_FEATURES_SUPPORTED_DEFAULT); } else { - new_inode.encode(*out_bl); + new_inode.encode(*out_bl, CEPH_FEATURES_SUPPORTED_DEFAULT); } }