From: Radoslaw Zarzynski Date: Tue, 17 Mar 2015 13:07:34 +0000 (+0100) Subject: rgw: send X-Copied-From-Last-Modified header of Swift API. X-Git-Tag: v9.0.1~112^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=e7724a1d8c0872362c19f578fe30ac2cf3dada90;p=ceph.git rgw: send X-Copied-From-Last-Modified header of Swift API. Fixes: #10663 Backport: hammer Signed-off-by: Radoslaw Zarzynski --- diff --git a/src/rgw/rgw_op.cc b/src/rgw/rgw_op.cc index 24f85ac4da5f..728e2fa522ce 100644 --- a/src/rgw/rgw_op.cc +++ b/src/rgw/rgw_op.cc @@ -2402,6 +2402,7 @@ void RGWCopyObj::execute() src_obj, dest_bucket_info, src_bucket_info, + &src_mtime, &mtime, mod_ptr, unmod_ptr, diff --git a/src/rgw/rgw_op.h b/src/rgw/rgw_op.h index e5c1fde009a8..eb9654481783 100644 --- a/src/rgw/rgw_op.h +++ b/src/rgw/rgw_op.h @@ -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; diff --git a/src/rgw/rgw_rados.cc b/src/rgw/rgw_rados.cc index 5183747aff33..3e5d9d6537bf 100644 --- a/src/rgw/rgw_rados.cc +++ b/src/rgw/rgw_rados.cc @@ -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::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; diff --git a/src/rgw/rgw_rados.h b/src/rgw/rgw_rados.h index a3fd6c09d737..006213b84a47 100644 --- a/src/rgw/rgw_rados.h +++ b/src/rgw/rgw_rados.h @@ -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, diff --git a/src/rgw/rgw_rest.cc b/src/rgw/rgw_rest.cc index 93f5b3f0b26c..a33bd587957a 100644 --- a/src/rgw/rgw_rest.cc +++ b/src/rgw/rgw_rest.cc @@ -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]; diff --git a/src/rgw/rgw_rest.h b/src/rgw/rgw_rest.h index a6b680b2e846..244ba2aac2c0 100644 --- a/src/rgw/rgw_rest.h +++ b/src/rgw/rgw_rest.h @@ -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); diff --git a/src/rgw/rgw_rest_swift.cc b/src/rgw/rgw_rest_swift.cc index 79319269532a..9713cdf47465 100644 --- a/src/rgw/rgw_rest_swift.cc +++ b/src/rgw/rgw_rest_swift.cc @@ -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()