summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYehuda Sadeh <yehuda@inktank.com>2013-06-17 15:39:11 -0700
committerYehuda Sadeh <yehuda@inktank.com>2013-06-17 15:39:11 -0700
commit94b3700501258a3de54ec91bd4c8874484b32ede (patch)
tree4c46a3769be3d62f18f2efe561122b27d70b78dc
parent4c89a2b695d6c56dee54fa32018dab943549c143 (diff)
downloadceph-94b3700501258a3de54ec91bd4c8874484b32ede.tar.gz
rgw: intra-region copy, preserve mtime
Signed-off-by: Yehuda Sadeh <yehuda@inktank.com>
-rw-r--r--src/rgw/rgw_op.cc14
-rw-r--r--src/rgw/rgw_rados.cc27
-rw-r--r--src/rgw/rgw_rados.h8
-rw-r--r--src/rgw/rgw_rest_conn.cc3
-rw-r--r--src/rgw/rgw_rest_conn.h3
-rw-r--r--src/rgw/rgw_rest_s3.cc6
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);