From f806e1ecf0d954e0222bc00464d20aa1963be11d Mon Sep 17 00:00:00 2001 From: zhang Shaowen Date: Wed, 20 Feb 2019 16:15:46 +0800 Subject: [PATCH] rgw: object's append attr will be removed after it's synced to another zone. Signed-off-by: zhang Shaowen --- doc/radosgw/s3/objectops.rst | 8 ++++++-- src/rgw/rgw_common.cc | 1 + src/rgw/rgw_common.h | 1 + src/rgw/rgw_op.cc | 11 ++++++++--- src/rgw/rgw_putobj_processor.cc | 2 +- src/rgw/rgw_putobj_processor.h | 4 +++- src/rgw/rgw_rados.cc | 3 +++ 7 files changed, 23 insertions(+), 7 deletions(-) diff --git a/doc/radosgw/s3/objectops.rst b/doc/radosgw/s3/objectops.rst index 3c8c8750a99..fd7c8d1db56 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 8ab9a98988c..bc9c0c808c3 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 ce9172348ee..41a39ce5014 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 1fe1cf6a569..95f1409b8e9 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 365ad49d1ae..7b3a9754a49 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 a8b65307ff2..6fd36c009e4 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 f54746858a9..4773473e950 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 { -- 2.47.3