]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: expose the version of synced items to the poster
authorGreg Farnum <greg@inktank.com>
Thu, 25 Jul 2013 22:07:39 +0000 (15:07 -0700)
committerGreg Farnum <greg@inktank.com>
Thu, 25 Jul 2013 23:03:59 +0000 (16:03 -0700)
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>
src/rgw/rgw_bucket.cc
src/rgw/rgw_metadata.cc
src/rgw/rgw_metadata.h
src/rgw/rgw_rest_metadata.cc
src/rgw/rgw_rest_metadata.h

index b3379977e9dab687fe096c049ffa8257207ceccb..439f5035dcc6ce984d8b54543ded2345c159ddba 100644 (file)
@@ -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;
     }
 
index 4e12c6a5e96d086ef320e717a0846d0221e96638..3444bb430b1cf8f864c82c04e545a567b9c5ad63 100644 (file)
@@ -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)
index 56db78d53c844e2dac8748dd73142bd2df81856b..fc739d2812d002c9203a8cc99e662e61006cb5a0 100644 (file)
@@ -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);
index c62a9bbcea0c7609fe5bcd4161a629ef8b822979..abe6eaa51536c6df77599d12102c1b5f344640b1 100644 (file)
@@ -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);
 }
 
index 96969fc5410ab908276694449202cfb6ee267317..8a95518288f56abf2c564ec582d7dfab2778a4c5 100644 (file)
@@ -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() {}