From 34f7c7155cb73dccf37e6174b276d976b358e407 Mon Sep 17 00:00:00 2001 From: Greg Farnum Date: Thu, 17 Jan 2013 10:04:08 -0800 Subject: [PATCH] mds: inode_back{trace,pointer}_t now uses modern encoding Signed-off-by: Sage Weil Signed-off-by: Greg Farnum --- src/Makefile.am | 1 + src/mds/inode_backtrace.cc | 105 +++++++++++++++++++++++++++++++++++++ src/mds/inode_backtrace.h | 40 ++++++-------- 3 files changed, 121 insertions(+), 25 deletions(-) create mode 100644 src/mds/inode_backtrace.cc diff --git a/src/Makefile.am b/src/Makefile.am index 6e5054822acdf..402386d1868ea 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -1278,6 +1278,7 @@ libcommon_files = \ osd/OSDMap.cc \ osd/osd_types.cc \ mds/MDSMap.cc \ + mds/inode_backtrace.cc \ common/blkdev.cc \ common/common_init.cc \ common/pipe.c \ diff --git a/src/mds/inode_backtrace.cc b/src/mds/inode_backtrace.cc new file mode 100644 index 0000000000000..c0457b28ff7d2 --- /dev/null +++ b/src/mds/inode_backtrace.cc @@ -0,0 +1,105 @@ +// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- +// vim: ts=8 sw=2 smarttab + +#include "inode_backtrace.h" + +#include "common/Formatter.h" + +/* inode_backpointer_t */ + +void inode_backpointer_t::encode(bufferlist& bl) const +{ + ENCODE_START(2, 2, bl); + ::encode(dirino, bl); + ::encode(dname, bl); + ::encode(version, bl); + ENCODE_FINISH(bl); +} + +void inode_backpointer_t::decode(bufferlist::iterator& bl) +{ + DECODE_START_LEGACY_COMPAT_LEN(2, 2, 2, bl); + ::decode(dirino, bl); + ::decode(dname, bl); + ::decode(version, bl); + DECODE_FINISH(bl); +} + +void inode_backpointer_t::decode_old(bufferlist::iterator& bl) +{ + ::decode(dirino, bl); + ::decode(dname, bl); + ::decode(version, bl); +} + +void inode_backpointer_t::dump(Formatter *f) const +{ + f->dump_unsigned("dirino", dirino); + f->dump_string("dname", dname); + f->dump_unsigned("version", version); +} + +void inode_backpointer_t::generate_test_instances(list& ls) +{ + ls.push_back(new inode_backpointer_t); + ls.push_back(new inode_backpointer_t); + ls.back()->dirino = 1; + ls.back()->dname = "foo"; + ls.back()->version = 123; +} + + +/* + * inode_backtrace_t + */ + +void inode_backtrace_t::encode(bufferlist& bl) const +{ + ENCODE_START(4, 4, bl); + ::encode(ino, bl); + ::encode(ancestors, bl); + ENCODE_FINISH(bl); +} + +void inode_backtrace_t::decode(bufferlist::iterator& bl) +{ + DECODE_START_LEGACY_COMPAT_LEN(4, 4, 4, bl); + if (struct_v < 3) + return; // sorry, the old data was crap + ::decode(ino, bl); + if (struct_v >= 4) { + ::decode(ancestors, bl); + } else { + __u32 n; + ::decode(n, bl); + while (n--) { + ancestors.push_back(inode_backpointer_t()); + ancestors.back().decode_old(bl); + } + } + DECODE_FINISH(bl); +} + +void inode_backtrace_t::dump(Formatter *f) const +{ + f->dump_unsigned("ino", ino); + f->open_array_section("ancestors"); + for (vector::const_iterator p = ancestors.begin(); p != ancestors.end(); ++p) { + f->open_object_section("backpointer"); + p->dump(f); + f->close_section(); + } + f->close_section(); +} + +void inode_backtrace_t::generate_test_instances(list& ls) +{ + ls.push_back(new inode_backtrace_t); + ls.push_back(new inode_backtrace_t); + ls.back()->ino = 1; + ls.back()->ancestors.push_back(inode_backpointer_t()); + ls.back()->ancestors.back().dirino = 123; + ls.back()->ancestors.back().dname = "bar"; + ls.back()->ancestors.back().version = 456; +} + diff --git a/src/mds/inode_backtrace.h b/src/mds/inode_backtrace.h index 24ca30983a249..6b512913fd917 100644 --- a/src/mds/inode_backtrace.h +++ b/src/mds/inode_backtrace.h @@ -3,6 +3,12 @@ #ifndef CEPH_INODE_BACKTRACE_H #define CEPH_INODE_BACKTRACE_H +#include "mdstypes.h" + +namespace ceph { + class Formatter; +} + /** metadata backpointers **/ /* @@ -21,16 +27,11 @@ struct inode_backpointer_t { inode_backpointer_t() : version(0) {} inode_backpointer_t(inodeno_t i, const string &d, version_t v) : dirino(i), dname(d), version(v) {} - void encode(bufferlist& bl) const { - ::encode(dirino, bl); - ::encode(dname, bl); - ::encode(version, bl); - } - void decode(bufferlist::iterator& bl) { - ::decode(dirino, bl); - ::decode(dname, bl); - ::decode(version, bl); - } + void encode(bufferlist& bl) const; + void decode(bufferlist::iterator &bl); + void decode_old(bufferlist::iterator &bl); + void dump(Formatter *f) const; + static void generate_test_instances(list& ls); }; WRITE_CLASS_ENCODER(inode_backpointer_t) @@ -47,21 +48,10 @@ struct inode_backtrace_t { inodeno_t ino; // my ino vector ancestors; - void encode(bufferlist& bl) const { - __u8 v = 3; - ::encode(v, bl); - ::encode(ino, bl); - ::encode(ancestors, bl); - } - - void decode(bufferlist::iterator& bl) { - __u8 v; - ::decode(v, bl); - if (v < 3) - return; // sorry, the old data was crap - ::decode(ino, bl); - ::decode(ancestors, bl); - } + void encode(bufferlist& bl) const; + void decode(bufferlist::iterator &bl); + void dump(Formatter *f) const; + static void generate_test_instances(list& ls); }; WRITE_CLASS_ENCODER(inode_backtrace_t) -- 2.39.5