summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYehuda Sadeh <yehuda@inktank.com>2013-06-25 11:09:19 -0700
committerYehuda Sadeh <yehuda@inktank.com>2013-06-25 11:09:19 -0700
commit86c73c94ff295116f1afe3b81ba15090a63bc3b4 (patch)
tree4e9023030528a037e99474410738b58868e0bb18
parent8bd31d42a25ffb162ced98b3c1fa75cc09444036 (diff)
downloadceph-86c73c94ff295116f1afe3b81ba15090a63bc3b4.tar.gz
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 <yehuda@inktank.com>
-rw-r--r--src/rgw/rgw_bucket.cc13
-rw-r--r--src/rgw/rgw_rados.cc10
-rw-r--r--src/rgw/rgw_rados.h2
3 files changed, 14 insertions, 11 deletions
diff --git a/src/rgw/rgw_bucket.cc b/src/rgw/rgw_bucket.cc
index 05a15d26760..1e3a17ae6fe 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 a382f21467b..f54927c4fa2 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 1e6f1de862f..b9a4a0944a3 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<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);