From: Zhang Shaowen Date: Mon, 20 Mar 2017 07:19:22 +0000 (+0800) Subject: rgw: delete non-empty buckets in slave zonegroup returns error but the X-Git-Tag: v12.0.2~321^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=4714b17f53a9f30f7f155a69cfbfc682f809b4e4;p=ceph-ci.git rgw: delete non-empty buckets in slave zonegroup returns error but the buckets have actually been deleted. Fixes: http://tracker.ceph.com/issues/19313 Signed-off-by: Zhang Shaowen --- diff --git a/src/rgw/rgw_op.cc b/src/rgw/rgw_op.cc index b7ee0beba23..9c265456802 100644 --- a/src/rgw/rgw_op.cc +++ b/src/rgw/rgw_op.cc @@ -2519,6 +2519,11 @@ void RGWDeleteBucket::execute() if ( op_ret < 0) { ldout(s->cct, 1) << "WARNING: failed to sync user stats before bucket delete: op_ret= " << op_ret << dendl; } + + op_ret = store->check_bucket_empty(s->bucket_info); + if (op_ret < 0) { + return; + } if (!store->is_meta_master()) { bufferlist in_data; @@ -2534,7 +2539,7 @@ void RGWDeleteBucket::execute() } } - op_ret = store->delete_bucket(s->bucket_info, ot); + op_ret = store->delete_bucket(s->bucket_info, ot, false); if (op_ret == -ECANCELED) { // lost a race, either with mdlog sync or another delete bucket operation. diff --git a/src/rgw/rgw_rados.cc b/src/rgw/rgw_rados.cc index e193b9909cb..cbd046da78f 100644 --- a/src/rgw/rgw_rados.cc +++ b/src/rgw/rgw_rados.cc @@ -7764,21 +7764,9 @@ bool RGWRados::is_syncing_bucket_meta(const rgw_bucket& bucket) return true; } - -/** - * Delete a bucket. - * bucket: the name of the bucket to delete - * Returns 0 on success, -ERR# otherwise. - */ -int RGWRados::delete_bucket(RGWBucketInfo& bucket_info, RGWObjVersionTracker& objv_tracker) -{ - const rgw_bucket& bucket = bucket_info.bucket; - librados::IoCtx index_ctx; - map bucket_objs; - int r = open_bucket_index(bucket_info, index_ctx, bucket_objs); - if (r < 0) - return r; +int RGWRados::check_bucket_empty(RGWBucketInfo& bucket_info) +{ std::map ent_map; rgw_obj_index_key marker; string prefix; @@ -7786,7 +7774,7 @@ int RGWRados::delete_bucket(RGWBucketInfo& bucket_info, RGWObjVersionTracker& ob do { #define NUM_ENTRIES 1000 - r = cls_bucket_list(bucket_info, RGW_NO_SHARD, marker, prefix, NUM_ENTRIES, true, ent_map, + int r = cls_bucket_list(bucket_info, RGW_NO_SHARD, marker, prefix, NUM_ENTRIES, true, ent_map, &is_truncated, &marker); if (r < 0) return r; @@ -7800,7 +7788,30 @@ int RGWRados::delete_bucket(RGWBucketInfo& bucket_info, RGWObjVersionTracker& ob return -ENOTEMPTY; } } while (is_truncated); - + return 0; +} + +/** + * Delete a bucket. + * bucket: the name of the bucket to delete + * Returns 0 on success, -ERR# otherwise. + */ +int RGWRados::delete_bucket(RGWBucketInfo& bucket_info, RGWObjVersionTracker& objv_tracker, bool check_empty) +{ + const rgw_bucket& bucket = bucket_info.bucket; + librados::IoCtx index_ctx; + map bucket_objs; + int r = open_bucket_index(bucket_info, index_ctx, bucket_objs); + if (r < 0) + return r; + + if (check_empty) { + r = check_bucket_empty(bucket_info); + if (r < 0) { + return r; + } + } + r = rgw_bucket_delete_bucket_obj(this, bucket.tenant, bucket.name, objv_tracker); if (r < 0) return r; @@ -7822,7 +7833,6 @@ int RGWRados::delete_bucket(RGWBucketInfo& bucket_info, RGWObjVersionTracker& ob return 0; } - int RGWRados::set_bucket_owner(rgw_bucket& bucket, ACLOwner& owner) { RGWBucketInfo info; diff --git a/src/rgw/rgw_rados.h b/src/rgw/rgw_rados.h index 1d07470602a..ad6c09e1391 100644 --- a/src/rgw/rgw_rados.h +++ b/src/rgw/rgw_rados.h @@ -3067,13 +3067,15 @@ public: string *ptag, ceph::buffer::list *petag, struct rgw_err *err); + + int check_bucket_empty(RGWBucketInfo& bucket_info); /** * Delete a bucket. * bucket: the name of the bucket to delete * Returns 0 on success, -ERR# otherwise. */ - int delete_bucket(RGWBucketInfo& bucket_info, RGWObjVersionTracker& objv_tracker); + int delete_bucket(RGWBucketInfo& bucket_info, RGWObjVersionTracker& objv_tracker, bool check_empty = true); bool is_meta_master();