]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
ceph_objectstore_tool: Add past_intervals to export/import code
authorDavid Zafman <david.zafman@inktank.com>
Thu, 7 Aug 2014 18:46:08 +0000 (11:46 -0700)
committerDavid Zafman <dzafman@redhat.com>
Thu, 28 Aug 2014 23:22:15 +0000 (16:22 -0700)
Signed-off-by: David Zafman <david.zafman@inktank.com>
src/tools/ceph_objectstore_tool.cc

index 13aa8566d2c984e401d68e77b318c76143883893..d415a87d6757db2f2a4e54a93655a81d39d2aa1f 100644 (file)
@@ -306,31 +306,39 @@ struct metadata_section {
   epoch_t map_epoch;
   pg_info_t info;
   pg_log_t log;
+  map<epoch_t,pg_interval_t> past_intervals;
 
   metadata_section(__u8 struct_ver, epoch_t map_epoch, const pg_info_t &info,
-                  const pg_log_t &log)
+                  const pg_log_t &log, map<epoch_t,pg_interval_t> &past_intervals)
     : struct_ver(struct_ver),
       map_epoch(map_epoch),
       info(info),
-      log(log) { }
+      log(log),
+      past_intervals(past_intervals) { }
   metadata_section()
     : struct_ver(0),
       map_epoch(0) { }
 
   void encode(bufferlist& bl) const {
-    ENCODE_START(1, 1, bl);
+    ENCODE_START(2, 1, bl);
     ::encode(struct_ver, bl);
     ::encode(map_epoch, bl);
     ::encode(info, bl);
     ::encode(log, bl);
+    ::encode(past_intervals, bl);
     ENCODE_FINISH(bl);
   }
   void decode(bufferlist::iterator& bl) {
-    DECODE_START(1, bl);
+    DECODE_START(2, bl);
     ::decode(struct_ver, bl);
     ::decode(map_epoch, bl);
     ::decode(info, bl);
     ::decode(log, bl);
+    if (struct_v > 1) {
+      ::decode(past_intervals, bl);
+    } else {
+      cout << "NOTICE: Older export without past_intervals" << std::endl;
+    }
     DECODE_FINISH(bl);
   }
 };
@@ -590,11 +598,10 @@ int footer::get_footer()
 }
 
 int write_info(ObjectStore::Transaction &t, epoch_t epoch, pg_info_t &info,
-    __u8 struct_ver)
+    __u8 struct_ver, map<epoch_t,pg_interval_t> &past_intervals)
 {
   //Empty for this
   interval_set<snapid_t> snap_collections; // obsolete
-  map<epoch_t,pg_interval_t> past_intervals;
   coll_t coll(info.pgid);
 
   int ret = PG::_write_info(t, epoch,
@@ -616,9 +623,9 @@ void write_log(ObjectStore::Transaction &t, pg_log_t &log)
 }
 
 int write_pg(ObjectStore::Transaction &t, epoch_t epoch, pg_info_t &info,
-    pg_log_t &log, __u8 struct_ver)
+    pg_log_t &log, __u8 struct_ver, map<epoch_t,pg_interval_t> &past_intervals)
 {
-  int ret = write_info(t, epoch, info, struct_ver);
+  int ret = write_info(t, epoch, info, struct_ver, past_intervals);
   if (ret) return ret;
   write_log(t, log);
   return 0;
@@ -780,7 +787,8 @@ void write_super()
 }
 
 int do_export(ObjectStore *fs, coll_t coll, spg_t pgid, pg_info_t &info,
-    epoch_t map_epoch, __u8 struct_ver, const OSDSuperblock& superblock)
+    epoch_t map_epoch, __u8 struct_ver, const OSDSuperblock& superblock,
+    map<epoch_t,pg_interval_t> &past_intervals)
 {
   PGLog::IndexedLog log;
   pg_missing_t missing;
@@ -804,7 +812,7 @@ int do_export(ObjectStore *fs, coll_t coll, spg_t pgid, pg_info_t &info,
     return ret;
   }
 
-  metadata_section ms(struct_ver, map_epoch, info, log);
+  metadata_section ms(struct_ver, map_epoch, info, log, past_intervals);
   ret = write_section(TYPE_PG_METADATA, ms, file_fd);
   if (ret)
     return ret;
@@ -1021,7 +1029,7 @@ int get_pg_metadata(ObjectStore *store, coll_t coll, bufferlist &bl)
   coll_t newcoll(ms.info.pgid);
   t->collection_rename(coll, newcoll);
 
-  int ret = write_pg(*t, ms.map_epoch, ms.info, ms.log, ms.struct_ver);
+  int ret = write_pg(*t, ms.map_epoch, ms.info, ms.log, ms.struct_ver, ms.past_intervals);
   if (ret) return ret;
 
   store->apply_transaction(*t);
@@ -2152,7 +2160,7 @@ int main(int argc, char **argv)
       cerr << "struct_v " << (int)struct_ver << std::endl;
 
     if (op == "export") {
-      ret = do_export(fs, coll, pgid, info, map_epoch, struct_ver, superblock);
+      ret = do_export(fs, coll, pgid, info, map_epoch, struct_ver, superblock, past_intervals);
       if (ret == 0 && file_fd != STDOUT_FILENO)
         cout << "Export successful" << std::endl;
     } else if (op == "info") {