]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: reshard cancel command should clear the resharding flag
authorOrit Wasserman <owasserm@redhat.com>
Tue, 27 Mar 2018 15:26:01 +0000 (18:26 +0300)
committerOrit Wasserman <owasserm@redhat.com>
Thu, 29 Mar 2018 11:03:43 +0000 (14:03 +0300)
Fixes: http://tracker.ceph.com/issues/21619
Signed-off-by: Orit Wasserman <owasserm@redhat.com>
src/rgw/rgw_admin.cc
src/rgw/rgw_reshard.cc
src/rgw/rgw_reshard.h

index d7c43cc066230b499643599ccefe5e13ab08c7ba..786c7efdc00bd31196d36c81384e85cf43c671f0 100644 (file)
@@ -5850,30 +5850,47 @@ next:
   }
 
   if (opt_cmd == OPT_RESHARD_CANCEL) {
-    RGWReshard reshard(store);
-
     if (bucket_name.empty()) {
       cerr << "ERROR: bucket not specified" << std::endl;
       return EINVAL;
     }
-    cls_rgw_reshard_entry entry;
-    //entry.tenant = tenant;
-    entry.bucket_name = bucket_name;
-    //entry.bucket_id = bucket_id;
-    int ret = reshard.get(entry);
+
+    rgw_bucket bucket;
+    RGWBucketInfo bucket_info;
+    map<string, bufferlist> attrs;
+    ret = init_bucket(tenant, bucket_name, bucket_id, bucket_info, bucket, &attrs);
     if (ret < 0) {
-      cerr << "Error in getting bucket " << bucket_name << ": " << cpp_strerror(-ret) << std::endl;
-      return ret;
+      cerr << "ERROR: could not init bucket: " << cpp_strerror(-ret) << std::endl;
+      return -ret;
     }
 
-    /* TBD stop running resharding */
-
-    ret =reshard.remove(entry);
+    RGWBucketReshard br(store, bucket_info, attrs);
+    int ret = br.cancel();
     if (ret < 0) {
-      cerr << "Error removing bucket " << bucket_name << " for resharding queue: " << cpp_strerror(-ret) <<
+      cerr << "Error canceling bucket " << bucket_name << " resharding: " << cpp_strerror(-ret) <<
        std::endl;
       return ret;
     }
+
+    RGWReshard reshard(store);
+
+    cls_rgw_reshard_entry entry;
+    //entry.tenant = tenant;
+    entry.bucket_name = bucket_name;
+    //entry.bucket_id = bucket_id;
+
+    ret = reshard.get(entry);
+    if (ret < 0 && ret != -ENOENT) {
+      cerr << "Error in getting bucket " << bucket_name << ": " << cpp_strerror(-ret) << std::endl;
+      return ret;
+    } else if (ret != -ENOENT) {
+      ret = reshard.remove(entry);
+      if (ret < 0) {
+       cerr << "Error removing bucket " << bucket_name << " from resharding queue: " << cpp_strerror(-ret) <<
+         std::endl;
+       return ret;
+      }
+    }
   }
 
   if (opt_cmd == OPT_OBJECT_UNLINK) {
index 04e95aabfd1835b4f58dcf75002d7d3b68a462e8..5ea9b3859a6d41b56fcdc5e2c60035d3c21a7e36 100644 (file)
@@ -292,6 +292,19 @@ int RGWBucketReshard::create_new_bucket_instance(int new_num_shards,
   return ::create_new_bucket_instance(store, new_num_shards, bucket_info, bucket_attrs, new_bucket_info);
 }
 
+int RGWBucketReshard::cancel()
+{
+  int ret = lock_bucket();
+  if (ret < 0) {
+    return ret;
+  }
+
+  ret = clear_resharding();
+
+  unlock_bucket();
+  return 0;
+}
+
 class BucketInfoReshardUpdate
 {
   RGWRados *store;
index e5d658531c8a01b7cb2039f30b445f5c00a63068..6fe43129906f0fdd642d37594c3895a693a7d076 100644 (file)
@@ -46,6 +46,7 @@ public:
              RGWReshard *reshard_log = nullptr);
   int abort();
   int get_status(std::list<cls_rgw_bucket_instance_entry> *status);
+  int cancel();
 };
 
 class RGWReshard {