]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
radosgw-admin: implement reshard execute command
authorOrit Wasserman <owasserm@redhat.com>
Thu, 13 Apr 2017 09:47:33 +0000 (12:47 +0300)
committerYehuda Sadeh <yehuda@redhat.com>
Mon, 5 Jun 2017 20:17:33 +0000 (13:17 -0700)
Signed-off-by: Orit Wasserman <owasserm@redhat.com>
src/rgw/rgw_admin.cc

index e6bb443bdc2d6332d8df3ebfa4ccbca6f7d4ccca..478f1124c1d9994cc0dd7d3a587a05943fa833e4 100644 (file)
@@ -2434,7 +2434,6 @@ int create_new_bucket_instance(RGWRados *store,
                               RGWBucketInfo& new_bucket_info)
 {
 
-  new_bucket_info = bucket_info;
   store->create_bucket_id(&new_bucket_info.bucket.bucket_id);
   new_bucket_info.bucket.oid.clear();
 
@@ -2494,7 +2493,7 @@ int reshard_bucket(RGWRados *store,
     cout << "total entries:";
   }
 
-     int num_source_shards = (bucket_info.num_shards > 0 ? bucket_info.num_shards : 1);
+  int num_source_shards = (bucket_info.num_shards > 0 ? bucket_info.num_shards : 1);
   string marker;
   for (int i = 0; i < num_source_shards; ++i) {
     bool is_truncated = true;
@@ -5861,7 +5860,7 @@ next:
       return ret;
     }
 
-    RGWBucketInfo new_bucket_info;
+    RGWBucketInfo new_bucket_info(bucket_info);
     ret = create_new_bucket_instance(store, num_shards, bucket_info, attrs,
                                     new_bucket_info);
     if (ret < 0) {
@@ -5952,32 +5951,62 @@ next:
       cerr << "ERROR: bucket not specified" << std::endl;
       return EINVAL;
     }
+
+    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: could not init bucket: " << cpp_strerror(-ret) << std::endl;
+      return -ret;
+    }
+
     cls_rgw_reshard_entry entry;
-    //entry.tenant = tenant;
+    entry.tenant = tenant;
     entry.bucket_name = bucket_name;
-    //entry.bucket_id = bucket_id;
+    entry.bucket_id = bucket_info.bucket.bucket_id;
+
     int ret = reshard.get(entry);
     if (ret < 0) {
-      cerr << "Error in getting bucket " << bucket_name << ": " << cpp_strerror(-ret) << std::endl;
+      cerr << "Error in getting entry for bucket " << bucket_name << ": " << cpp_strerror(-ret) << std::endl;
       return ret;
     }
 
-    rgw_bucket bucket;
-    RGWBucketInfo bucket_info;
-    map<string, bufferlist> attrs;
-    ret = init_bucket(tenant, entry.bucket_name, bucket_id, bucket_info, bucket, &attrs);
+    RGWBucketInfo new_bucket_info(bucket_info);
+    ret = create_new_bucket_instance(store, entry.new_num_shards, bucket_info, attrs,
+                                    new_bucket_info);
     if (ret < 0) {
-      cerr << "ERROR: could not init bucket: " << cpp_strerror(-ret) << std::endl;
-      return -ret;
+      return ret;
+    }
+
+    entry.new_instance_id = entry.bucket_name + ":" + new_bucket_info.bucket.bucket_id;
+    ret = reshard.add(entry);
+    if (ret < 0) {
+      cerr << "Error in updateing entry bucket " << bucket_name << ": " << cpp_strerror(-ret) << std::endl;
+      return ret;
     }
 
-    RGWBucketInfo new_bucket_info;
-    ret = reshard_bucket(store, formatter, entry.new_num_shards, bucket, bucket_info,new_bucket_info,
+    ret = reshard.set_bucket_resharding(bucket_info.bucket.oid, entry);
+    if (ret < 0) {
+      cerr << "Error in setting resharding flag for bucket " << bucket_name << ": " << cpp_strerror(-ret)
+          << std::endl;
+      return ret;
+    }
+
+    ret = reshard_bucket(store, formatter, entry.new_num_shards, bucket, bucket_info, new_bucket_info,
                         max_entries, bucket_op, verbose);
     if (ret < 0) {
       return ret;
     }
 
+    ret = reshard.clear_bucket_resharding(new_bucket_info.bucket.oid,
+                                       entry);
+    if (ret < 0) {
+      cerr << "Error in clearing resharding flag for bucket " << bucket_name << ": " << cpp_strerror(-ret)
+          << std::endl;
+      return ret;
+    }
+
     ret =reshard.remove(entry);
     if (ret < 0) {
       cerr << "Error removing bucket " << bucket_name << " for resharding queue: " << cpp_strerror(-ret) <<