summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYehuda Sadeh <yehuda@inktank.com>2013-05-29 13:09:45 -0700
committerYehuda Sadeh <yehuda@inktank.com>2013-05-29 13:09:45 -0700
commit81a9608640aeae878cb27b4d6a78cde0e4b02151 (patch)
tree8a38a8c6270c79ad021822168bf6d2db16243dcc
parentf03a6f2142707292837457e3543b9d80decfe98b (diff)
downloadceph-81a9608640aeae878cb27b4d6a78cde0e4b02151.tar.gz
rgw: forward delete_bucket to master region
Signed-off-by: Yehuda Sadeh <yehuda@inktank.com>
-rw-r--r--src/rgw/rgw_bucket.cc9
-rw-r--r--src/rgw/rgw_bucket.h2
-rw-r--r--src/rgw/rgw_op.cc60
-rw-r--r--src/rgw/rgw_op.h2
-rw-r--r--src/rgw/rgw_rados.cc4
-rw-r--r--src/rgw/rgw_rados.h3
-rw-r--r--src/rgw/rgw_rest_s3.cc9
7 files changed, 60 insertions, 29 deletions
diff --git a/src/rgw/rgw_bucket.cc b/src/rgw/rgw_bucket.cc
index de0d7b6c0c9..6048359b821 100644
--- a/src/rgw/rgw_bucket.cc
+++ b/src/rgw/rgw_bucket.cc
@@ -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) {
diff --git a/src/rgw/rgw_bucket.h b/src/rgw/rgw_bucket.h
index 04f0fe71859..2de140db3fd 100644
--- a/src/rgw/rgw_bucket.h
+++ b/src/rgw/rgw_bucket.h
@@ -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.
diff --git a/src/rgw/rgw_op.cc b/src/rgw/rgw_op.cc
index f14d57b37f8..1fc9229ebc7 100644
--- a/src/rgw/rgw_op.cc
+++ b/src/rgw/rgw_op.cc
@@ -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;
}
}
}
diff --git a/src/rgw/rgw_op.h b/src/rgw/rgw_op.h
index 41b8511d9fd..aed43671c75 100644
--- a/src/rgw/rgw_op.h
+++ b/src/rgw/rgw_op.h
@@ -255,6 +255,8 @@ class RGWDeleteBucket : public RGWOp {
protected:
int ret;
+ RGWObjVersionTracker objv_tracker;
+
public:
RGWDeleteBucket() : ret(0) {}
diff --git a/src/rgw/rgw_rados.cc b/src/rgw/rgw_rados.cc
index 05494a407bb..c547f0d0375 100644
--- a/src/rgw/rgw_rados.cc
+++ b/src/rgw/rgw_rados.cc
@@ -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;
diff --git a/src/rgw/rgw_rados.h b/src/rgw/rgw_rados.h
index aea9bb7ada9..5eb300784d1 100644
--- a/src/rgw/rgw_rados.h
+++ b/src/rgw/rgw_rados.h
@@ -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);
diff --git a/src/rgw/rgw_rest_s3.cc b/src/rgw/rgw_rest_s3.cc
index 8ba60c1abef..143ca6ee993 100644
--- a/src/rgw/rgw_rest_s3.cc
+++ b/src/rgw/rgw_rest_s3.cc
@@ -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()