]> 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)
committerKen Dreyer <kdreyer@redhat.com>
Mon, 4 May 2015 18:48:36 +0000 (12:48 -0600)
Fixes: #10663
Backport: hammer
Signed-off-by: Radoslaw Zarzynski <rzarzynski@mirantis.com>
(cherry picked from commit e7724a1d8c0872362c19f578fe30ac2cf3dada90)

Conflicts:
src/rgw/rgw_rados.cc

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 bf7247ef6595e25c40ddeb6c83e0e49cc4808ba5..b1127a3ed7ef61a172529c7b0939c19455bd0f0b 100644 (file)
@@ -2378,6 +2378,7 @@ void RGWCopyObj::execute()
                         src_obj,
                         dest_bucket_info,
                         src_bucket_info,
+                        &src_mtime,
                         &mtime,
                         mod_ptr,
                         unmod_ptr,
index 4a735769827f4aa9270da0c887b1a152da05caf2..3af2ed10b778315c0d2b26533039d150ee86acf7 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;
   bool replace_attrs;
   RGWBucketInfo src_bucket_info;
@@ -615,6 +616,7 @@ public:
     mod_ptr = NULL;
     unmod_ptr = NULL;
     ret = 0;
+    src_mtime = 0;
     mtime = 0;
     replace_attrs = false;
     last_ofs = 0;
index 604d4cb8ba715761fb26d86e4452fe0d38982929..b6ca4bd101188440869236e818911fdde6635f8e 100644 (file)
@@ -3439,6 +3439,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,
@@ -3528,6 +3529,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()) {
@@ -3601,6 +3606,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,
@@ -3619,7 +3625,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;
 
@@ -3641,7 +3646,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, replace_attrs, attrs, category,
                olh_epoch, version_id, ptag, petag, err, progress_cb, progress_data);
   }
@@ -3657,7 +3662,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 f6abe842349f7fa74ae48eb2ec9b137309e4d2be..0cc02259b073360856566525c66763982b53abce 100644 (file)
@@ -1696,6 +1696,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,
@@ -1735,6 +1736,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 4a28968afb0849517289ab132fef4c473914f68c..20ecddccbb92f35cb04db13555c83ab3bc26655a 100644 (file)
@@ -629,6 +629,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()