summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGreg Farnum <greg@inktank.com>2013-07-25 15:07:39 -0700
committerGreg Farnum <greg@inktank.com>2013-07-25 16:03:59 -0700
commit063c71f0ff92316620998b3d08932bd53cbd4f28 (patch)
treedf6553ce0ed30b523bf78c6cdf425c708cea35ce
parent81b62b5c7192f30f8a3b355cc7cc270cb7e6af92 (diff)
downloadceph-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.cc1
-rw-r--r--src/rgw/rgw_metadata.cc9
-rw-r--r--src/rgw/rgw_metadata.h3
-rw-r--r--src/rgw/rgw_rest_metadata.cc6
-rw-r--r--src/rgw/rgw_rest_metadata.h1
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() {}