From: zhang Shaowen Date: Wed, 20 Feb 2019 08:15:46 +0000 (+0800) Subject: rgw: object's append attr will be removed after it's synced to another zone. X-Git-Tag: v14.1.1~144^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=f806e1ecf0d954e0222bc00464d20aa1963be11d;p=ceph.git rgw: object's append attr will be removed after it's synced to another zone. Signed-off-by: zhang Shaowen --- diff --git a/doc/radosgw/s3/objectops.rst b/doc/radosgw/s3/objectops.rst index 3c8c8750a99a..fd7c8d1db562 100644 --- a/doc/radosgw/s3/objectops.rst +++ b/doc/radosgw/s3/objectops.rst @@ -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 | ++---------------+----------------------------+---------------------------------------------------+ + diff --git a/src/rgw/rgw_common.cc b/src/rgw/rgw_common.cc index 8ab9a98988cf..bc9c0c808c33 100644 --- a/src/rgw/rgw_common.cc +++ b/src/rgw/rgw_common.cc @@ -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"}}, diff --git a/src/rgw/rgw_common.h b/src/rgw/rgw_common.h index ce9172348ee5..41a39ce50140 100644 --- a/src/rgw/rgw_common.h +++ b/src/rgw/rgw_common.h @@ -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 diff --git a/src/rgw/rgw_op.cc b/src/rgw/rgw_op.cc index 1fe1cf6a569e..95f1409b8e9c 100644 --- a/src/rgw/rgw_op.cc +++ b/src/rgw/rgw_op.cc @@ -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 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( - &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()) { diff --git a/src/rgw/rgw_putobj_processor.cc b/src/rgw/rgw_putobj_processor.cc index 365ad49d1aeb..7b3a9754a492 100644 --- a/src/rgw/rgw_putobj_processor.cc +++ b/src/rgw/rgw_putobj_processor.cc @@ -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; } diff --git a/src/rgw/rgw_putobj_processor.h b/src/rgw/rgw_putobj_processor.h index a8b65307ff26..6fd36c009e48 100644 --- a/src/rgw/rgw_putobj_processor.h +++ b/src/rgw/rgw_putobj_processor.h @@ -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) {} diff --git a/src/rgw/rgw_rados.cc b/src/rgw/rgw_rados.cc index f54746858a98..4773473e950a 100644 --- a/src/rgw/rgw_rados.cc +++ b/src/rgw/rgw_rados.cc @@ -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 {