diff options
author | Yehuda Sadeh <yehuda@inktank.com> | 2013-05-22 10:34:16 -0700 |
---|---|---|
committer | Yehuda Sadeh <yehuda@inktank.com> | 2013-05-22 10:34:16 -0700 |
commit | b35fafb6492fb63680de2c5f9f76c7a3e519dc25 (patch) | |
tree | cb23758a781ed7ef7e532828a68bbb1d072dde59 | |
parent | 669e45eaaa8b7364c60666940a4e3f1df56dccf1 (diff) | |
download | ceph-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.cc | 2 | ||||
-rw-r--r-- | src/rgw/rgw_common.h | 2 | ||||
-rw-r--r-- | src/rgw/rgw_op.cc | 3 | ||||
-rw-r--r-- | src/rgw/rgw_rados.cc | 13 | ||||
-rw-r--r-- | src/rgw/rgw_rados.h | 1 |
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); |