]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
ceph_objectstore_tool: Fix import-rados skipping of snapshots
authorDavid Zafman <dzafman@redhat.com>
Wed, 10 Dec 2014 02:09:04 +0000 (18:09 -0800)
committerDavid Zafman <dzafman@redhat.com>
Tue, 3 Mar 2015 19:20:59 +0000 (11:20 -0800)
Signed-off-by: David Zafman <dzafman@redhat.com>
(cherry picked from commit fe936026ed87c9f95f3b7ad235b24c22e8de5f55)

src/tools/ceph_objectstore_tool.cc

index 74c0fcb242b17e243c4d8b8fb5074f688131ff94..0a3ab3fd9504c24faaab84faf635ecd81f74598a 100644 (file)
@@ -1123,6 +1123,40 @@ int get_omap(ObjectStore *store, coll_t coll, ghobject_t hoid,
   return 0;
 }
 
+int skip_object(bufferlist &bl)
+{
+  bufferlist::iterator ebliter = bl.begin();
+  bufferlist ebl;
+  bool done = false;
+  while(!done) {
+    sectiontype_t type;
+    int ret = read_section(file_fd, &type, &ebl);
+    if (ret)
+      return ret;
+
+    ebliter = ebl.begin();
+    if (type >= END_OF_TYPES) {
+      cout << "Skipping unknown object section type" << std::endl;
+      continue;
+    }
+    switch(type) {
+    case TYPE_DATA:
+    case TYPE_ATTRS:
+    case TYPE_OMAP_HDR:
+    case TYPE_OMAP:
+      if (debug)
+        cerr << "Skip type " << (int)type << std::endl;
+      break;
+    case TYPE_OBJECT_END:
+      done = true;
+      break;
+    default:
+      return EFAULT;
+    }
+  }
+  return 0;
+}
+
 int get_object_rados(librados::IoCtx &ioctx, bufferlist &bl)
 {
   bufferlist::iterator ebliter = bl.begin();
@@ -1138,6 +1172,8 @@ int get_object_rados(librados::IoCtx &ioctx, bufferlist &bl)
 
   if (!ob.hoid.hobj.is_head()) {
     cout << "Skipping non-head for " << ob.hoid << std::endl;
+    skip_object(bl);
+    return 0;
   }
 
   ioctx.set_namespace(ob.hoid.hobj.get_namespace());