]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
ceph-objectstore-tool: fix SnapMapper vs import
authorSage Weil <sage@redhat.com>
Thu, 8 Feb 2018 17:16:22 +0000 (11:16 -0600)
committerSage Weil <sage@redhat.com>
Mon, 12 Feb 2018 20:35:28 +0000 (14:35 -0600)
- keep mapper around for duration of import
- flush in-flight requests before tearing it down.  This is necessary
because the mapper still uses onreadable.

Signed-off-by: Sage Weil <sage@redhat.com>
src/tools/ceph_objectstore_tool.cc
src/tools/ceph_objectstore_tool.h

index c84d138997783de2f082407551a8ea8ae814656f..e10613ba98e14d39a3cb6392a26070d03d3328d3 100644 (file)
@@ -1072,6 +1072,8 @@ int ObjectStoreTool::dump_object(Formatter *formatter,
 }
 
 int ObjectStoreTool::get_object(ObjectStore *store,
+                               OSDriver& driver,
+                               SnapMapper& mapper,
                                coll_t coll,
                                bufferlist &bl, OSDMap &curmap,
                                bool *skipped_objects)
@@ -1081,13 +1083,6 @@ int ObjectStoreTool::get_object(ObjectStore *store,
   bufferlist::iterator ebliter = bl.begin();
   object_begin ob;
   ob.decode(ebliter);
-  OSDriver driver(
-    store,
-    coll_t(),
-    OSD::make_snapmapper_oid());
-  spg_t pg;
-  coll.is_pg_prefix(&pg);
-  SnapMapper mapper(g_ceph_context, &driver, 0, 0, 0, pg.shard);
 
   if (ob.hoid.hobj.is_temp()) {
     cerr << "ERROR: Export contains temporary object '" << ob.hoid << "'" << std::endl;
@@ -1714,6 +1709,12 @@ int ObjectStoreTool::do_import(ObjectStore *store, OSDSuperblock& sb,
     store->queue_transaction(ch, std::move(t));
   }
 
+  OSDriver driver(
+    store,
+    coll_t(),
+    OSD::make_snapmapper_oid());
+  SnapMapper mapper(g_ceph_context, &driver, 0, 0, 0, pgid.shard);
+
   cout << "Importing pgid " << pgid;
   if (orig_pgid != pgid) {
     cout << " exported as " << orig_pgid;
@@ -1737,7 +1738,7 @@ int ObjectStoreTool::do_import(ObjectStore *store, OSDSuperblock& sb,
     }
     switch(type) {
     case TYPE_OBJECT_BEGIN:
-      ret = get_object(store, coll, ebl, curmap, &skipped_objects);
+      ret = get_object(store, driver, mapper, coll, ebl, curmap, &skipped_objects);
       if (ret) return ret;
       break;
     case TYPE_PG_METADATA:
@@ -1832,6 +1833,8 @@ int ObjectStoreTool::do_import(ObjectStore *store, OSDSuperblock& sb,
     store->queue_transaction(ch, std::move(t));
   }
 
+  // make sure we flush onreadable items before mapper/driver are destroyed.
+  ch->flush();
   return 0;
 }
 
index 74565ba36f2261ac4f1fcb81ac8aafc5ef20c146..3db61df9afba3b9e7e945abe13d8c6bb6e0eb312 100644 (file)
@@ -34,7 +34,7 @@ class ObjectStoreTool : public RadosDump
     int dump_object(Formatter *formatter,
                                bufferlist &bl);
     int get_object(
-      ObjectStore *store, coll_t coll,
+      ObjectStore *store, OSDriver& driver, SnapMapper& mapper, coll_t coll,
       bufferlist &bl, OSDMap &curmap, bool *skipped_objects);
     int export_file(
         ObjectStore *store, coll_t cid, ghobject_t &obj);