diff options
author | Yehuda Sadeh <yehuda@inktank.com> | 2013-06-17 15:39:11 -0700 |
---|---|---|
committer | Yehuda Sadeh <yehuda@inktank.com> | 2013-06-17 15:39:11 -0700 |
commit | 94b3700501258a3de54ec91bd4c8874484b32ede (patch) | |
tree | 4c46a3769be3d62f18f2efe561122b27d70b78dc | |
parent | 4c89a2b695d6c56dee54fa32018dab943549c143 (diff) | |
download | ceph-94b3700501258a3de54ec91bd4c8874484b32ede.tar.gz |
rgw: intra-region copy, preserve mtime
Signed-off-by: Yehuda Sadeh <yehuda@inktank.com>
-rw-r--r-- | src/rgw/rgw_op.cc | 14 | ||||
-rw-r--r-- | src/rgw/rgw_rados.cc | 27 | ||||
-rw-r--r-- | src/rgw/rgw_rados.h | 8 | ||||
-rw-r--r-- | src/rgw/rgw_rest_conn.cc | 3 | ||||
-rw-r--r-- | src/rgw/rgw_rest_conn.h | 3 | ||||
-rw-r--r-- | src/rgw/rgw_rest_s3.cc | 6 |
6 files changed, 38 insertions, 23 deletions
diff --git a/src/rgw/rgw_op.cc b/src/rgw/rgw_op.cc index c5e29b06666..dd32ccfeb24 100644 --- a/src/rgw/rgw_op.cc +++ b/src/rgw/rgw_op.cc @@ -1031,7 +1031,7 @@ class RGWPutObjProcessor_Multipart : public RGWPutObjProcessor_Atomic protected: bool immutable_head() { return true; } int prepare(RGWRados *store, void *obj_ctx); - int do_complete(string& etag, time_t *mtime, map<string, bufferlist>& attrs); + int do_complete(string& etag, time_t *mtime, time_t set_mtime, map<string, bufferlist>& attrs); public: RGWPutObjProcessor_Multipart(uint64_t _p, req_state *_s) : RGWPutObjProcessor_Atomic(s->bucket, s->object_str, _p, s->req_id), s(_s) {} @@ -1061,11 +1061,15 @@ int RGWPutObjProcessor_Multipart::prepare(RGWRados *store, void *obj_ctx) return 0; } -int RGWPutObjProcessor_Multipart::do_complete(string& etag, time_t *mtime, map<string, bufferlist>& attrs) +int RGWPutObjProcessor_Multipart::do_complete(string& etag, time_t *mtime, time_t set_mtime, map<string, bufferlist>& attrs) { complete_parts(); - int r = store->put_obj_meta(obj_ctx, head_obj, s->obj_size, mtime, attrs, RGW_OBJ_CATEGORY_MAIN, 0); + RGWRados::PutObjMetaExtraParams params; + params.set_mtime = set_mtime; + params.mtime = mtime; + + int r = store->put_obj_meta(obj_ctx, head_obj, s->obj_size, attrs, RGW_OBJ_CATEGORY_MAIN, 0, params); if (r < 0) return r; @@ -1228,7 +1232,7 @@ void RGWPutObj::execute() rgw_get_request_metadata(s->cct, s->info, attrs); - ret = processor->complete(etag, &mtime, attrs); + ret = processor->complete(etag, &mtime, 0, attrs); done: dispose_processor(processor); perfcounter->tinc(l_rgw_put_lat, @@ -1344,7 +1348,7 @@ void RGWPostObj::execute() attrs[RGW_ATTR_CONTENT_TYPE] = ct_bl; } - ret = processor->complete(etag, NULL, attrs); + ret = processor->complete(etag, NULL, 0, attrs); done: dispose_processor(processor); diff --git a/src/rgw/rgw_rados.cc b/src/rgw/rgw_rados.cc index f45e1980f2a..ff164b183de 100644 --- a/src/rgw/rgw_rados.cc +++ b/src/rgw/rgw_rados.cc @@ -472,9 +472,9 @@ void RGWObjVersionTracker::generate_new_write_ver(CephContext *cct) append_rand_alpha(cct, write_version.tag, write_version.tag, TAG_LEN); } -int RGWPutObjProcessor::complete(string& etag, time_t *mtime, map<string, bufferlist>& attrs) +int RGWPutObjProcessor::complete(string& etag, time_t *mtime, time_t set_mtime, map<string, bufferlist>& attrs) { - int r = do_complete(etag, mtime, attrs); + int r = do_complete(etag, mtime, set_mtime, attrs); if (r < 0) return r; @@ -517,11 +517,16 @@ int RGWPutObjProcessor_Plain::handle_data(bufferlist& bl, off_t _ofs, void **pha return 0; } -int RGWPutObjProcessor_Plain::do_complete(string& etag, time_t *mtime, map<string, bufferlist>& attrs) +int RGWPutObjProcessor_Plain::do_complete(string& etag, time_t *mtime, time_t set_mtime, map<string, bufferlist>& attrs) { - int r = store->put_obj_meta(obj_ctx, obj, data.length(), mtime, attrs, + RGWRados::PutObjMetaExtraParams params; + params.set_mtime = set_mtime; + params.mtime = mtime; + params.data = &data; + + int r = store->put_obj_meta(obj_ctx, obj, data.length(), attrs, RGW_OBJ_CATEGORY_MAIN, PUT_OBJ_CREATE, - &data); + params); return r; } @@ -686,7 +691,7 @@ void RGWPutObjProcessor_Atomic::complete_parts() prepare_next_part(obj_len); } -int RGWPutObjProcessor_Atomic::do_complete(string& etag, time_t *mtime, map<string, bufferlist>& attrs) +int RGWPutObjProcessor_Atomic::do_complete(string& etag, time_t *mtime, time_t set_mtime, map<string, bufferlist>& attrs) { complete_parts(); @@ -698,6 +703,7 @@ int RGWPutObjProcessor_Atomic::do_complete(string& etag, time_t *mtime, map<stri extra_params.manifest = &manifest; extra_params.ptag = &unique_tag; /* use req_id as operation tag */ extra_params.mtime = mtime; + extra_params.set_mtime = set_mtime; int r = store->put_obj_meta(obj_ctx, head_obj, obj_len, attrs, RGW_OBJ_CATEGORY_MAIN, PUT_OBJ_CREATE, @@ -2196,8 +2202,8 @@ public: processor->set_extra_data_len(len); } - int complete(string& etag, time_t *mtime, map<string, bufferlist>& attrs) { - return processor->complete(etag, mtime, attrs); + int complete(string& etag, time_t *mtime, time_t set_mtime, map<string, bufferlist>& attrs) { + return processor->complete(etag, mtime, set_mtime, attrs); } }; @@ -2314,7 +2320,8 @@ int RGWRados::copy_obj(void *ctx, string etag; map<string, string> req_headers; - ret = conn->complete_request(in_stream_req, etag, mtime, req_headers); + time_t set_mtime; + ret = conn->complete_request(in_stream_req, etag, &set_mtime, req_headers); if (ret < 0) return ret; @@ -2333,7 +2340,7 @@ int RGWRados::copy_obj(void *ctx, set_copy_attrs(src_attrs, attrs, replace_attrs, !source_zone.empty()); - ret = cb.complete(etag, mtime, src_attrs); + ret = cb.complete(etag, mtime, set_mtime, src_attrs); if (ret < 0) return ret; diff --git a/src/rgw/rgw_rados.h b/src/rgw/rgw_rados.h index 387e10e9f42..c2ec16f42c9 100644 --- a/src/rgw/rgw_rados.h +++ b/src/rgw/rgw_rados.h @@ -185,7 +185,7 @@ protected: void *obj_ctx; bool is_complete; - virtual int do_complete(string& etag, time_t *mtime, map<string, bufferlist>& attrs) = 0; + virtual int do_complete(string& etag, time_t *mtime, time_t set_mtime, map<string, bufferlist>& attrs) = 0; list<rgw_obj> objs; @@ -202,7 +202,7 @@ public: }; virtual int handle_data(bufferlist& bl, off_t ofs, void **phandle) = 0; virtual int throttle_data(void *handle) = 0; - virtual int complete(string& etag, time_t *mtime, map<string, bufferlist>& attrs); + virtual int complete(string& etag, time_t *mtime, time_t set_mtime, map<string, bufferlist>& attrs); }; class RGWPutObjProcessor_Plain : public RGWPutObjProcessor @@ -217,7 +217,7 @@ class RGWPutObjProcessor_Plain : public RGWPutObjProcessor protected: int prepare(RGWRados *store, void *obj_ctx); int handle_data(bufferlist& bl, off_t ofs, void **phandle); - int do_complete(string& etag, time_t *mtime, map<string, bufferlist>& attrs); + int do_complete(string& etag, time_t *mtime, time_t set_mtime, map<string, bufferlist>& attrs); public: int throttle_data(void *handle) { return 0; } @@ -275,7 +275,7 @@ protected: virtual bool immutable_head() { return false; } - virtual int do_complete(string& etag, time_t *mtime, map<string, bufferlist>& attrs); + virtual int do_complete(string& etag, time_t *mtime, time_t set_mtime, map<string, bufferlist>& attrs); void prepare_next_part(off_t ofs); void complete_parts(); diff --git a/src/rgw/rgw_rest_conn.cc b/src/rgw/rgw_rest_conn.cc index 77c06bca1ce..5caf3ce0bcd 100644 --- a/src/rgw/rgw_rest_conn.cc +++ b/src/rgw/rgw_rest_conn.cc @@ -102,8 +102,7 @@ int RGWRESTConn::get_obj(const string& uid, req_info *info /* optional */, rgw_o return (*req)->get_obj(key, extra_headers, obj); } -int RGWRESTConn::complete_request(RGWRESTStreamReadRequest *req, string& etag, time_t *mtime, - map<string, string>& attrs) +int RGWRESTConn::complete_request(RGWRESTStreamReadRequest *req, string& etag, time_t *mtime, map<string, string>& attrs) { int ret = req->complete(etag, mtime, attrs); delete req; diff --git a/src/rgw/rgw_rest_conn.h b/src/rgw/rgw_rest_conn.h index d2290b1b61f..6fe572d2cf7 100644 --- a/src/rgw/rgw_rest_conn.h +++ b/src/rgw/rgw_rest_conn.h @@ -28,8 +28,7 @@ public: int complete_request(RGWRESTStreamWriteRequest *req, string& etag, time_t *mtime); int get_obj(const string& uid, req_info *info /* optional */, rgw_obj& obj, bool prepend_metadata, RGWGetDataCB *cb, RGWRESTStreamReadRequest **req); - int complete_request(RGWRESTStreamReadRequest *req, string& etag, time_t *mtime, - map<string, string>& attrs); + int complete_request(RGWRESTStreamReadRequest *req, string& etag, time_t *mtime, map<string, string>& attrs); }; #endif diff --git a/src/rgw/rgw_rest_s3.cc b/src/rgw/rgw_rest_s3.cc index 8912c0f5dab..35b106cff19 100644 --- a/src/rgw/rgw_rest_s3.cc +++ b/src/rgw/rgw_rest_s3.cc @@ -92,6 +92,7 @@ int RGWGetObj_ObjStore_S3::send_response_data(bufferlist& bl, off_t bl_ofs, off_ JSONFormatter jf; jf.open_object_section("obj_metadata"); encode_json("attrs", attrs, &jf); + encode_json("mtime", lastmod, &jf); jf.close_section(); stringstream ss; jf.flush(ss); @@ -100,6 +101,11 @@ int RGWGetObj_ObjStore_S3::send_response_data(bufferlist& bl, off_t bl_ofs, off_ total_len += metadata_bl.length(); } + if (s->system_request && lastmod) { + /* we end up dumping mtime in two different methods, a bit redundant */ + dump_epoch_header(s, "Rgwx-Mtime", lastmod); + } + dump_content_length(s, total_len); dump_last_modified(s, lastmod); |