]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: intra-region copy, preserve mtime
authorYehuda Sadeh <yehuda@inktank.com>
Mon, 17 Jun 2013 22:39:11 +0000 (15:39 -0700)
committerYehuda Sadeh <yehuda@inktank.com>
Mon, 17 Jun 2013 22:39:11 +0000 (15:39 -0700)
Signed-off-by: Yehuda Sadeh <yehuda@inktank.com>
src/rgw/rgw_op.cc
src/rgw/rgw_rados.cc
src/rgw/rgw_rados.h
src/rgw/rgw_rest_conn.cc
src/rgw/rgw_rest_conn.h
src/rgw/rgw_rest_s3.cc

index c5e29b0666673738fd7c3d811528ab4dcc85f8f5..dd32ccfeb2494246f2cc47c59c4d91a1135fa4d5 100644 (file)
@@ -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);
index f45e1980f2abaf26ccdac7f7fde4e17c8c303bc4..ff164b183de8d2f1698e9ece6a929cdf1a305a4c 100644 (file)
@@ -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;
 
index 387e10e9f420ead5fb24f0efcc280b688730d8b0..c2ec16f42c9b5f6673264c6a90db0b27e9e4469c 100644 (file)
@@ -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();
index 77c06bca1cea729bd65e69b4d1c2adcc7c6556a0..5caf3ce0bcd545bd0ba3dc1304fa262a2630c1b3 100644 (file)
@@ -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;
index d2290b1b61fc6f77ac4b13ea4b4c1d72917897af..6fe572d2cf7f87bc11e92a06ef6c55d7777568ff 100644 (file)
@@ -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
index 8912c0f5dab7b5c99a29ecea65e4efe8f972c681..35b106cff195ae19066b415c8e00bfdd3c5aa144 100644 (file)
@@ -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);