From: J. Eric Ivancich Date: Tue, 30 Nov 2021 19:26:15 +0000 (-0500) Subject: rgw: "reshard cancel" errors with "invalid argument" X-Git-Tag: v17.2.6~90^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=4e9453931c4f9eea2cc052b09277ffa8723cb1f0;p=ceph.git rgw: "reshard cancel" errors with "invalid argument" When `radosgw-admin reshard cancel ...` was used on a bucket that is not currently undergoing resharding, it would error out. Now it will then try to unschedule any reshards for the bucket in the so-called "reshard log". It will error out if there is neither an underway resharding nor a scheduled resharding. Signed-off-by: J. Eric Ivancich (cherry picked from commit cacddbb83d23fe6ba2d42e1497d0ff49fb880154) --- diff --git a/src/rgw/rgw_admin.cc b/src/rgw/rgw_admin.cc index a18ac23d780..a10c185af2f 100644 --- a/src/rgw/rgw_admin.cc +++ b/src/rgw/rgw_admin.cc @@ -7661,6 +7661,8 @@ next: } } + bool resharding_underway = true; + if (bucket_initable) { // we did not encounter an error, so let's work with the bucket RGWBucketReshard br(static_cast(store), bucket->get_info(), bucket->get_attrs(), @@ -7669,14 +7671,17 @@ next: if (ret < 0) { if (ret == -EBUSY) { cerr << "There is ongoing resharding, please retry after " << - store->ctx()->_conf.get_val( - "rgw_reshard_bucket_lock_duration") << - " seconds " << std::endl; + store->ctx()->_conf.get_val("rgw_reshard_bucket_lock_duration") << + " seconds." << std::endl; + return -ret; + } else if (ret == -EINVAL) { + resharding_underway = false; + // we can continue and try to unschedule } else { - cerr << "Error canceling bucket " << bucket_name << - " resharding: " << cpp_strerror(-ret) << std::endl; + cerr << "Error cancelling bucket \"" << bucket_name << + "\" resharding: " << cpp_strerror(-ret) << std::endl; + return -ret; } - return ret; } } @@ -7685,13 +7690,22 @@ next: cls_rgw_reshard_entry entry; entry.tenant = tenant; entry.bucket_name = bucket_name; - //entry.bucket_id = bucket_id; ret = reshard.remove(dpp(), entry); - if (ret < 0 && ret != -ENOENT) { - cerr << "Error in updating reshard log with bucket " << - bucket_name << ": " << cpp_strerror(-ret) << std::endl; - return ret; + if (ret == -ENOENT) { + if (!resharding_underway) { + cerr << "Error, bucket \"" << bucket_name << + "\" is neither undergoing resharding nor scheduled to undergo " + "resharding." << std::endl; + return EINVAL; + } else { + // we cancelled underway resharding above, so we're good + return 0; + } + } else if (ret < 0) { + cerr << "Error in updating reshard log with bucket \"" << + bucket_name << "\": " << cpp_strerror(-ret) << std::endl; + return -ret; } } // OPT_RESHARD_CANCEL