]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: fixes to object versioning tracking
authorYehuda Sadeh <yehuda@inktank.com>
Tue, 25 Jun 2013 18:09:19 +0000 (11:09 -0700)
committerYehuda Sadeh <yehuda@inktank.com>
Tue, 25 Jun 2013 18:09:19 +0000 (11:09 -0700)
There are a few different cases for setting the object version.
Either we need to create a new version, or we need to set the
version provided (one metadata put). We also need to make sure
that we log the correct previous version of the object. This
commit fixes a few cases.

Signed-off-by: Yehuda Sadeh <yehuda@inktank.com>
src/rgw/rgw_bucket.cc
src/rgw/rgw_rados.cc
src/rgw/rgw_rados.h

index 05a15d26760b238a971b491a0f07b0da3c95cd22..1e3a17ae6fe833a0c5444333e4aeea7ad2833eba 100644 (file)
@@ -1367,11 +1367,13 @@ public:
 
     time_t orig_mtime;
 
-    int ret = store->get_bucket_entrypoint_info(NULL, entry, old_be, &objv_tracker, &orig_mtime);
+    RGWObjVersionTracker old_ot;
+
+    int ret = store->get_bucket_entrypoint_info(NULL, entry, old_be, &old_ot, &orig_mtime);
     if (ret < 0 && ret != -ENOENT)
       return ret;
 
-    ret = store->put_bucket_entrypoint_info(entry, be, false, mtime);
+    ret = store->put_bucket_entrypoint_info(entry, be, false, objv_tracker, mtime);
     if (ret < 0)
       return ret;
 
@@ -1487,8 +1489,6 @@ public:
 
     time_t orig_mtime;
 
-    old_bci.info.objv_tracker = objv_tracker;
-
     int ret = store->get_bucket_instance_info(NULL, oid, old_bci.info, &orig_mtime, &old_bci.attrs);
     if (ret < 0 && ret != -ENOENT)
       return ret;
@@ -1507,9 +1507,12 @@ public:
       /* existing bucket, keep its placement pools */
       bci.info.bucket.data_pool = old_bci.info.bucket.data_pool;
       bci.info.bucket.index_pool = old_bci.info.bucket.index_pool;
-      bci.info.objv_tracker = old_bci.info.objv_tracker;
     }
 
+    /* record the read version (if any), store the new version */
+    bci.info.objv_tracker.read_version = old_bci.info.objv_tracker.read_version;
+    bci.info.objv_tracker.write_version = objv_tracker.write_version;
+
     ret = store->put_bucket_instance_info(oid, bci.info, false, mtime, &bci.attrs);
     if (ret < 0)
       return ret;
index a382f21467bbd66f10ea186da880220006f4fb28..f54927c4fa2552483f7230227fe1088cbd34537b 100644 (file)
@@ -4584,13 +4584,11 @@ int RGWRados::get_bucket_info(void *ctx, string& bucket_name, RGWBucketInfo& inf
 }
 
 int RGWRados::put_bucket_entrypoint_info(string& bucket_name, RGWBucketEntryPoint& entry_point,
-                                         bool exclusive, time_t mtime)
+                                         bool exclusive, RGWObjVersionTracker& objv_tracker, time_t mtime)
 {
   bufferlist epbl;
   ::encode(entry_point, epbl);
-  RGWObjVersionTracker ot;
-  ot.generate_new_write_ver(cct);
-  return rgw_bucket_store_info(this, bucket_name, epbl, exclusive, NULL, &ot, mtime);
+  return rgw_bucket_store_info(this, bucket_name, epbl, exclusive, NULL, &objv_tracker, mtime);
 }
 
 int RGWRados::put_bucket_instance_info(string& bucket_name, RGWBucketInfo& info, bool exclusive,
@@ -4625,7 +4623,9 @@ int RGWRados::put_bucket_info(string& bucket_name, RGWBucketInfo& info, bool exc
   entry_point.bucket = info.bucket;
   entry_point.owner = info.owner;
   entry_point.creation_time = info.creation_time;
-  ret = put_bucket_entrypoint_info(info.bucket.name, entry_point, exclusive, mtime); 
+  RGWObjVersionTracker ot;
+  ot.generate_new_write_ver(cct);
+  ret = put_bucket_entrypoint_info(info.bucket.name, entry_point, exclusive, ot, mtime); 
   if (ret < 0)
     return ret;
 
index 1e6f1de862ff231db1d5b451e632688b0be2b837..b9a4a0944a3f072650f3323606444ca74c946667 100644 (file)
@@ -1272,7 +1272,7 @@ public:
   void get_bucket_instance_entry(rgw_bucket& bucket, string& entry);
   void get_bucket_meta_oid(rgw_bucket& bucket, string& oid);
 
-  int put_bucket_entrypoint_info(string& bucket_name, RGWBucketEntryPoint& entry_point, bool exclusive, time_t mtime);
+  int put_bucket_entrypoint_info(string& bucket_name, RGWBucketEntryPoint& entry_point, bool exclusive, RGWObjVersionTracker& objv_tracker, time_t mtime);
   int put_bucket_instance_info(string& bucket_name, RGWBucketInfo& info, bool exclusive, time_t mtime, map<string, bufferlist> *pattrs);
   int get_bucket_entrypoint_info(void *ctx, string& bucket_name, RGWBucketEntryPoint& entry_point, RGWObjVersionTracker *objv_tracker, time_t *pmtime);
   int get_bucket_instance_info(void *ctx, string& name, RGWBucketInfo& info, time_t *pmtime, map<string, bufferlist> *pattrs);