From 09a2d66e2dde28d6d773dd9c94f676baa7538d12 Mon Sep 17 00:00:00 2001 From: Greg Farnum Date: Fri, 1 Feb 2013 12:52:01 -0800 Subject: [PATCH] mds: EMetaBlob::remotebit more modernization for dencoder And set defaults for the default constructor. Signed-off-by: Greg Farnum --- src/mds/events/EMetaBlob.h | 26 ++++----------- src/mds/journal.cc | 68 ++++++++++++++++++++++++++++++++++++++ src/test/encoding/types.h | 1 + 3 files changed, 76 insertions(+), 19 deletions(-) diff --git a/src/mds/events/EMetaBlob.h b/src/mds/events/EMetaBlob.h index 3480490acfd0e..0843a73aef2cf 100644 --- a/src/mds/events/EMetaBlob.h +++ b/src/mds/events/EMetaBlob.h @@ -152,30 +152,18 @@ public: ::encode(dr, _enc); } remotebit(bufferlist::iterator &p) { decode(p); } - remotebit() {} + remotebit(): dnfirst(0), dnlast(0), dnv(0), ino(0), + d_type('\0'), dirty(false) {} - void encode(bufferlist& bl) const { - assert(_enc.length()); - ENCODE_START(2, 2, bl); - bl.append(_enc); - ENCODE_FINISH(bl); - } - void decode(bufferlist::iterator &bl) { - DECODE_START_LEGACY_COMPAT_LEN(2, 2, 2, bl); - ::decode(dn, bl); - ::decode(dnfirst, bl); - ::decode(dnlast, bl); - ::decode(dnv, bl); - ::decode(ino, bl); - ::decode(d_type, bl); - ::decode(dirty, bl); - DECODE_FINISH(bl); - } - void print(ostream& out) { + void encode(bufferlist& bl) const; + void decode(bufferlist::iterator &bl); + void print(ostream& out) const { out << " remotebit dn " << dn << " [" << dnfirst << "," << dnlast << "] dnv " << dnv << " ino " << ino << " dirty=" << dirty << std::endl; } + void dump(Formatter *f) const; + static void generate_test_instances(list& ls); }; WRITE_CLASS_ENCODER(remotebit) diff --git a/src/mds/journal.cc b/src/mds/journal.cc index def0ea61ea28a..9a45a14b0f686 100644 --- a/src/mds/journal.cc +++ b/src/mds/journal.cc @@ -516,6 +516,74 @@ void EMetaBlob::fullbit::update_inode(MDS *mds, CInode *in) in->old_inodes = old_inodes; } +void EMetaBlob::remotebit::encode(bufferlist& bl) const +{ + ENCODE_START(2, 2, bl); + if (!_enc.length()) { + remotebit copy(dn, dnfirst, dnlast, dnv, ino, d_type, dirty); + bl.append(copy._enc); + } else { + bl.append(_enc); + } + ENCODE_FINISH(bl); +} + +void EMetaBlob::remotebit::decode(bufferlist::iterator &bl) +{ + DECODE_START_LEGACY_COMPAT_LEN(2, 2, 2, bl); + ::decode(dn, bl); + ::decode(dnfirst, bl); + ::decode(dnlast, bl); + ::decode(dnv, bl); + ::decode(ino, bl); + ::decode(d_type, bl); + ::decode(dirty, bl); + DECODE_FINISH(bl); +} + +void EMetaBlob::remotebit::dump(Formatter *f) const +{ + if (_enc.length() && !dn.length()) { + /* if our bufferlist has data but our name is empty, we + * haven't initialized ourselves; do so in order to print members! + * We use const_cast here because the whole point is we aren't + * fully set up and this isn't changing who we "are", just our + * representation. + */ + EMetaBlob::remotebit *me = const_cast(this); + bufferlist encoded; + encode(encoded); + bufferlist::iterator p = encoded.begin(); + me->decode(p); + } + f->dump_string("dentry", dn); + f->dump_int("snapid.first", dnfirst); + f->dump_int("snapid.last", dnlast); + f->dump_int("dentry version", dnv); + f->dump_int("inodeno", ino); + uint32_t type = DTTOIF(d_type) & S_IFMT; // convert to type entries + string type_string; + switch(type) { + case S_IFREG: + type_string = "file"; break; + case S_IFLNK: + type_string = "symlink"; break; + case S_IFDIR: + type_string = "directory"; break; + default: + assert (0 == "unknown d_type!"); + } + f->dump_string("d_type", type_string); + f->dump_string("dirty", dirty ? "true" : "false"); +} + +void EMetaBlob::remotebit:: +generate_test_instances(list& ls) +{ + remotebit *remote = new remotebit("/test/dn", 0, 10, 15, 1, IFTODT(S_IFREG), false); + ls.push_back(remote); +} + void EMetaBlob::replay(MDS *mds, LogSegment *logseg, MDSlaveUpdate *slaveup) { dout(10) << "EMetaBlob.replay " << lump_map.size() << " dirlumps by " << client_name << dendl; diff --git a/src/test/encoding/types.h b/src/test/encoding/types.h index 5528f08910d1b..ae074a4997bd2 100644 --- a/src/test/encoding/types.h +++ b/src/test/encoding/types.h @@ -135,6 +135,7 @@ TYPE(EImportFinish) TYPE(EImportStart) #include "mds/events/EMetaBlob.h" TYPE(EMetaBlob::fullbit) +TYPE(EMetaBlob::remotebit) #ifdef WITH_RADOSGW -- 2.39.5