From: Yehuda Sadeh Date: Tue, 25 Jun 2013 18:09:19 +0000 (-0700) Subject: rgw: fixes to object versioning tracking X-Git-Tag: v0.67-rc1~128^2~42 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=86c73c94ff295116f1afe3b81ba15090a63bc3b4;p=ceph.git rgw: fixes to object versioning tracking 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 --- diff --git a/src/rgw/rgw_bucket.cc b/src/rgw/rgw_bucket.cc index 05a15d26760b..1e3a17ae6fe8 100644 --- a/src/rgw/rgw_bucket.cc +++ b/src/rgw/rgw_bucket.cc @@ -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; diff --git a/src/rgw/rgw_rados.cc b/src/rgw/rgw_rados.cc index a382f21467bb..f54927c4fa25 100644 --- a/src/rgw/rgw_rados.cc +++ b/src/rgw/rgw_rados.cc @@ -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; diff --git a/src/rgw/rgw_rados.h b/src/rgw/rgw_rados.h index 1e6f1de862ff..b9a4a0944a3f 100644 --- a/src/rgw/rgw_rados.h +++ b/src/rgw/rgw_rados.h @@ -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 *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 *pattrs);