summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYehuda Sadeh <yehuda@inktank.com>2013-05-22 10:34:16 -0700
committerYehuda Sadeh <yehuda@inktank.com>2013-05-22 10:34:16 -0700
commitb35fafb6492fb63680de2c5f9f76c7a3e519dc25 (patch)
treecb23758a781ed7ef7e532828a68bbb1d072dde59
parent669e45eaaa8b7364c60666940a4e3f1df56dccf1 (diff)
downloadceph-b35fafb6492fb63680de2c5f9f76c7a3e519dc25.tar.gz
rgw: pre-generate bucket object version before creating it
Use this version when creating the bucket instead of letting the objclass auto-generate it, so that we could return it to the slave region when creating its bucket on the master. Signed-off-by: Yehuda Sadeh <yehuda@inktank.com>
-rw-r--r--src/rgw/rgw_bucket.cc2
-rw-r--r--src/rgw/rgw_common.h2
-rw-r--r--src/rgw/rgw_op.cc3
-rw-r--r--src/rgw/rgw_rados.cc13
-rw-r--r--src/rgw/rgw_rados.h1
5 files changed, 18 insertions, 3 deletions
diff --git a/src/rgw/rgw_bucket.cc b/src/rgw/rgw_bucket.cc
index be59ec53623..4cc5ca33e81 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& display
rgw_bucket& bucket = bucket_info.bucket;
- ret = store->create_bucket(user_id, bucket, attrs);
+ ret = store->create_bucket(user_id, bucket, attrs, objv_tracker);
if (ret && ret != -EEXIST)
goto done;
diff --git a/src/rgw/rgw_common.h b/src/rgw/rgw_common.h
index fcbef98fc7f..82d1689a6fd 100644
--- a/src/rgw/rgw_common.h
+++ b/src/rgw/rgw_common.h
@@ -641,6 +641,8 @@ struct RGWObjVersionTracker {
read_version = write_version;
write_version = obj_version();
}
+
+ void generate_new_write_ver(CephContext *cct);
};
/** Store all the state necessary to complete and respond to an HTTP request*/
diff --git a/src/rgw/rgw_op.cc b/src/rgw/rgw_op.cc
index 7a870236890..fe293c0ef99 100644
--- a/src/rgw/rgw_op.cc
+++ b/src/rgw/rgw_op.cc
@@ -885,7 +885,8 @@ 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, attrs, true);
+ RGWObjVersionTracker objv_tracker;
+ ret = store->create_bucket(s->user.user_id, s->bucket, attrs, objv_tracker, 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;
diff --git a/src/rgw/rgw_rados.cc b/src/rgw/rgw_rados.cc
index 30ce936aa90..74ff3a4b14a 100644
--- a/src/rgw/rgw_rados.cc
+++ b/src/rgw/rgw_rados.cc
@@ -458,6 +458,15 @@ void RGWObjManifest::append(RGWObjManifest& m)
obj_size += m.obj_size;
}
+void RGWObjVersionTracker::generate_new_write_ver(CephContext *cct)
+{
+ write_version.ver = 1;
+#define TAG_LEN 24
+
+ write_version.tag.clear();
+ append_rand_alpha(cct, write_version.tag, write_version.tag, TAG_LEN);
+}
+
class RGWWatcher : public librados::WatchCtx {
RGWRados *rados;
public:
@@ -1335,6 +1344,7 @@ int RGWRados::create_pool(rgw_bucket& bucket)
*/
int RGWRados::create_bucket(string& owner, rgw_bucket& bucket,
map<std::string, bufferlist>& attrs,
+ RGWObjVersionTracker& objv_tracker,
bool exclusive)
{
int ret = 0;
@@ -1374,7 +1384,8 @@ int RGWRados::create_bucket(string& owner, rgw_bucket& bucket,
if (r < 0 && r != -EEXIST)
return r;
- RGWObjVersionTracker objv_tracker;
+ objv_tracker.generate_new_write_ver(cct);
+
RGWBucketInfo info;
info.bucket = bucket;
info.owner = owner;
diff --git a/src/rgw/rgw_rados.h b/src/rgw/rgw_rados.h
index 50e450f63e8..2db6f7be88b 100644
--- a/src/rgw/rgw_rados.h
+++ b/src/rgw/rgw_rados.h
@@ -643,6 +643,7 @@ public:
*/
virtual int create_bucket(string& owner, rgw_bucket& bucket,
map<std::string,bufferlist>& attrs,
+ RGWObjVersionTracker& objv_tracker,
bool exclusive = true);
virtual int add_bucket_placement(std::string& new_pool);
virtual int remove_bucket_placement(std::string& new_pool);