]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: send X-Copied-From-Last-Modified header of Swift API.
authorRadoslaw Zarzynski <rzarzynski@mirantis.com>
Tue, 17 Mar 2015 13:07:34 +0000 (14:07 +0100)
committerRadoslaw Zarzynski <rzarzynski@mirantis.com>
Tue, 7 Apr 2015 12:02:09 +0000 (14:02 +0200)
Fixes: #10663
Backport: hammer
Signed-off-by: Radoslaw Zarzynski <rzarzynski@mirantis.com>
src/rgw/rgw_op.cc
src/rgw/rgw_op.h
src/rgw/rgw_rados.cc
src/rgw/rgw_rados.h
src/rgw/rgw_rest.cc
src/rgw/rgw_rest.h
src/rgw/rgw_rest_swift.cc

index 24f85ac4da5f0f1a0f0f4f6178bb561b01f245b0..728e2fa522cef5078ffa12da748c4a00019a9f03 100644 (file)
@@ -2402,6 +2402,7 @@ void RGWCopyObj::execute()
                         src_obj,
                         dest_bucket_info,
                         src_bucket_info,
+                        &src_mtime,
                         &mtime,
                         mod_ptr,
                         unmod_ptr,
index e5c1fde009a8bc98c29ba63875b2fed574743fdc..eb965448178382853526246a85483655d2e93dff 100644 (file)
@@ -594,6 +594,7 @@ protected:
   string dest_bucket_name;
   rgw_bucket dest_bucket;
   string dest_object;
+  time_t src_mtime;
   time_t mtime;
   RGWRados::AttrsMod attrs_mod;
   RGWBucketInfo src_bucket_info;
@@ -625,6 +626,7 @@ public:
     mod_ptr = NULL;
     unmod_ptr = NULL;
     ret = 0;
+    src_mtime = 0;
     mtime = 0;
     attrs_mod = RGWRados::ATTRSMOD_NONE;
     last_ofs = 0;
index 5183747aff33b62292de14d4f438bd900a9f37cc..3e5d9d6537bfecf77473c9db2365607e0f39cda3 100644 (file)
@@ -3444,6 +3444,7 @@ int RGWRados::fetch_remote_obj(RGWObjectCtx& obj_ctx,
                rgw_obj& src_obj,
                RGWBucketInfo& dest_bucket_info,
                RGWBucketInfo& src_bucket_info,
+               time_t *src_mtime,
                time_t *mtime,
                const time_t *mod_ptr,
                const time_t *unmod_ptr,
@@ -3533,6 +3534,10 @@ int RGWRados::fetch_remote_obj(RGWObjectCtx& obj_ctx,
     }
   }
 
+  if (src_mtime) {
+    *src_mtime = set_mtime;
+  }
+
   if (petag) {
     map<string, bufferlist>::iterator iter = src_attrs.find(RGW_ATTR_ETAG);
     if (iter != src_attrs.end()) {
@@ -3615,6 +3620,7 @@ int RGWRados::copy_obj(RGWObjectCtx& obj_ctx,
                rgw_obj& src_obj,
                RGWBucketInfo& dest_bucket_info,
                RGWBucketInfo& src_bucket_info,
+               time_t *src_mtime,
                time_t *mtime,
                const time_t *mod_ptr,
                const time_t *unmod_ptr,
@@ -3633,7 +3639,6 @@ int RGWRados::copy_obj(RGWObjectCtx& obj_ctx,
 {
   int ret;
   uint64_t total_len, obj_size;
-  time_t lastmod;
   rgw_obj shadow_obj = dest_obj;
   string shadow_oid;
 
@@ -3655,7 +3660,7 @@ int RGWRados::copy_obj(RGWObjectCtx& obj_ctx,
 
   if (remote_src || !source_zone.empty()) {
     return fetch_remote_obj(obj_ctx, user_id, client_id, op_id, info, source_zone,
-               dest_obj, src_obj, dest_bucket_info, src_bucket_info, mtime, mod_ptr,
+               dest_obj, src_obj, dest_bucket_info, src_bucket_info, src_mtime, mtime, mod_ptr,
                unmod_ptr, if_match, if_nomatch, attrs_mod, attrs, category,
                olh_epoch, version_id, ptag, petag, err, progress_cb, progress_data);
   }
@@ -3671,7 +3676,7 @@ int RGWRados::copy_obj(RGWObjectCtx& obj_ctx,
   read_op.conds.if_match = if_match;
   read_op.conds.if_nomatch = if_nomatch;
   read_op.params.attrs = &src_attrs;
-  read_op.params.lastmod = &lastmod;
+  read_op.params.lastmod = src_mtime;
   read_op.params.read_size = &total_len;
   read_op.params.obj_size = &obj_size;
   read_op.params.perr = err;
index a3fd6c09d73795e83229b5fd898b53c8e12ae85e..006213b84a47c3f815bd4968b530d72118e8600b 100644 (file)
@@ -1702,6 +1702,7 @@ public:
                        rgw_obj& src_obj,
                        RGWBucketInfo& dest_bucket_info,
                        RGWBucketInfo& src_bucket_info,
+                       time_t *src_mtime,
                        time_t *mtime,
                        const time_t *mod_ptr,
                        const time_t *unmod_ptr,
@@ -1748,6 +1749,7 @@ public:
                rgw_obj& src_obj,
                RGWBucketInfo& dest_bucket_info,
                RGWBucketInfo& src_bucket_info,
+               time_t *src_mtime,
                time_t *mtime,
                const time_t *mod_ptr,
                const time_t *unmod_ptr,
index 93f5b3f0b26c480e3e97e9e9fc79cfc00196c2ae..a33bd587957a54189c5794b45737b751b1c7679e 100644 (file)
@@ -394,7 +394,7 @@ void dump_redirect(struct req_state *s, const string& redirect)
   s->cio->print("Location: %s\r\n", redirect.c_str());
 }
 
-static void dump_time_header(struct req_state *s, const char *name, time_t t)
+void dump_time_header(struct req_state *s, const char *name, time_t t)
 {
 
   char timestr[TIME_BUF_SIZE];
index a6b680b2e846fbf75b07383a0b79dd2a220eefe9..244ba2aac2c0d50ada92b082af0853dd29f93e40 100644 (file)
@@ -368,6 +368,7 @@ extern void dump_string_header(struct req_state *s, const char *name, const char
 extern void dump_content_length(struct req_state *s, uint64_t len);
 extern void dump_etag(struct req_state *s, const char *etag);
 extern void dump_epoch_header(struct req_state *s, const char *name, time_t t);
+extern void dump_time_header(struct req_state *s, const char *name, time_t t);
 extern void dump_last_modified(struct req_state *s, time_t t);
 extern void abort_early(struct req_state *s, RGWOp *op, int err);
 extern void dump_range(struct req_state *s, uint64_t ofs, uint64_t end, uint64_t total_size);
index 79319269532aa420ad355b9c293a654fd23d6cc7..9713cdf474656b9e126c26c38ee2ae3392e76fd0 100644 (file)
@@ -648,6 +648,9 @@ void RGWCopyObj_ObjStore_SWIFT::dump_copy_info()
   string account_name;
   url_encode(s->user.user_id, account_name);
   s->cio->print("X-Copied-From-Account: %s\r\n", account_name.c_str());
+
+  /* Dump X-Copied-From-Last-Modified. */
+  dump_time_header(s, "X-Copied-From-Last-Modified", src_mtime);
 }
 
 void RGWCopyObj_ObjStore_SWIFT::send_response()