]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: delete non-empty buckets in slave zonegroup returns error but the 15477/head
authorZhang Shaowen <zhangshaowen@cmss.chinamobile.com>
Mon, 20 Mar 2017 07:19:22 +0000 (15:19 +0800)
committerNathan Cutler <ncutler@suse.com>
Mon, 19 Jun 2017 18:59:28 +0000 (20:59 +0200)
buckets have actually been deleted.

Fixes: http://tracker.ceph.com/issues/19313
Signed-off-by: Zhang Shaowen <zhangshaowen@cmss.chinamobile.com>
(cherry picked from commit 4714b17f53a9f30f7f155a69cfbfc682f809b4e4)

Conflicts:
        src/rgw/rgw_op.cc - first argument to delete_bucket() and
            check_bucket_empty() is "s->bucket" in jewel (master:
            "s->bucket_info")
        src/rgw/rgw_rados.cc - RGWRados::delete_bucket() takes bucket instead
            of bucket_info; adapt RGWRados::check_bucket_empty() to take bucket
            instead of bucket_info as well
src/rgw/rgw_rados.h - ditto

src/rgw/rgw_op.cc
src/rgw/rgw_rados.cc
src/rgw/rgw_rados.h

index 3af17ddcdecaca558e613b9ee4dec6be9982e18f..1eb616baf2b81b13003445ff15b62b6b7d7755b8 100644 (file)
@@ -2190,6 +2190,11 @@ void RGWDeleteBucket::execute()
      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);
+  if (op_ret < 0) {
+    return;
+  }
+
   if (!store->is_meta_master()) {
     bufferlist in_data;
     op_ret = forward_request_to_master(s, &ot.read_version, store, in_data,
@@ -2204,7 +2209,7 @@ void RGWDeleteBucket::execute()
     }
   }
 
-  op_ret = store->delete_bucket(s->bucket, ot);
+  op_ret = store->delete_bucket(s->bucket, ot, false);
 
   if (op_ret == -ECANCELED) {
     // lost a race, either with mdlog sync or another delete bucket operation.
index fd3e54c017c72713abb5e77f5817df8c06230125..9b85af3996e07ceee8e4113df0eac0daf44a5515 100644 (file)
@@ -7388,20 +7388,9 @@ bool RGWRados::is_syncing_bucket_meta(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(rgw_bucket& bucket, RGWObjVersionTracker& objv_tracker)
-{
-  librados::IoCtx index_ctx;
-  map<int, string> bucket_objs;
-  int r = open_bucket_index(bucket, index_ctx, bucket_objs);
-  if (r < 0)
-    return r;
 
+int RGWRados::check_bucket_empty(rgw_bucket& bucket)
+{
   std::map<string, RGWObjEnt> ent_map;
   rgw_obj_key marker;
   string prefix;
@@ -7409,7 +7398,7 @@ int RGWRados::delete_bucket(rgw_bucket& bucket, RGWObjVersionTracker& objv_track
 
   do {
 #define NUM_ENTRIES 1000
-    r = cls_bucket_list(bucket, RGW_NO_SHARD, marker, prefix, NUM_ENTRIES, true, ent_map,
+    int r = cls_bucket_list(bucket, RGW_NO_SHARD, marker, prefix, NUM_ENTRIES, true, ent_map,
                         &is_truncated, &marker);
     if (r < 0)
       return r;
@@ -7425,7 +7414,29 @@ int RGWRados::delete_bucket(rgw_bucket& bucket, RGWObjVersionTracker& objv_track
         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(rgw_bucket& bucket, RGWObjVersionTracker& objv_tracker, bool check_empty)
+{
+  librados::IoCtx index_ctx;
+  map<int, string> bucket_objs;
+  int r = open_bucket_index(bucket, index_ctx, bucket_objs);
+  if (r < 0)
+    return r;
+
+  if (check_empty) {
+    r = check_bucket_empty(bucket);
+    if (r < 0) {
+      return r;
+    }
+  }
+  
   r = rgw_bucket_delete_bucket_obj(this, bucket.tenant, bucket.name, objv_tracker);
   if (r < 0)
     return r;
@@ -7447,7 +7458,6 @@ int RGWRados::delete_bucket(rgw_bucket& bucket, RGWObjVersionTracker& objv_track
   return 0;
 }
 
-
 int RGWRados::set_bucket_owner(rgw_bucket& bucket, ACLOwner& owner)
 {
   RGWBucketInfo info;
index 6a63a03a63663e43c76d2fc4cb65a11b862169f2..3fcdae9055e74b2c6d00bde7336b7a14e64e2ce6 100644 (file)
@@ -2621,12 +2621,14 @@ public:
                string *petag,
                struct rgw_err *err);
 
+  int check_bucket_empty(rgw_bucket& bucket);
+
   /**
    * Delete a bucket.
    * bucket: the name of the bucket to delete
    * Returns 0 on success, -ERR# otherwise.
    */
-  virtual int delete_bucket(rgw_bucket& bucket, RGWObjVersionTracker& objv_tracker);
+  virtual int delete_bucket(rgw_bucket& bucket, RGWObjVersionTracker& objv_tracker, bool check_empty = true);
 
   bool is_meta_master();