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) {}
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;
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,
attrs[RGW_ATTR_CONTENT_TYPE] = ct_bl;
}
- ret = processor->complete(etag, NULL, attrs);
+ ret = processor->complete(etag, NULL, 0, attrs);
done:
dispose_processor(processor);
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;
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;
}
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();
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,
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);
}
};
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;
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;
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;
};
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
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; }
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();
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;
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
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);
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);