summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYehuda Sadeh <yehuda@inktank.com>2013-06-14 22:58:08 -0700
committerYehuda Sadeh <yehuda@inktank.com>2013-06-14 22:58:08 -0700
commit5df39aa49027a8cb72cec6efced6428b6d6ba74c (patch)
tree534a550cc45fd885f16fc8e8c38448e72d87a9b5
parent622f50027f3ecd3a4b057fa62c702c3b73fcfbc3 (diff)
downloadceph-5df39aa49027a8cb72cec6efced6428b6d6ba74c.tar.gz
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 <yehuda@inktank.com>
-rw-r--r--src/rgw/rgw_bucket.cc3
-rw-r--r--src/rgw/rgw_op.cc31
-rw-r--r--src/rgw/rgw_op.h1
-rw-r--r--src/rgw/rgw_rados.cc18
-rw-r--r--src/rgw/rgw_rados.h1
-rw-r--r--src/rgw/rgw_rest_s3.cc2
6 files changed, 38 insertions, 18 deletions
diff --git a/src/rgw/rgw_bucket.cc b/src/rgw/rgw_bucket.cc
index 8b4d29c3270..e38c94aea5e 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 6bdd3a30628..a7ac04977fb 100644
--- a/src/rgw/rgw_op.cc
+++ b/src/rgw/rgw_op.cc
@@ -855,8 +855,7 @@ int RGWCreateBucket::verify_permission()
return 0;
}
-template<class T>
-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 919d93582ae..2431cb17222 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 33ff04900ed..635608e92f0 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<std::string, bufferlist>& 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 8652eacd219..b0181560dfe 100644
--- a/src/rgw/rgw_rados.h
+++ b/src/rgw/rgw_rados.h
@@ -779,6 +779,7 @@ public:
map<std::string,bufferlist>& 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 b58e70ed0a9..9496fe01d3e 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);
}