From d54ab2a8ff754dfddb13ae0bd5c0806706f2a9a7 Mon Sep 17 00:00:00 2001 From: Radoslaw Zarzynski Date: Tue, 17 Mar 2015 14:07:34 +0100 Subject: [PATCH] rgw: send X-Copied-From-Last-Modified header of Swift API. Fixes: #10663 Backport: hammer Signed-off-by: Radoslaw Zarzynski (cherry picked from commit e7724a1d8c0872362c19f578fe30ac2cf3dada90) Conflicts: src/rgw/rgw_rados.cc --- src/rgw/rgw_op.cc | 1 + src/rgw/rgw_op.h | 2 ++ src/rgw/rgw_rados.cc | 11 ++++++++--- src/rgw/rgw_rados.h | 2 ++ src/rgw/rgw_rest.cc | 2 +- src/rgw/rgw_rest.h | 1 + src/rgw/rgw_rest_swift.cc | 3 +++ 7 files changed, 18 insertions(+), 4 deletions(-) diff --git a/src/rgw/rgw_op.cc b/src/rgw/rgw_op.cc index bf7247ef6595e..b1127a3ed7ef6 100644 --- a/src/rgw/rgw_op.cc +++ b/src/rgw/rgw_op.cc @@ -2378,6 +2378,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 4a735769827f4..3af2ed10b7783 100644 --- a/src/rgw/rgw_op.h +++ b/src/rgw/rgw_op.h @@ -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; diff --git a/src/rgw/rgw_rados.cc b/src/rgw/rgw_rados.cc index 604d4cb8ba715..b6ca4bd101188 100644 --- a/src/rgw/rgw_rados.cc +++ b/src/rgw/rgw_rados.cc @@ -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::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; diff --git a/src/rgw/rgw_rados.h b/src/rgw/rgw_rados.h index f6abe842349f7..0cc02259b0733 100644 --- a/src/rgw/rgw_rados.h +++ b/src/rgw/rgw_rados.h @@ -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, diff --git a/src/rgw/rgw_rest.cc b/src/rgw/rgw_rest.cc index 93f5b3f0b26c4..a33bd587957a5 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 a6b680b2e846f..244ba2aac2c0d 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 4a28968afb084..20ecddccbb92f 100644 --- a/src/rgw/rgw_rest_swift.cc +++ b/src/rgw/rgw_rest_swift.cc @@ -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() -- 2.39.5