diff options
author | Yehuda Sadeh <yehuda@inktank.com> | 2013-05-29 13:09:45 -0700 |
---|---|---|
committer | Yehuda Sadeh <yehuda@inktank.com> | 2013-05-29 13:09:45 -0700 |
commit | 81a9608640aeae878cb27b4d6a78cde0e4b02151 (patch) | |
tree | 8a38a8c6270c79ad021822168bf6d2db16243dcc | |
parent | f03a6f2142707292837457e3543b9d80decfe98b (diff) | |
download | ceph-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.cc | 9 | ||||
-rw-r--r-- | src/rgw/rgw_bucket.h | 2 | ||||
-rw-r--r-- | src/rgw/rgw_op.cc | 60 | ||||
-rw-r--r-- | src/rgw/rgw_op.h | 2 | ||||
-rw-r--r-- | src/rgw/rgw_rados.cc | 4 | ||||
-rw-r--r-- | src/rgw/rgw_rados.h | 3 | ||||
-rw-r--r-- | src/rgw/rgw_rest_s3.cc | 9 |
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() |