]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: skeleton for obj copy across regions
authorYehuda Sadeh <yehuda@inktank.com>
Tue, 4 Jun 2013 02:22:38 +0000 (19:22 -0700)
committerYehuda Sadeh <yehuda@inktank.com>
Mon, 10 Jun 2013 21:28:03 +0000 (14:28 -0700)
Signed-off-by: Yehuda Sadeh <yehuda@inktank.com>
src/rgw/rgw_op.cc
src/rgw/rgw_op.h
src/rgw/rgw_rados.cc
src/rgw/rgw_rados.h
src/rgw/rgw_rest_client.cc
src/rgw/rgw_rest_client.h
src/rgw/rgw_rest_conn.cc
src/rgw/rgw_rest_conn.h

index 5b737fec653875112f634710014d67141354d408..f2e97d19810f47e18994c252b15327e595b642c4 100644 (file)
@@ -1742,8 +1742,6 @@ int RGWCopyObj::verify_permission()
   if (ret < 0)
     return ret;
 
-  RGWBucketInfo src_bucket_info, dest_bucket_info;
-
   /* get buckets info (source and dest) */
 
   ret = store->get_bucket_info(s->obj_ctx, src_bucket_name, src_bucket_info, NULL);
@@ -1838,11 +1836,28 @@ void RGWCopyObj::execute()
   src_obj.init(src_bucket, src_object);
   dst_obj.init(dest_bucket, dest_object);
   store->set_atomic(s->obj_ctx, src_obj);
+#if 0
+
+  if ((dest_bucket_info.region.empty() && !store->region.is_master) ||
+      (dest_bucket_info.region != store->region.name)) {
+
+    map<string, bufferlist> src_attrs;
+  
+    int ret = get_obj_attrs(store, s, src_obj, src_attrs
+                         uint64_t *obj_size, RGWObjVersionTracker *objv_tracker)
+
+    int ret = store->rest_conn->put_obj(s->user.user_id, dst_obj, 
+    if (ret < 0)
+      return ret;
+  }
+#endif
   store->set_atomic(s->obj_ctx, dst_obj);
 
   ret = store->copy_obj(s->obj_ctx,
+                        s->user.user_id,
                         dst_obj,
                         src_obj,
+                        dest_bucket_info,
                         &mtime,
                         mod_ptr,
                         unmod_ptr,
index aed43671c758478a4f84304eef2fe37d94a7500a..55011b4102fa2116d461650f6026b749fced3702 100644 (file)
@@ -441,6 +441,9 @@ protected:
   string dest_object;
   time_t mtime;
   bool replace_attrs;
+  RGWBucketInfo src_bucket_info;
+  RGWBucketInfo dest_bucket_info;
+
 
   int init_common();
 
index e634b617d80222cd5cb175b01bd5d7c3c9519777..4ae126e83480294c5b511dbe973a7b73f3b40888 100644 (file)
@@ -1871,8 +1871,10 @@ bool RGWRados::aio_completed(void *handle)
  * Returns: 0 on success, -ERR# otherwise.
  */
 int RGWRados::copy_obj(void *ctx,
+               const string& user_id,
                rgw_obj& dest_obj,
                rgw_obj& src_obj,
+               RGWBucketInfo& dest_bucket_info,
                time_t *mtime,
                const time_t *mod_ptr,
                const time_t *unmod_ptr,
@@ -1942,6 +1944,18 @@ int RGWRados::copy_obj(void *ctx,
     }
   }
 
+
+  if ((dest_bucket_info.region.empty() && !region.is_master) ||
+      (dest_bucket_info.region != region.name)) {
+    /* dest is in a different region, copy it there */
+
+    map<string, bufferlist> src_attrs;
+  
+    int ret = rest_conn->put_obj(user_id, dest_obj, astate->size, NULL);
+    if (ret < 0)
+      return ret;
+  }
+      
   if (copy_data) { /* refcounting tail wouldn't work here, just copy the data */
     return copy_obj_data(ctx, handle, end, dest_obj, src_obj, mtime, attrset, category, ptag, err);
   }
index 9417c24d5fdd1f2bdcd54cef099597ac9e0c255f..d68978237945e492704862ccc39a03d8b0d75551 100644 (file)
@@ -759,8 +759,11 @@ public:
    * err: stores any errors resulting from the get of the original object
    * Returns: 0 on success, -ERR# otherwise.
    */
-  virtual int copy_obj(void *ctx, rgw_obj& dest_obj,
+  virtual int copy_obj(void *ctx,
+               const string& user_id,
+               rgw_obj& dest_obj,
                rgw_obj& src_obj,
+               RGWBucketInfo& dest_bucket_info,
                time_t *mtime,
                const time_t *mod_ptr,
                const time_t *unmod_ptr,
index 4c4c43d3415a2f61ebf436465972ce5caf7e74a8..d7c0a9596a9aa5ae96943aa5bba03a7c98f4182d 100644 (file)
@@ -233,3 +233,26 @@ int RGWRESTClient::forward_request(RGWAccessKey& key, req_info& info, size_t max
 
   return rgw_http_error_to_errno(status);
 }
+
+int RGWRESTClient::put_obj(RGWAccessKey& key, rgw_obj& obj, uint64_t obj_size, void (*get_data)(uint64_t ofs, uint64_t len, bufferlist& bl, void *))
+{
+  string resource = obj.bucket.name + "/" + obj.object;
+  string new_url = url + "/" + resource;
+  string date_str;
+  get_new_date_str(cct, date_str);
+
+  RGWEnv new_env;
+  req_info new_info(cct, &new_env);
+  
+  new_env.set("HTTP_DATE", date_str.c_str());
+
+  new_info.script_uri = resource;
+  new_info.request_uri = resource;
+
+  int r = process("PUT", new_url.c_str());
+  if (r < 0)
+    return r;
+
+  return 0;
+}
+
index 5e871bbdd96cc77ecc5683696a916c5e9ca3a92a..1b3b46bcf3d41cb2137e7a07d66e33f1a388a0fa 100644 (file)
@@ -42,6 +42,8 @@ public:
 
   int execute(RGWAccessKey& key, const char *method, const char *resource);
   int forward_request(RGWAccessKey& key, req_info& info, size_t max_response, bufferlist *inbl, bufferlist *outbl);
+
+  int put_obj(RGWAccessKey& key, rgw_obj& obj, uint64_t obj_size, void (*get_data)(uint64_t ofs, uint64_t len, bufferlist& bl, void *));
 };
 
 
index 66d5d9bf48444f1b21fcbcdafbb82eb9f6c0f14c..ddcad57f4e8b303833a3707c5f4a94205a365b95 100644 (file)
@@ -40,3 +40,17 @@ int RGWRegionConnection::forward(const string& uid, req_info& info, size_t max_r
   return client.forward_request(key, info, max_response, inbl, outbl);
 }
 
+int RGWRegionConnection::put_obj(const string& uid, rgw_obj& obj, uint64_t obj_size, void (*get_data)(uint64_t ofs, uint64_t len, bufferlist& bl, void *))
+{
+  string url;
+  int ret = get_url(url);
+  if (ret < 0)
+    return ret;
+
+  list<pair<string, string> > params;
+  params.push_back(make_pair<string, string>(RGW_SYS_PARAM_PREFIX "uid", uid));
+  params.push_back(make_pair<string, string>(RGW_SYS_PARAM_PREFIX "region", region));
+  RGWRESTClient client(cct, url, NULL, &params);
+  return client.put_obj(key, obj, obj_size, get_data);
+}
+
index 6b296342d93a5b8911fde3d2d5d3b050179b99c1..00bb286b1302989728e746bface343a151ac7e96 100644 (file)
@@ -20,6 +20,7 @@ public:
   int get_url(string& endpoint);
 
   int forward(const string& uid, req_info& info, size_t max_response, bufferlist *inbl, bufferlist *outbl);
+  int put_obj(const string& uid, rgw_obj& obj, uint64_t obj_size, void (*get_data)(uint64_t ofs, uint64_t len, bufferlist& bl, void *));
 };
 
 #endif