From 5df39aa49027a8cb72cec6efced6428b6d6ba74c Mon Sep 17 00:00:00 2001 From: Yehuda Sadeh Date: Fri, 14 Jun 2013 22:58:08 -0700 Subject: [PATCH] rgw: set bucket marker and bucket obj version from master Make sure that bucket that's created gets the same marker as the one that the master region generated. Also, for some reason we weren't passing in the metadata obj version for the bucket. Signed-off-by: Yehuda Sadeh --- src/rgw/rgw_bucket.cc | 3 +-- src/rgw/rgw_op.cc | 31 +++++++++++++++++++++---------- src/rgw/rgw_op.h | 1 + src/rgw/rgw_rados.cc | 18 ++++++++++++------ src/rgw/rgw_rados.h | 1 + src/rgw/rgw_rest_s3.cc | 2 ++ 6 files changed, 38 insertions(+), 18 deletions(-) diff --git a/src/rgw/rgw_bucket.cc b/src/rgw/rgw_bucket.cc index 8b4d29c32709a..e38c94aea5e1b 100644 --- a/src/rgw/rgw_bucket.cc +++ b/src/rgw/rgw_bucket.cc @@ -146,7 +146,7 @@ int RGWBucket::create_bucket(string bucket_str, string& user_id, string& region_ rgw_bucket& bucket = bucket_info.bucket; - ret = store->create_bucket(user_id, bucket, region_name, attrs, objv_tracker, NULL); + ret = store->create_bucket(user_id, bucket, region_name, attrs, objv_tracker, NULL, NULL); if (ret && ret != -EEXIST) goto done; @@ -1323,7 +1323,6 @@ public: RGWBucketCompleteInfo bci, old_bci; decode_json_obj(bci, obj); - int ret = store->get_bucket_info(NULL, entry, old_bci.info, &objv_tracker, &old_bci.attrs); if (ret < 0 && ret != -ENOENT) return ret; diff --git a/src/rgw/rgw_op.cc b/src/rgw/rgw_op.cc index 6bdd3a306287d..a7ac04977fb02 100644 --- a/src/rgw/rgw_op.cc +++ b/src/rgw/rgw_op.cc @@ -855,8 +855,7 @@ int RGWCreateBucket::verify_permission() return 0; } -template -static int forward_request_to_master(struct req_state *s, RGWRados *store, bufferlist& in_data, const char *name, T& obj) +static int forward_request_to_master(struct req_state *s, RGWRados *store, bufferlist& in_data, JSONParser *jp) { if (!store->rest_master_conn) { ldout(s->cct, 0) << "rest connection is invalid" << dendl; @@ -870,13 +869,11 @@ static int forward_request_to_master(struct req_state *s, RGWRados *store, buffe return ret; ldout(s->cct, 20) << "response: " << response.c_str() << dendl; - JSONParser jp; - ret = jp.parse(response.c_str(), response.length()); + 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; } @@ -912,12 +909,22 @@ void RGWCreateBucket::execute() } } + rgw_bucket master_bucket; + rgw_bucket *pmaster_bucket; + if (!store->region.is_master) { - ret = forward_request_to_master(s, store, in_data, "object_ver", objv); + JSONParser jp; + ret = forward_request_to_master(s, store, in_data, &jp); if (ret < 0) return; + JSONDecoder::decode_json("object_ver", objv, &jp); + JSONDecoder::decode_json("bucket", master_bucket, &jp); ldout(s->cct, 20) << "parsed: objv.tag=" << objv.tag << " objv.ver=" << objv.ver << dendl; + pmaster_bucket = &master_bucket; + pobjv = &objv; + } else { + pmaster_bucket = NULL; } string region_name; @@ -936,7 +943,7 @@ void RGWCreateBucket::execute() attrs[RGW_ATTR_ACL] = aclbl; s->bucket.name = s->bucket_name_str; - ret = store->create_bucket(s->user.user_id, s->bucket, region_name, attrs, objv_tracker, pobjv, true); + ret = store->create_bucket(s->user.user_id, s->bucket, region_name, attrs, objv_tracker, pobjv, pmaster_bucket, true); /* continue if EEXIST and create_bucket will fail below. this way we can recover * from a partial create by retrying it. */ ldout(s->cct, 20) << "rgw_create_bucket returned ret=" << ret << " bucket=" << s->bucket << dendl; @@ -973,6 +980,8 @@ void RGWCreateBucket::execute() if (ret == -EEXIST) ret = -ERR_BUCKET_EXISTS; + + bucket = s->bucket; } int RGWDeleteBucket::verify_permission() @@ -992,10 +1001,12 @@ void RGWDeleteBucket::execute() if (!store->region.is_master) { bufferlist in_data; - ret = forward_request_to_master(s, store, in_data, "object_ver", objv_tracker.read_version); - if (ret < 0) { + JSONParser jp; + ret = forward_request_to_master(s, store, in_data, &jp); + if (ret < 0) return; - } + + JSONDecoder::decode_json("object_ver", objv_tracker.read_version, &jp); } ret = store->delete_bucket(s->bucket, objv_tracker); diff --git a/src/rgw/rgw_op.h b/src/rgw/rgw_op.h index 919d93582ae00..2431cb172229e 100644 --- a/src/rgw/rgw_op.h +++ b/src/rgw/rgw_op.h @@ -234,6 +234,7 @@ protected: RGWAccessControlPolicy policy; string location_constraint; RGWObjVersionTracker objv_tracker; + rgw_bucket bucket; bufferlist in_data; diff --git a/src/rgw/rgw_rados.cc b/src/rgw/rgw_rados.cc index 33ff04900ed93..635608e92f0db 100644 --- a/src/rgw/rgw_rados.cc +++ b/src/rgw/rgw_rados.cc @@ -1680,6 +1680,7 @@ int RGWRados::create_bucket(string& owner, rgw_bucket& bucket, map& attrs, RGWObjVersionTracker& objv_tracker, obj_version *pobjv, + rgw_bucket *pmaster_bucket, bool exclusive) { #define MAX_CREATE_RETRIES 20 /* need to bound retries */ @@ -1699,12 +1700,17 @@ int RGWRados::create_bucket(string& owner, rgw_bucket& bucket, if (r < 0) return r; - uint64_t iid = instance_id(); - uint64_t bid = next_bucket_id(); - char buf[32]; - snprintf(buf, sizeof(buf), "%s.%llu.%llu", zone.name.c_str(), (long long)iid, (long long)bid); - bucket.marker = buf; - bucket.bucket_id = bucket.marker; + if (!pmaster_bucket) { + uint64_t iid = instance_id(); + uint64_t bid = next_bucket_id(); + char buf[32]; + snprintf(buf, sizeof(buf), "%s.%llu.%llu", zone.name.c_str(), (long long)iid, (long long)bid); + bucket.marker = buf; + bucket.bucket_id = bucket.marker; + } else { + bucket.marker = pmaster_bucket->marker; + bucket.bucket_id = pmaster_bucket->bucket_id; + } string dir_oid = dir_oid_prefix; dir_oid.append(bucket.marker); diff --git a/src/rgw/rgw_rados.h b/src/rgw/rgw_rados.h index 8652eacd21914..b0181560dfe12 100644 --- a/src/rgw/rgw_rados.h +++ b/src/rgw/rgw_rados.h @@ -779,6 +779,7 @@ public: map& attrs, RGWObjVersionTracker& objv_tracker, obj_version *pobjv, + rgw_bucket *master_bucket, bool exclusive = true); virtual int add_bucket_placement(std::string& new_pool); virtual int remove_bucket_placement(std::string& new_pool); diff --git a/src/rgw/rgw_rest_s3.cc b/src/rgw/rgw_rest_s3.cc index b58e70ed0a9a0..9496fe01d3e10 100644 --- a/src/rgw/rgw_rest_s3.cc +++ b/src/rgw/rgw_rest_s3.cc @@ -4,6 +4,7 @@ #include "common/ceph_crypto.h" #include "common/Formatter.h" #include "common/utf8.h" +#include "common/ceph_json.h" #include "rgw_rest.h" #include "rgw_rest_s3.h" @@ -429,6 +430,7 @@ void RGWCreateBucket_ObjStore_S3::send_response() f.open_object_section("info"); encode_json("object_ver", objv_tracker.read_version, &f); + encode_json("bucket", bucket, &f); f.close_section(); rgw_flush_formatter_and_reset(s, &f); } -- 2.39.5