]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
ceph-objectstore-tool: Add --no-overwrite flag for import-rados
authorDavid Zafman <dzafman@redhat.com>
Sat, 31 Jan 2015 00:11:13 +0000 (16:11 -0800)
committerDavid Zafman <dzafman@redhat.com>
Thu, 25 Feb 2016 20:50:21 +0000 (12:50 -0800)
Signed-off-by: David Zafman <dzafman@redhat.com>
(cherry picked from commit 35cdcabbdad7dc7249029630c64022c822c67ddc)

src/tools/ceph_objectstore_tool.cc

index 61d20f02714edf4da409457ce3116cd05a980f4d..8c08455e4436a99f4425c9f9be5eef0bf3ec32c9 100644 (file)
@@ -1278,13 +1278,14 @@ int skip_object(bufferlist &bl)
   return 0;
 }
 
-int get_object_rados(librados::IoCtx &ioctx, bufferlist &bl)
+int get_object_rados(librados::IoCtx &ioctx, bufferlist &bl, bool no_overwrite)
 {
   bufferlist::iterator ebliter = bl.begin();
   object_begin ob;
   ob.decode(ebliter);
   map<string,bufferptr>::iterator i;
   bufferlist abl;
+  bool skipping;
 
   data_section ds;
   attr_section as;
@@ -1307,12 +1308,18 @@ int get_object_rados(librados::IoCtx &ioctx, bufferlist &bl)
   ioctx.set_namespace(ob.hoid.hobj.get_namespace());
 
   string msg("Write");
+  skipping = false;
   if (dry_run) {
     uint64_t psize;
     time_t pmtime;
     int ret = ioctx.stat(ob.hoid.hobj.oid.name, &psize, &pmtime);
-    if (ret == 0)
-      msg = "***Overwrite***";
+    if (ret == 0) {
+      if (no_overwrite)
+        // Could set skipping, but dry-run doesn't change anything either
+        msg = "Skipping existing";
+      else
+        msg = "***Overwrite***";
+    }
   } else {
     int ret = ioctx.create(ob.hoid.hobj.oid.name, true);
     if (ret && ret != -EEXIST) {
@@ -1320,17 +1327,23 @@ int get_object_rados(librados::IoCtx &ioctx, bufferlist &bl)
       return ret;
     }
     if (ret == -EEXIST) {
-      msg = "***Overwrite***";
-      ret = ioctx.remove(ob.hoid.hobj.oid.name);
-      if (ret < 0) {
-        cerr << "remove failed: " << cpp_strerror(ret) << std::endl;
-        return ret;
-      }
-      ret = ioctx.create(ob.hoid.hobj.oid.name, true);
-      if (ret < 0) {
-        cerr << "create failed: " << cpp_strerror(ret) << std::endl;
-        return ret;
+      if (no_overwrite) {
+        msg = "Skipping existing";
+        skipping = true;
+      } else {
+        msg = "***Overwrite***";
+        ret = ioctx.remove(ob.hoid.hobj.oid.name);
+        if (ret < 0) {
+          cerr << "remove failed: " << cpp_strerror(ret) << std::endl;
+          return ret;
+        }
+        ret = ioctx.create(ob.hoid.hobj.oid.name, true);
+        if (ret < 0) {
+          cerr << "create failed: " << cpp_strerror(ret) << std::endl;
+          return ret;
+        }
       }
+    }
   }
 
   cout << msg << " " << ob.hoid << std::endl;
@@ -1380,7 +1393,7 @@ int get_object_rados(librados::IoCtx &ioctx, bufferlist &bl)
         if (databl.length() >= alignment) {
           uint64_t rndlen = uint64_t(databl.length() / alignment) * alignment;
           if (debug) cerr << "write offset=" << out_offset << " len=" << rndlen << std::endl;
-          if (!dry_run) {
+          if (!dry_run && !skipping) {
             ret = ioctx.write(ob.hoid.hobj.oid.name, databl, rndlen, out_offset);
             if (ret) {
               cerr << "write failed: " << cpp_strerror(ret) << std::endl;
@@ -1397,7 +1410,7 @@ int get_object_rados(librados::IoCtx &ioctx, bufferlist &bl)
         }
         break;
       }
-      if (!dry_run) {
+      if (!dry_run && !skipping) {
         ret = ioctx.write(ob.hoid.hobj.oid.name, ds.databl, ds.len, ds.offset);
         if (ret) {
           cerr << "write failed: " << cpp_strerror(ret) << std::endl;
@@ -1410,7 +1423,7 @@ int get_object_rados(librados::IoCtx &ioctx, bufferlist &bl)
 
       if (debug)
         cerr << "\tattrs: len " << as.data.size() << std::endl;
-      if (dry_run)
+      if (dry_run || skipping)
         break;
       for (i = as.data.begin(); i != as.data.end(); ++i) {
         if (i->first == "_" || i->first == "snapset")
@@ -1431,7 +1444,7 @@ int get_object_rados(librados::IoCtx &ioctx, bufferlist &bl)
       if (debug)
         cerr << "\tomap header: " << string(oh.hdr.c_str(), oh.hdr.length())
           << std::endl;
-      if (dry_run)
+      if (dry_run || skipping)
         break;
       ret = ioctx.omap_set_header(ob.hoid.hobj.oid.name, oh.hdr);
       if (ret) {
@@ -1445,7 +1458,7 @@ int get_object_rados(librados::IoCtx &ioctx, bufferlist &bl)
 
       if (debug)
         cerr << "\tomap: size " << os.omap.size() << std::endl;
-      if (dry_run)
+      if (dry_run || skipping)
         break;
       ret = ioctx.omap_set(ob.hoid.hobj.oid.name, os.omap);
       if (ret) {
@@ -1459,7 +1472,7 @@ int get_object_rados(librados::IoCtx &ioctx, bufferlist &bl)
       if (need_align && databl.length() > 0) {
         assert(databl.length() < alignment);
         if (debug) cerr << "END write offset=" << out_offset << " len=" << databl.length() << std::endl;
-        if (dry_run)
+        if (dry_run || skipping)
           break;
         ret = ioctx.write(ob.hoid.hobj.oid.name, databl, databl.length(), out_offset);
         if (ret) {
@@ -1661,7 +1674,7 @@ int get_pg_metadata(ObjectStore *store, bufferlist &bl, metadata_section &ms,
   return 0;
 }
 
-int do_import_rados(string pool)
+int do_import_rados(string pool, bool no_overwrite)
 {
   bufferlist ebl;
   pg_info_t info;
@@ -1759,7 +1772,7 @@ int do_import_rados(string pool)
     }
     switch(type) {
     case TYPE_OBJECT_BEGIN:
-      ret = get_object_rados(ioctx, ebl);
+      ret = get_object_rados(ioctx, ebl, no_overwrite);
       if (ret) return ret;
       break;
     case TYPE_PG_METADATA:
@@ -2461,7 +2474,7 @@ int main(int argc, char **argv)
   string dpath, jpath, pgidstr, op, file, object, objcmd, arg1, arg2, type, format;
   spg_t pgid;
   ghobject_t ghobj;
-  bool human_readable;
+  bool human_readable, no_overwrite;
   bool force;
   Formatter *formatter;
 
@@ -2487,6 +2500,7 @@ int main(int argc, char **argv)
     ("skip-journal-replay", "Disable journal replay")
     ("skip-mount-omap", "Disable mounting of omap")
     ("dry-run", "Don't modify the objectstore")
+    ("no-overwrite", "For import-rados don't overwrite existing files")
     ;
 
   po::options_description positional("Positional options");
@@ -2535,6 +2549,9 @@ int main(int argc, char **argv)
     force = true;
   }
 
+  no_overwrite = false;
+  if (vm.count("no-overwrite"))
+    no_overwrite = true;
   if (vm.count("dry-run"))
     dry_run = true;
   osflagbits_t flags = 0;
@@ -2585,7 +2602,7 @@ int main(int argc, char **argv)
     global_init(NULL, ceph_options, CEPH_ENTITY_TYPE_CLIENT, CODE_ENVIRONMENT_UTILITY, 0);
     common_init_finish(g_ceph_context);
 
-    int ret = do_import_rados(pool);
+    int ret = do_import_rados(pool, no_overwrite);
     if (ret == 0)
       cout << "Import successful" << std::endl;
     myexit(ret != 0);