]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
rgw: delete non-empty buckets in slave zonegroup returns error but the
authorZhang Shaowen <zhangshaowen@cmss.chinamobile.com>
Mon, 20 Mar 2017 07:19:22 +0000 (15:19 +0800)
committerZhang Shaowen <zhangshaowen@cmss.chinamobile.com>
Mon, 20 Mar 2017 08:20:57 +0000 (16:20 +0800)
buckets have actually been deleted.

Fixes: http://tracker.ceph.com/issues/19313
Signed-off-by: Zhang Shaowen <zhangshaowen@cmss.chinamobile.com>
src/rgw/rgw_op.cc
src/rgw/rgw_rados.cc
src/rgw/rgw_rados.h

index b7ee0beba238c0147b09cec0c39806543990ce7a..9c26545680224ee7346bc248a7f52a6eb99ab31a 100644 (file)
@@ -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.
index e193b9909cb1861a6f34f7b7e6b1ae345b942071..cbd046da78f45ae7513c834cb9a7fb7e572ff501 100644 (file)
@@ -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<int, string> 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<string, rgw_bucket_dir_entry> 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<int, string> 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;
index 1d07470602a21d0c3478758dfe00a2376c55373b..ad6c09e13911992ac3b451758dbb59035a539a1d 100644 (file)
@@ -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();