]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: pre-generate bucket object version before creating it
authorYehuda Sadeh <yehuda@inktank.com>
Wed, 22 May 2013 17:34:16 +0000 (10:34 -0700)
committerYehuda Sadeh <yehuda@inktank.com>
Wed, 22 May 2013 17:34:16 +0000 (10:34 -0700)
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>
src/rgw/rgw_bucket.cc
src/rgw/rgw_common.h
src/rgw/rgw_op.cc
src/rgw/rgw_rados.cc
src/rgw/rgw_rados.h

index be59ec5362362679101c979df1e980c6ecae1281..4cc5ca33e81497aba59d4713e97ff4663259f267 100644 (file)
@@ -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;
 
index fcbef98fc7faa745cd82e1a056ebefeb56200234..82d1689a6fda25f8c8c8738fd8f9f985271d7ca0 100644 (file)
@@ -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*/
index 7a870236890c4fc7770078947aec38d300706a3b..fe293c0ef9972d7e670f2fcc17a60247108ab107 100644 (file)
@@ -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;
index 30ce936aa904b9b3d331afa71ab7ce0c17d2e9fa..74ff3a4b14a1160dce668aaaf6daf40913683881 100644 (file)
@@ -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;
index 50e450f63e829563ff502709bd901a3aafa79b3e..2db6f7be88bd8cbc7c7f40e600fd2f2a4099b449 100644 (file)
@@ -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);