]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: If use 'copy part' without 'x-amz-copy-source-range', 21294/head
authoryuliyang <yuliyang@cmss.chinamobile.com>
Mon, 9 Apr 2018 05:12:42 +0000 (13:12 +0800)
committeryuliyang <yuliyang@cmss.chinamobile.com>
Mon, 9 Apr 2018 07:04:17 +0000 (15:04 +0800)
it will copy an entire source object

Signed-off-by: Malcolm Lee <fengxueyu35@126.com>
(cherry picked from commit 753b3a7)

Conflicts:
 1. in original commit, copy_source is std::string, jewel
    version is const char *.
 2. in original commit, url_decode take only one param,
    jewel version take 2 params.
 3. in original commit, get_obj_state take 6 params, jewel
    version takes 4 params.

src/rgw/rgw_op.cc
src/rgw/rgw_rest_s3.cc

index 42a15e3593b754306abf21f6aa6bec872b6c1a7e..18f7565e4e671e273291a9621c348caed8c829cd 100644 (file)
@@ -2669,9 +2669,28 @@ void RGWPutObj::execute()
                      << dendl;
     goto done;
   }
+  
+  if (copy_source && !copy_source_range) {
+    rgw_obj_key obj_key(copy_source_object_name, copy_source_version_id);
+    rgw_obj obj(copy_source_bucket_info.bucket, obj_key.name);
+
+    RGWObjState *astate;
+    op_ret = store->get_obj_state(static_cast<RGWObjectCtx *>(s->obj_ctx),
+                                  obj, &astate, true);
+    if (op_ret < 0) {
+      ldout(s->cct, 0) << "ERROR: get copy source obj state returned with error" << op_ret << dendl;
+      goto done;
+    }
+    if (!astate->exists){
+      op_ret = -ENOENT;
+      goto done;
+    }
+    lst = astate->size - 1;
+  } else {
+    lst = copy_source_range_lst;
+  }
 
   fst = copy_source_range_fst;
-  lst = copy_source_range_lst;
 
   do {
     bufferlist data_in;
index 3dd9826927a104597156fb7f56672ba59a31b4dc..8829178b29bf9eaa22fe27c9f084d2357b570bf0 100644 (file)
@@ -3228,8 +3228,12 @@ int RGWHandler_REST_S3::init(RGWRados *store, struct req_state *s,
 
   const char *copy_source = s->info.env->get("HTTP_X_AMZ_COPY_SOURCE");
 
-  if (copy_source && !s->info.env->get("HTTP_X_AMZ_COPY_SOURCE_RANGE")) {
-    ret = RGWCopyObj::parse_copy_location(copy_source,
+  if (copy_source && 
+      (! s->info.env->get("HTTP_X_AMZ_COPY_SOURCE_RANGE")) &&
+      (! s->info.args.exists("uploadId"))) {
+    std::string url_decode_copy_source;
+    url_decode(copy_source, url_decode_copy_source);
+    ret = RGWCopyObj::parse_copy_location(url_decode_copy_source,
                                           s->init_state.src_bucket,
                                           s->src_object);
     if (!ret) {