]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: forward delete_bucket to master region
authorYehuda Sadeh <yehuda@inktank.com>
Wed, 29 May 2013 20:09:45 +0000 (13:09 -0700)
committerYehuda Sadeh <yehuda@inktank.com>
Wed, 29 May 2013 20:09:45 +0000 (13:09 -0700)
Signed-off-by: Yehuda Sadeh <yehuda@inktank.com>
src/rgw/rgw_bucket.cc
src/rgw/rgw_bucket.h
src/rgw/rgw_op.cc
src/rgw/rgw_op.h
src/rgw/rgw_rados.cc
src/rgw/rgw_rados.h
src/rgw/rgw_rest_s3.cc

index de0d7b6c0c9d335171cdf7388a7c648d0af1f396..6048359b821793a2ae0f5b20fec4d1652648ced3 100644 (file)
@@ -317,7 +317,9 @@ int rgw_remove_bucket(RGWRados *store, rgw_bucket& bucket, bool delete_children)
     }
   }
 
-  ret = store->delete_bucket(bucket);
+  RGWObjVersionTracker objv_tracker;
+
+  ret = store->delete_bucket(bucket, objv_tracker);
   if (ret < 0) {
     lderr(store->ctx()) << "ERROR: could not remove bucket " << bucket.name << dendl;
     return ret;
@@ -331,9 +333,8 @@ int rgw_remove_bucket(RGWRados *store, rgw_bucket& bucket, bool delete_children)
   return ret;
 }
 
-int rgw_bucket_delete_bucket_obj(RGWRados *store, string& bucket_name)
+int rgw_bucket_delete_bucket_obj(RGWRados *store, string& bucket_name, RGWObjVersionTracker& objv_tracker)
 {
-  RGWObjVersionTracker objv_tracker;
   return store->meta_mgr->remove_entry(bucket_meta_handler, bucket_name, &objv_tracker);
 }
 
@@ -1335,7 +1336,7 @@ public:
       return r;
     }
 
-    return store->delete_bucket(bucket);
+    return store->delete_bucket(bucket, objv_tracker);
   }
 
   void get_pool_and_oid(RGWRados *store, string& key, rgw_bucket& bucket, string& oid) {
index 04f0fe718598d197b091e150b5294bf8298ee926..2de140db3fd000486b6f12a5dc987d1c479e22e6 100644 (file)
@@ -25,7 +25,7 @@ extern void rgw_get_buckets_obj(string& user_id, string& buckets_obj_id);
 extern int rgw_bucket_store_info(RGWRados *store, string& bucket_name, bufferlist& bl, bool exclusive,
                                  map<string, bufferlist> *pattrs, RGWObjVersionTracker *objv_tracker);
 
-extern int rgw_bucket_delete_bucket_obj(RGWRados *store, string& bucket_name);
+extern int rgw_bucket_delete_bucket_obj(RGWRados *store, string& bucket_name, RGWObjVersionTracker& objv_tracker);
 
 /**
  * Store a list of the user's buckets, with associated functinos.
index f14d57b37f85498a34ec1db53a2192cc1ad7aa86..1fc9229ebc759019e053d67028bb8c401c8b725f 100644 (file)
@@ -846,6 +846,28 @@ int RGWCreateBucket::verify_permission()
   return 0;
 }
 
+template<class T>
+static int forward_request(struct req_state *s, RGWRados *store, bufferlist& in_data, const char *name, T& obj)
+{
+  ldout(s->cct, 0) << "sending create_bucket request to master region" << dendl;
+  bufferlist response;
+#define MAX_REST_RESPONSE (128 * 1024) // we expect a very small response
+  int ret = store->rest_conn->forward(s->user.user_id, s->info, MAX_REST_RESPONSE, &in_data, &response);
+  if (ret < 0)
+    return ret;
+
+  ldout(s->cct, 20) << "response: " << response.c_str() << dendl;
+  JSONParser jp;
+  ret = jp.parse(response.c_str(), response.length());
+  if (ret < 0) {
+    ldout(s->cct, 0) << "failed parsing response from master region" << dendl;
+    return ret;
+  }
+  JSONDecoder::decode_json(name, obj, &jp);
+
+  return 0;
+}
+
 void RGWCreateBucket::execute()
 {
   RGWAccessControlPolicy old_policy(s->cct);
@@ -878,23 +900,10 @@ void RGWCreateBucket::execute()
   }
 
   if (!store->region.is_master) {
-    ldout(s->cct, 0) << "sending create_bucket request to master region" << dendl;
-    bufferlist response;
-#define MAX_REST_RESPONSE (128 * 1024) // we expect a very small response
-    ret = store->rest_conn->forward(s->user.user_id, s->info, MAX_REST_RESPONSE, &in_data, &response);
+    ret = forward_request(s, store, in_data, "object_ver", objv);
     if (ret < 0)
       return;
 
-    ldout(s->cct, 20) << "response: " << response.c_str() << dendl;
-    JSONParser jp;
-    ret = jp.parse(response.c_str(), response.length());
-    if (ret < 0) {
-      ldout(s->cct, 0) << "failed parsing response from master region" << dendl;
-      return;
-    }
-    JSONDecoder::decode_json("object_ver", objv, &jp);
-    pobjv = &objv;
-
     ldout(s->cct, 20) << "parsed: objv.tag=" << objv.tag << " objv.ver=" << objv.ver << dendl;
   }
 
@@ -965,14 +974,23 @@ void RGWDeleteBucket::execute()
 {
   ret = -EINVAL;
 
-  if (s->bucket_name) {
-    ret = store->delete_bucket(s->bucket);
+  if (!s->bucket_name)
+    return;
 
-    if (ret == 0) {
-      ret = rgw_remove_user_bucket_info(store, s->user.user_id, s->bucket);
-      if (ret < 0) {
-        ldout(s->cct, 0) << "WARNING: failed to remove bucket: ret=" << ret << dendl;
-      }
+  if (!store->region.is_master) {
+    bufferlist in_data;
+    ret = forward_request(s, store, in_data, "object_ver", objv_tracker.read_version);
+    if (ret < 0) {
+      return;
+    }
+  }
+
+  ret = store->delete_bucket(s->bucket, objv_tracker);
+
+  if (ret == 0) {
+    ret = rgw_remove_user_bucket_info(store, s->user.user_id, s->bucket);
+    if (ret < 0) {
+      ldout(s->cct, 0) << "WARNING: failed to remove bucket: ret=" << ret << dendl;
     }
   }
 }
index 41b8511d9fd8e86600619b992f581cfee566c8a6..aed43671c758478a4f84304eef2fe37d94a7500a 100644 (file)
@@ -255,6 +255,8 @@ class RGWDeleteBucket : public RGWOp {
 protected:
   int ret;
 
+  RGWObjVersionTracker objv_tracker;
+
 public:
   RGWDeleteBucket() : ret(0) {}
 
index 05494a407bb3453d1d50572e5fb7a3b76864582b..c547f0d037537013a58a9d61914f2ed7e5322e50 100644 (file)
@@ -2101,7 +2101,7 @@ done_err:
  * bucket: the name of the bucket to delete
  * Returns 0 on success, -ERR# otherwise.
  */
-int RGWRados::delete_bucket(rgw_bucket& bucket)
+int RGWRados::delete_bucket(rgw_bucket& bucket, RGWObjVersionTracker& objv_tracker)
 {
   librados::IoCtx index_ctx;
   string oid;
@@ -2131,7 +2131,7 @@ int RGWRados::delete_bucket(rgw_bucket& bucket)
     }
   } while (is_truncated);
 
-  r = rgw_bucket_delete_bucket_obj(this, bucket.name);
+  r = rgw_bucket_delete_bucket_obj(this, bucket.name, objv_tracker);
   if (r < 0)
     return r;
 
index aea9bb7ada955d6d7272922249c4d82964e38527..5eb300784d17e22c0ace92349c9ff83ff2c96243 100644 (file)
@@ -784,7 +784,8 @@ public:
    * Delete a bucket.
    * bucket: the name of the bucket to delete
    * Returns 0 on success, -ERR# otherwise.
-   */  virtual int delete_bucket(rgw_bucket& bucket);
+   */
+  virtual int delete_bucket(rgw_bucket& bucket, RGWObjVersionTracker& objv_tracker);
 
   int set_bucket_owner(rgw_bucket& bucket, ACLOwner& owner);
   int set_buckets_enabled(std::vector<rgw_bucket>& buckets, bool enabled);
index 8ba60c1abefa0f57f12e39a60f701e7ca4c7238b..143ca6ee99308e8f37b7f2ecab736300542a5ac3 100644 (file)
@@ -431,6 +431,15 @@ void RGWDeleteBucket_ObjStore_S3::send_response()
   set_req_state_err(s, r);
   dump_errno(s);
   end_header(s);
+
+  if (s->system_request) {
+    JSONFormatter f; /* use json formatter for system requests output */
+
+    f.open_object_section("info");
+    encode_json("object_ver", objv_tracker.read_version, &f);
+    f.close_section();
+    rgw_flush_formatter_and_reset(s, &f);
+  }
 }
 
 int RGWPutObj_ObjStore_S3::get_params()