diff options
author | Greg Farnum <greg@inktank.com> | 2013-07-25 15:07:39 -0700 |
---|---|---|
committer | Greg Farnum <greg@inktank.com> | 2013-07-25 16:03:59 -0700 |
commit | 063c71f0ff92316620998b3d08932bd53cbd4f28 (patch) | |
tree | df6553ce0ed30b523bf78c6cdf425c708cea35ce | |
parent | 81b62b5c7192f30f8a3b355cc7cc270cb7e6af92 (diff) | |
download | ceph-063c71f0ff92316620998b3d08932bd53cbd4f28.tar.gz |
rgw: expose the version of synced items to the poster
To support this, we add an optional out argument to
RGWMetadatManager::put() and fill in the read_version. When the
function returns, that contains whatever the current on-disk version
of the object is (either what already existed or what we just wrote).
Signed-off-by: Greg Farnum <greg@inktank.com>
-rw-r--r-- | src/rgw/rgw_bucket.cc | 1 | ||||
-rw-r--r-- | src/rgw/rgw_metadata.cc | 9 | ||||
-rw-r--r-- | src/rgw/rgw_metadata.h | 3 | ||||
-rw-r--r-- | src/rgw/rgw_rest_metadata.cc | 6 | ||||
-rw-r--r-- | src/rgw/rgw_rest_metadata.h | 1 |
5 files changed, 16 insertions, 4 deletions
diff --git a/src/rgw/rgw_bucket.cc b/src/rgw/rgw_bucket.cc index b3379977e9d..439f5035dcc 100644 --- a/src/rgw/rgw_bucket.cc +++ b/src/rgw/rgw_bucket.cc @@ -1573,6 +1573,7 @@ public: // are we actually going to perform this put, or is it too old? if (!check_versions(old_bci.info.objv_tracker.read_version, orig_mtime, objv_tracker.write_version, mtime, sync_type)) { + objv_tracker.read_version = old_bci.info.objv_tracker.read_version; return STATUS_NO_APPLY; } diff --git a/src/rgw/rgw_metadata.cc b/src/rgw/rgw_metadata.cc index 4e12c6a5e96..3444bb430b1 100644 --- a/src/rgw/rgw_metadata.cc +++ b/src/rgw/rgw_metadata.cc @@ -330,7 +330,8 @@ int RGWMetadataManager::get(string& metadata_key, Formatter *f) } int RGWMetadataManager::put(string& metadata_key, bufferlist& bl, - RGWMetadataHandler::sync_type_t sync_type) + RGWMetadataHandler::sync_type_t sync_type, + obj_version *existing_version) { RGWMetadataHandler *handler; string entry; @@ -359,7 +360,11 @@ int RGWMetadataManager::put(string& metadata_key, bufferlist& bl, return -EINVAL; } - return handler->put(store, entry, objv_tracker, mtime, jo, sync_type); + ret = handler->put(store, entry, objv_tracker, mtime, jo, sync_type); + if (existing_version) { + *existing_version = objv_tracker.read_version; + } + return ret; } int RGWMetadataManager::remove(string& metadata_key) diff --git a/src/rgw/rgw_metadata.h b/src/rgw/rgw_metadata.h index 56db78d53c8..fc739d2812d 100644 --- a/src/rgw/rgw_metadata.h +++ b/src/rgw/rgw_metadata.h @@ -196,7 +196,8 @@ public: RGWObjVersionTracker *objv_tracker); int get(string& metadata_key, Formatter *f); int put(string& metadata_key, bufferlist& bl, - RGWMetadataHandler::sync_type_t sync_mode); + RGWMetadataHandler::sync_type_t sync_mode, + obj_version *existing_version = NULL); int remove(string& metadata_key); int list_keys_init(string& section, void **phandle); diff --git a/src/rgw/rgw_rest_metadata.cc b/src/rgw/rgw_rest_metadata.cc index c62a9bbcea0..abe6eaa5153 100644 --- a/src/rgw/rgw_rest_metadata.cc +++ b/src/rgw/rgw_rest_metadata.cc @@ -174,7 +174,7 @@ void RGWOp_Metadata_Put::execute() { } } - http_ret = store->meta_mgr->put(metadata_key, bl, sync_type); + http_ret = store->meta_mgr->put(metadata_key, bl, sync_type, &ondisk_version); if (http_ret < 0) { dout(5) << "ERROR: can't put key: " << cpp_strerror(http_ret) << dendl; return; @@ -192,7 +192,11 @@ void RGWOp_Metadata_Put::send_response() { http_return_code = STATUS_NO_CONTENT; set_req_state_err(s, http_return_code); dump_errno(s); + stringstream ver_stream; + ver_stream << "ver:" << ondisk_version.ver + <<",tag:" << ondisk_version.tag; dump_pair(s, "RGWX_UPDATE_STATUS", update_status.c_str()); + dump_pair(s, "RGWX_UPDATE_VERSION", ver_stream.str().c_str()); end_header(s); } diff --git a/src/rgw/rgw_rest_metadata.h b/src/rgw/rgw_rest_metadata.h index 96969fc5410..8a95518288f 100644 --- a/src/rgw/rgw_rest_metadata.h +++ b/src/rgw/rgw_rest_metadata.h @@ -41,6 +41,7 @@ public: class RGWOp_Metadata_Put : public RGWRESTOp { int get_data(bufferlist& bl); string update_status; + obj_version ondisk_version; public: RGWOp_Metadata_Put() {} ~RGWOp_Metadata_Put() {} |