]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
rados: implement rm --force option to force remove when full.
authorXiaowei Chen <cxwshawn@gmail.com>
Fri, 11 Dec 2015 08:26:42 +0000 (03:26 -0500)
committerXiaowei Chen <cxwshawn@gmail.com>
Fri, 11 Dec 2015 08:26:45 +0000 (03:26 -0500)
           librados extend remove interface, add flags parameter, and use
            this extended interface to implement force remove when cluster full.
Signed-off-by: Xiaowei Chen <chen.xiaowei@h3c.com>
qa/workunits/rados/test_rados_tool.sh
src/include/rados/librados.hpp
src/librados/IoCtxImpl.cc
src/librados/IoCtxImpl.h
src/librados/librados.cc
src/tools/rados/rados.cc

index 43651c7ea4c48eab7f3c3f5d364f513b9714759c..bfe7d274e5810b0821d94ba8e03e103e7f84f91e 100755 (executable)
@@ -304,9 +304,24 @@ test_xattr() {
     rm $V1 $V2
     cleanup
 }
+test_rmobj() {
+    p=`uuidgen`
+    ceph osd pool create $p 1
+    ceph osd pool set-quota $p max_objects 1
+    V1=`mktemp fooattrXXXXXXX`
+    rados put $OBJ $V1 -p $p
+    while ! ceph osd dump | grep 'full max_objects'
+    do
+       sleep 2
+    done
+    rados -p $p rm $OBJ --force-full
+    rados rmpool $p $p --yes-i-really-really-mean-it
+    rm $V1
+}
 
 test_xattr
 test_omap
+test_rmobj
 
 echo "SUCCESS!"
 exit 0
index 0af06544dde8f2e5b5dd73bbf2907f00cc046eb7..9df123ccca0f377ba5b5892787b6ccf9215f7822 100644 (file)
@@ -677,6 +677,7 @@ namespace librados
                    size_t len);
     int read(const std::string& oid, bufferlist& bl, size_t len, uint64_t off);
     int remove(const std::string& oid);
+    int remove(const std::string& oid, int flags);
     int trunc(const std::string& oid, uint64_t size);
     int mapext(const std::string& o, uint64_t off, size_t len, std::map<uint64_t,uint64_t>& m);
     int sparse_read(const std::string& o, std::map<uint64_t,uint64_t>& m, bufferlist& bl, size_t len, uint64_t off);
index 3e6821240c873658ac5194042f4fcd24d3a01cc7..12350e9a21c706521026886e5f71c9ca65418601 100644 (file)
@@ -948,6 +948,14 @@ int librados::IoCtxImpl::remove(const object_t& oid)
   return operate(oid, &op, NULL);
 }
 
+int librados::IoCtxImpl::remove(const object_t& oid, int flags)
+{
+  ::ObjectOperation op;
+  prepare_assert_ops(&op);
+  op.remove();
+  return operate(oid, &op, NULL, flags);
+}
+
 int librados::IoCtxImpl::trunc(const object_t& oid, uint64_t size)
 {
   ::ObjectOperation op;
index b0a1b19c2346d477991e555660658884315327f2..8827b90ad8b2f69b3a67288eda2edd524828594e 100644 (file)
@@ -127,6 +127,7 @@ struct librados::IoCtxImpl {
   int sparse_read(const object_t& oid, std::map<uint64_t,uint64_t>& m,
                  bufferlist& bl, size_t len, uint64_t off);
   int remove(const object_t& oid);
+  int remove(const object_t& oid, int flags);
   int stat(const object_t& oid, uint64_t *psize, time_t *pmtime);
   int trunc(const object_t& oid, uint64_t size);
 
index b2d483928bcda6945f065e8a8416c452736681b6..50e131b663fb197a7b8ae663272ca162b96ef466 100644 (file)
@@ -1159,6 +1159,12 @@ int librados::IoCtx::remove(const std::string& oid)
   return io_ctx_impl->remove(obj);
 }
 
+int librados::IoCtx::remove(const std::string& oid, int flags)
+{
+  object_t obj(oid);
+  return io_ctx_impl->remove(obj, flags); 
+}
+
 int librados::IoCtx::trunc(const std::string& oid, uint64_t size)
 {
   object_t obj(oid);
index e90995ec1f8d88d578e730614bfead37835d09d5..d13a3039a5c0891d32aa6084ffded47b7e2d617d 100644 (file)
@@ -84,7 +84,7 @@ void usage(ostream& out)
 "   put <obj-name> [infile]          write object\n"
 "   truncate <obj-name> length       truncate object\n"
 "   create <obj-name>                create object\n"
-"   rm <obj-name> ...                remove object(s)\n"
+"   rm <obj-name> ...[--force-full]  [force no matter full or not]remove object(s)\n"
 "   cp <obj-name> [target-obj]       copy object\n"
 "   clonedata <src-obj> <dst-obj>    clone object data\n"
 "   listxattr <obj-name>\n"
@@ -1239,7 +1239,7 @@ static int rados_tool_common(const std::map < std::string, std::string > &opts,
 
   std::string run_name;
   std::string prefix;
-
+  bool forcefull = false;
   Formatter *formatter = NULL;
   bool pretty_format = false;
   const char *output = NULL;
@@ -1282,6 +1282,11 @@ static int rados_tool_common(const std::map < std::string, std::string > &opts,
   if (i != opts.end()) {
     run_name = i->second;
   }
+
+  i = opts.find("force-full");
+  if (i != opts.end()) {
+    forcefull = true;
+  }
   i = opts.find("prefix");
   if (i != opts.end()) {
     prefix = i->second;
@@ -2146,7 +2151,11 @@ static int rados_tool_common(const std::map < std::string, std::string > &opts,
       if (use_striper) {
        ret = striper.remove(oid);
       } else {
-       ret = io_ctx.remove(oid);
+       if (forcefull) {
+         ret = io_ctx.remove(oid, CEPH_OSD_FLAG_FULL_FORCE);
+       } else {
+         ret = io_ctx.remove(oid);
+       }
       }
       if (ret < 0) {
         string name = (nspace.size() ? nspace + "/" : "" ) + oid;
@@ -2929,6 +2938,8 @@ int main(int argc, const char **argv)
       exit(0);
     } else if (ceph_argparse_flag(args, i, "-f", "--force", (char*)NULL)) {
       opts["force"] = "true";
+    } else if (ceph_argparse_flag(args, i, "--force-full", (char*)NULL)) {
+      opts["force-full"] = "true";
     } else if (ceph_argparse_flag(args, i, "-d", "--delete-after", (char*)NULL)) {
       opts["delete-after"] = "true";
     } else if (ceph_argparse_flag(args, i, "-C", "--create", "--create-pool",