]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: object's append attr will be removed after it's synced to another zone. 22755/head
authorzhang Shaowen <zhangshaowen@cmss.chinamobile.com>
Wed, 20 Feb 2019 08:15:46 +0000 (16:15 +0800)
committerzhang Shaowen <zhangshaowen@cmss.chinamobile.com>
Wed, 20 Feb 2019 08:15:46 +0000 (16:15 +0800)
Signed-off-by: zhang Shaowen <zhangshaowen@cmss.chinamobile.com>
doc/radosgw/s3/objectops.rst
src/rgw/rgw_common.cc
src/rgw/rgw_common.h
src/rgw/rgw_op.cc
src/rgw/rgw_putobj_processor.cc
src/rgw/rgw_putobj_processor.h
src/rgw/rgw_rados.cc

index 3c8c8750a99a1723c02fc2587f08a966fee35fb5..fd7c8d1db56298b4c598f127e8c688bca1f78672 100644 (file)
@@ -408,7 +408,8 @@ Append Object
 Append data to an object. You must have write permissions on the bucket to perform this operation.
 It is used to upload files in appending mode. The type of the objects created by the Append Object
 operation is Appendable Object, and the type of the objects uploaded with the Put Object operation is Normal Object.
-**Append Object can't be used if bucket versioning is enabled.**
+**Append Object can't be used if bucket versioning is enabled or suspende.**
+**Synced object will become normal in multisite, but you can still append to the original object.**
 
 
 Syntax
@@ -453,4 +454,7 @@ The following HTTP response may be returned:
 | **409**       | PositionNotEqualToLength   | Specified position does not match object length   |
 +---------------+----------------------------+---------------------------------------------------+
 | **409**       | ObjectNotAppendable        | Specified object can not be appended              |
-+---------------+----------------------------+---------------------------------------------------+
\ No newline at end of file
++---------------+----------------------------+---------------------------------------------------+
+| **409**       | InvalidBucketstate         | Bucket versioning is enabled or suspended         |
++---------------+----------------------------+---------------------------------------------------+
+
index 8ab9a98988cfc48da76f7937f40a9e1fae70d640..bc9c0c808c33e44fad2d4b9c855c35a751000692 100644 (file)
@@ -108,6 +108,7 @@ rgw_http_errors rgw_http_s3_errors({
     { ERR_DELETE_CONFLICT, {409, "DeleteConflict"}},
     { ERR_POSITION_NOT_EQUAL_TO_LENGTH, {409, "PositionNotEqualToLength"}},
     { ERR_OBJECT_NOT_APPENDABLE, {409, "ObjectNotAppendable"}},
+    { ERR_INVALID_BUCKET_STATE, {409, "InvalidBucketState"}},
     { ERR_INVALID_SECRET_KEY, {400, "InvalidSecretKey"}},
     { ERR_INVALID_KEY_TYPE, {400, "InvalidKeyType"}},
     { ERR_INVALID_CAP, {400, "InvalidCapability"}},
index ce9172348ee5d08ff800309aced51e64241f3398..41a39ce50140c7954a254407825c3f80960d8701 100644 (file)
@@ -230,6 +230,7 @@ using ceph::crypto::MD5;
 #define ERR_RATE_LIMITED         2218
 #define ERR_POSITION_NOT_EQUAL_TO_LENGTH                 2219
 #define ERR_OBJECT_NOT_APPENDABLE                        2220
+#define ERR_INVALID_BUCKET_STATE                         2221
 
 #define ERR_BUSY_RESHARDING      2300
 #define ERR_NO_SUCH_ENTITY       2301
index 1fe1cf6a569e9e6a11ecf320cd3894e66a4f4407..95f1409b8e9cb9a2d4325338a8bee991a5a15bcd 100644 (file)
@@ -3630,9 +3630,9 @@ void RGWPutObj::execute()
   // create the object processor
   rgw::AioThrottle aio(store->ctx()->_conf->rgw_put_obj_min_window_size);
   using namespace rgw::putobj;
-  constexpr auto max_processor_size = std::max(sizeof(MultipartObjectProcessor),
+  constexpr auto max_processor_size = std::max({sizeof(MultipartObjectProcessor),
                                                sizeof(AtomicObjectProcessor),
-                                               sizeof(AppendObjectProcessor));
+                                               sizeof(AppendObjectProcessor)});
   ceph::static_ptr<ObjectProcessor, max_processor_size> processor;
 
   rgw_placement_rule *pdest_placement;
@@ -3657,8 +3657,13 @@ void RGWPutObj::execute()
         s->owner.get_id(), obj_ctx, obj,
         multipart_upload_id, multipart_part_num, multipart_part_str);
   } else if(append) {
+    if (s->bucket_info.versioned()) {
+      op_ret = -ERR_INVALID_BUCKET_STATE;
+      return;
+    }
+    pdest_placement = &s->dest_placement;
     processor.emplace<AppendObjectProcessor>(
-            &aio, store, s->bucket_info, s->bucket_owner.get_id(),obj_ctx, obj,
+            &aio, store, s->bucket_info, pdest_placement, s->bucket_owner.get_id(),obj_ctx, obj,
             s->req_id, position, &cur_accounted_size);
   } else {
     if (s->bucket_info.versioning_enabled()) {
index 365ad49d1aeb3bda7815a5ce2c0ac3ae7b0c7c13..7b3a9754a49249e5aba8d77c2fb139e726f732a8 100644 (file)
@@ -564,7 +564,7 @@ int AppendObjectProcessor::prepare()
   }
   manifest.set_multipart_part_rule(store->ctx()->_conf->rgw_obj_stripe_size, cur_part_num);
 
-  r = manifest_gen.create_begin(store->ctx(), &manifest, bucket_info.placement_rule, head_obj.bucket, head_obj);
+  r = manifest_gen.create_begin(store->ctx(), &manifest, bucket_info.placement_rule, &tail_placement_rule, head_obj.bucket, head_obj);
   if (r < 0) {
     return r;
   }
index a8b65307ff26f1cedbcb3db9fdef4542352d0ded..6fd36c009e48f7b93a4ea375b3c7c4722a79f7cd 100644 (file)
@@ -182,6 +182,7 @@ class AtomicObjectProcessor : public ManifestObjectProcessor {
                const char *if_match, const char *if_nomatch,
                const std::string *user_data,
                rgw_zone_set *zones_trace, bool *canceled) override;
+
 };
 
 
@@ -242,9 +243,10 @@ class MultipartObjectProcessor : public ManifestObjectProcessor {
 
   public:
     AppendObjectProcessor(Aio *aio, RGWRados *store, const RGWBucketInfo& bucket_info,
+                          const rgw_placement_rule *ptail_placement_rule,
                           const rgw_user& owner, RGWObjectCtx& obj_ctx,const rgw_obj& head_obj,
                           const std::string& unique_tag, uint64_t position, uint64_t *cur_accounted_size)
-            : ManifestObjectProcessor(aio, store, bucket_info, owner, obj_ctx, head_obj),
+            : ManifestObjectProcessor(aio, store, bucket_info, ptail_placement_rule, owner, obj_ctx, head_obj),
               position(position), cur_size(0), cur_accounted_size(cur_accounted_size),
               unique_tag(unique_tag), cur_manifest(nullptr)
     {}
index f54746858a982a3c5ac3e585cd8b0c98cacf08b4..4773473e950a68fedf89664da63fe0397b28f3d5 100644 (file)
@@ -4431,6 +4431,9 @@ int RGWRados::fetch_remote_obj(RGWObjectCtx& obj_ctx,
     }
   }
 
+  //erase the append attr
+  cb.get_attrs().erase(RGW_ATTR_APPEND_PART_NUM);
+
   if (source_zone.empty()) {
     set_copy_attrs(cb.get_attrs(), attrs, attrs_mod);
   } else {