From: Greg Farnum Date: Fri, 1 Feb 2013 23:50:01 +0000 (-0800) Subject: mds: EMetaBlob::nullbit modernization for dencoder X-Git-Tag: v0.58~100^2~31 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=196313b4d06d61bb66c2d7e615463efe09a0ce6d;p=ceph.git mds: EMetaBlob::nullbit modernization for dencoder And set defaults in the default constructor. Signed-off-by: Greg Farnum --- diff --git a/src/mds/events/EMetaBlob.h b/src/mds/events/EMetaBlob.h index 0843a73aef2c..8549d22be64f 100644 --- a/src/mds/events/EMetaBlob.h +++ b/src/mds/events/EMetaBlob.h @@ -188,23 +188,12 @@ public: ::encode(dr, _enc); } nullbit(bufferlist::iterator &p) { decode(p); } - nullbit() {} + nullbit(): dnfirst(0), dnlast(0), dnv(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(dirty, bl); - DECODE_FINISH(bl); - } + void encode(bufferlist& bl) const; + void decode(bufferlist::iterator &bl); + void dump(Formatter *f) const; + static void generate_test_instances(list& ls); void print(ostream& out) { out << " nullbit dn " << dn << " [" << dnfirst << "," << dnlast << "] dnv " << dnv << " dirty=" << dirty << std::endl; diff --git a/src/mds/journal.cc b/src/mds/journal.cc index 9a45a14b0f68..6915ea718711 100644 --- a/src/mds/journal.cc +++ b/src/mds/journal.cc @@ -378,6 +378,9 @@ void EMetaBlob::update_segment(LogSegment *ls) //if (!client_reqs.empty()) // ls->last_client_tid[client_reqs.rbegin()->client] = client_reqs.rbegin()->tid); } + +// EMetaBlob::fullbit + void EMetaBlob::fullbit::encode(bufferlist& bl) const { ENCODE_START(4, 4, bl); if (!_enc.length()) { @@ -516,6 +519,8 @@ void EMetaBlob::fullbit::update_inode(MDS *mds, CInode *in) in->old_inodes = old_inodes; } +// EMetaBlob::remotebit + void EMetaBlob::remotebit::encode(bufferlist& bl) const { ENCODE_START(2, 2, bl); @@ -584,6 +589,65 @@ generate_test_instances(list& ls) ls.push_back(remote); } +// EMetaBlob::nullbit + +void EMetaBlob::nullbit::encode(bufferlist& bl) const +{ + ENCODE_START(2, 2, bl); + if (!_enc.length()) { + nullbit copy(dn, dnfirst, dnlast, dnv, dirty); + bl.append(copy._enc); + } else { + bl.append(_enc); + } + ENCODE_FINISH(bl); +} + +void EMetaBlob::nullbit::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(dirty, bl); + DECODE_FINISH(bl); +} + +void EMetaBlob::nullbit::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::nullbit *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_string("dirty", dirty ? "true" : "false"); +} + +void EMetaBlob::nullbit::generate_test_instances(list& ls) +{ + nullbit *sample = new nullbit("/test/dentry", 0, 10, 15, false); + nullbit *sample2 = new nullbit("/test/dirty", 10, 20, 25, true); + ls.push_back(sample); + ls.push_back(sample2); +} + +/** + * + */ + 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 ae074a4997bd..b4d36c45aea8 100644 --- a/src/test/encoding/types.h +++ b/src/test/encoding/types.h @@ -136,6 +136,8 @@ TYPE(EImportStart) #include "mds/events/EMetaBlob.h" TYPE(EMetaBlob::fullbit) TYPE(EMetaBlob::remotebit) +TYPE(EMetaBlob::nullbit) + #ifdef WITH_RADOSGW