]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: set bucket marker and bucket obj version from master
authorYehuda Sadeh <yehuda@inktank.com>
Sat, 15 Jun 2013 05:58:08 +0000 (22:58 -0700)
committerYehuda Sadeh <yehuda@inktank.com>
Sat, 15 Jun 2013 05:58:08 +0000 (22:58 -0700)
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>
src/rgw/rgw_bucket.cc
src/rgw/rgw_op.cc
src/rgw/rgw_op.h
src/rgw/rgw_rados.cc
src/rgw/rgw_rados.h
src/rgw/rgw_rest_s3.cc

index 8b4d29c32709abdfa6f4b099d6b357e54deb6ecb..e38c94aea5e1b271361400c3197eaea7c74b0086 100644 (file)
@@ -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;
index 6bdd3a306287d2267994d1214560493264b5e9dc..a7ac04977fb023674d285fd6ec63188d4fb7ea1d 100644 (file)
@@ -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);
index 919d93582ae00a7b3de93b740c4612b077107dc6..2431cb172229eeab77d359ab4a42fc6506f8cec2 100644 (file)
@@ -234,6 +234,7 @@ protected:
   RGWAccessControlPolicy policy;
   string location_constraint;
   RGWObjVersionTracker objv_tracker;
+  rgw_bucket bucket;
 
   bufferlist in_data;
 
index 33ff04900ed93e2c73f1e5fc60964e0de608757e..635608e92f0dbb5c0d2a67e3047ff203615f526a 100644 (file)
@@ -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);
index 8652eacd219143edc256515311ab5646c50c6b20..b0181560dfe12f01c283b548a23c50c77ce52ec6 100644 (file)
@@ -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);
index b58e70ed0a9a000b55c5abc9844aeb69680174bc..9496fe01d3e1008b3138244308e404a02f544b4f 100644 (file)
@@ -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);
   }