]> git.apps.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)
committerLoic Dachary <ldachary@redhat.com>
Wed, 6 May 2015 10:05:40 +0000 (12:05 +0200)
Fixes: #10663
Backport: hammer
Signed-off-by: Radoslaw Zarzynski <rzarzynski@mirantis.com>
(cherry picked from commit e7724a1d8c0872362c19f578fe30ac2cf3dada90)

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 52fa69a2101223bd4592a5ee30294f7f3d342956..cc107a1346db9a2d82128ff91e16ad742e26c89b 100644 (file)
@@ -2379,6 +2379,7 @@ void RGWCopyObj::execute()
                         src_obj,
                         dest_bucket_info,
                         src_bucket_info,
+                        &src_mtime,
                         &mtime,
                         mod_ptr,
                         unmod_ptr,
index 5fdc12958a6b5113756711b799e15af56f85fd6f..ba0735a2270e0e9b11d8fab9accf25200ee23f0f 100644 (file)
@@ -584,6 +584,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;
@@ -615,6 +616,7 @@ public:
     mod_ptr = NULL;
     unmod_ptr = NULL;
     ret = 0;
+    src_mtime = 0;
     mtime = 0;
     attrs_mod = RGWRados::ATTRSMOD_NONE;
     last_ofs = 0;
index bd9a984a5b0a627a72333fe3ab30e0477005cfe0..3358dd32ead10b9bf8b5ca986ec66569b13458f6 100644 (file)
@@ -3518,6 +3518,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,
@@ -3607,6 +3608,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()) {
@@ -3689,6 +3694,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,
@@ -3707,7 +3713,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;
 
@@ -3729,7 +3734,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);
   }
@@ -3745,7 +3750,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 9b14fa9c2d17e3f6a1f8b8a81d05add00ce46122..b1cfac87deceb52ab89ada967299e4a88de3dc18 100644 (file)
@@ -1707,6 +1707,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,
@@ -1753,6 +1754,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 44caa2ae42b2db1a68d167c8902c1b0e5482f9b2..1c948337d3d6b00f140d0b1e7161488233e2aad3 100644 (file)
@@ -633,6 +633,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()