From: Yehuda Sadeh Date: Wed, 22 May 2013 17:34:16 +0000 (-0700) Subject: rgw: pre-generate bucket object version before creating it X-Git-Tag: v0.67-rc1~128^2~108 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=b35fafb6492fb63680de2c5f9f76c7a3e519dc25;p=ceph.git 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 --- 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& 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& 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);