From: David Zafman Date: Sat, 31 Jan 2015 00:11:13 +0000 (-0800) Subject: ceph-objectstore-tool: Add --no-overwrite flag for import-rados X-Git-Tag: v9.0.2~168^2~8 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=35cdcabbdad7dc7249029630c64022c822c67ddc;p=ceph.git ceph-objectstore-tool: Add --no-overwrite flag for import-rados Signed-off-by: David Zafman --- diff --git a/src/tools/ceph_objectstore_tool.cc b/src/tools/ceph_objectstore_tool.cc index eb7d0d52d3f3..e72bd3e70184 100644 --- a/src/tools/ceph_objectstore_tool.cc +++ b/src/tools/ceph_objectstore_tool.cc @@ -1279,13 +1279,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::iterator i; bufferlist abl; + bool skipping; data_section ds; attr_section as; @@ -1308,12 +1309,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) { @@ -1321,17 +1328,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; @@ -1381,7 +1394,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; @@ -1398,7 +1411,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; @@ -1411,7 +1424,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") @@ -1432,7 +1445,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) { @@ -1446,7 +1459,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) { @@ -1460,7 +1473,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) { @@ -1662,7 +1675,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; @@ -1760,7 +1773,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: @@ -2462,7 +2475,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; @@ -2488,6 +2501,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"); @@ -2536,6 +2550,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; @@ -2586,7 +2603,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);