]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: inode_back{trace,pointer}_t now uses modern encoding
authorGreg Farnum <greg@inktank.com>
Thu, 17 Jan 2013 18:04:08 +0000 (10:04 -0800)
committerGreg Farnum <greg@inktank.com>
Tue, 5 Feb 2013 21:29:05 +0000 (13:29 -0800)
Signed-off-by: Sage Weil <sage@inktank.com>
Signed-off-by: Greg Farnum <greg@inktank.com>
src/Makefile.am
src/mds/inode_backtrace.cc [new file with mode: 0644]
src/mds/inode_backtrace.h

index 6e5054822acdf619cfec3125366ec6719fd108e7..402386d1868ea509634a887adda2a825ac558953 100644 (file)
@@ -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 (file)
index 0000000..c0457b2
--- /dev/null
@@ -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<inode_backpointer_t*>& 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<inode_backpointer_t>::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<inode_backtrace_t*>& 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;
+}
+
index 24ca30983a249e3c269eea05b975b23ed17f9b9f..6b512913fd9172b41a17a4bbebd2aa94c68b692d 100644 (file)
@@ -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<inode_backpointer_t*>& ls);
 };
 WRITE_CLASS_ENCODER(inode_backpointer_t)
 
@@ -47,21 +48,10 @@ struct inode_backtrace_t {
   inodeno_t ino;       // my ino
   vector<inode_backpointer_t> 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<inode_backtrace_t*>& ls);
 };
 WRITE_CLASS_ENCODER(inode_backtrace_t)