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>
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;
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;
/* 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;
}
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,
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;
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);