From e46bbb885e427abb8c7b7db0caf6c8925a2fc3a6 Mon Sep 17 00:00:00 2001 From: Daniel Gryniewicz Date: Mon, 16 Aug 2021 14:39:25 -0400 Subject: [PATCH] RGW - Zipper - Remove WriteOp As part of removing RGWObjManifest from the Zipper API, we need to remove WriteOp. Fortunately, with the multipart upload changes, it's no longer needed outside the RadosStore. Signed-off-by: Daniel Gryniewicz --- src/rgw/rgw_op.cc | 52 ++----------- src/rgw/rgw_putobj_processor.cc | 127 +++++++++++++++----------------- src/rgw/rgw_sal.h | 49 ++---------- src/rgw/rgw_sal_rados.cc | 118 +++++++++++++---------------- src/rgw/rgw_sal_rados.h | 27 ++----- 5 files changed, 136 insertions(+), 237 deletions(-) diff --git a/src/rgw/rgw_op.cc b/src/rgw/rgw_op.cc index 620891cc935..6c9d19e43ec 100644 --- a/src/rgw/rgw_op.cc +++ b/src/rgw/rgw_op.cc @@ -5993,12 +5993,9 @@ void RGWCompleteMultipart::execute(optional_yield y) RGWMultiCompleteUpload *parts; RGWMultiXMLParser parser; std::unique_ptr upload; - rgw::sal::Attrs attrs; off_t ofs = 0; - bufferlist etag_bl; std::unique_ptr meta_obj; std::unique_ptr target_obj; - RGWObjManifest manifest; uint64_t olh_epoch = 0; op_ret = get_params(y); @@ -6045,8 +6042,6 @@ void RGWCompleteMultipart::execute(optional_yield y) list remove_objs; /* objects to be removed from index listing */ - bool versioned_object = s->bucket->versioning_enabled(); - meta_obj = upload->get_meta_obj(); meta_obj->set_in_extra_data(true); meta_obj->set_hash_source(s->object->get_name()); @@ -6077,7 +6072,6 @@ void RGWCompleteMultipart::execute(optional_yield y) << " ret=" << op_ret << dendl; return; } - attrs = meta_obj->get_attrs(); // make reservation for notification if needed std::unique_ptr res = store->get_notification(meta_obj.get(), @@ -6087,25 +6081,8 @@ void RGWCompleteMultipart::execute(optional_yield y) return; } - op_ret = upload->complete(this, s->cct, etag, manifest, parts->parts, remove_objs, accounted_size, compressed, cs_info, ofs); - if (op_ret < 0) { - ldpp_dout(this, 0) << "ERROR: upload complete failed ret=" << op_ret << dendl; - return; - } - - etag_bl.append(etag); - - attrs[RGW_ATTR_ETAG] = etag_bl; - - if (compressed) { - // write compression attribute to full object - bufferlist tmp; - encode(cs_info, tmp); - attrs[RGW_ATTR_COMPRESSION] = tmp; - } - target_obj = s->bucket->get_object(rgw_obj_key(s->object->get_name())); - if (versioned_object) { + if (s->bucket->versioning_enabled()) { if (!version_id.empty()) { target_obj->set_instance(version_id); } else { @@ -6113,30 +6090,13 @@ void RGWCompleteMultipart::execute(optional_yield y) version_id = target_obj->get_instance(); } } + target_obj->set_attrs(meta_obj->get_attrs()); - RGWObjectCtx& obj_ctx = *static_cast(s->obj_ctx); - - target_obj->set_atomic(&obj_ctx); - - std::unique_ptr obj_op = target_obj->get_write_op(&obj_ctx); - - obj_op->params.manifest = &manifest; - obj_op->params.remove_objs = &remove_objs; - - obj_op->params.ptag = &s->req_id; /* use req_id as operation tag */ - obj_op->params.owner = s->owner; - obj_op->params.flags = PUT_OBJ_CREATE; - obj_op->params.modify_tail = true; - obj_op->params.completeMultipart = true; - obj_op->params.olh_epoch = olh_epoch; - obj_op->params.attrs = &attrs; - op_ret = obj_op->prepare(s->yield); - if (op_ret < 0) - return; - - op_ret = obj_op->write_meta(this, ofs, accounted_size, s->yield); - if (op_ret < 0) + op_ret = upload->complete(this, y, s->cct, parts->parts, remove_objs, accounted_size, compressed, cs_info, ofs, s->req_id, s->owner, olh_epoch, target_obj.get(), s->obj_ctx); + if (op_ret < 0) { + ldpp_dout(this, 0) << "ERROR: upload complete failed ret=" << op_ret << dendl; return; + } // remove the upload meta object ; the meta object is not versioned // when the bucket is, as that would add an unneeded delete marker diff --git a/src/rgw/rgw_putobj_processor.cc b/src/rgw/rgw_putobj_processor.cc index cce925df30c..d4b600cfe90 100644 --- a/src/rgw/rgw_putobj_processor.cc +++ b/src/rgw/rgw_putobj_processor.cc @@ -290,41 +290,38 @@ int AtomicObjectProcessor::complete(size_t accounted_size, head_obj->set_atomic(&obj_ctx); - std::unique_ptr obj_op = head_obj->get_write_op(&obj_ctx); + RGWRados::Object op_target(store->getRados(), + head_obj->get_bucket()->get_info(), + obj_ctx, head_obj->get_obj()); + RGWRados::Object::Write obj_op(&op_target); /* some object types shouldn't be versioned, e.g., multipart parts */ - obj_op->params.versioning_disabled = !head_obj->get_bucket()->versioning_enabled(); - obj_op->params.data = &first_chunk; - obj_op->params.manifest = &manifest; - obj_op->params.ptag = &unique_tag; /* use req_id as operation tag */ - obj_op->params.if_match = if_match; - obj_op->params.if_nomatch = if_nomatch; - obj_op->params.mtime = mtime; - obj_op->params.set_mtime = set_mtime; - obj_op->params.owner = ACLOwner(owner); - obj_op->params.flags = PUT_OBJ_CREATE; - obj_op->params.olh_epoch = olh_epoch; - obj_op->params.delete_at = delete_at; - obj_op->params.user_data = user_data; - obj_op->params.zones_trace = zones_trace; - obj_op->params.modify_tail = true; - obj_op->params.attrs = &attrs; - - r = obj_op->prepare(y); + op_target.set_versioning_disabled(!head_obj->get_bucket()->versioning_enabled()); + obj_op.meta.data = &first_chunk; + obj_op.meta.manifest = &manifest; + obj_op.meta.ptag = &unique_tag; /* use req_id as operation tag */ + obj_op.meta.if_match = if_match; + obj_op.meta.if_nomatch = if_nomatch; + obj_op.meta.mtime = mtime; + obj_op.meta.set_mtime = set_mtime; + obj_op.meta.owner = owner; + obj_op.meta.flags = PUT_OBJ_CREATE; + obj_op.meta.olh_epoch = olh_epoch; + obj_op.meta.delete_at = delete_at; + obj_op.meta.user_data = user_data; + obj_op.meta.zones_trace = zones_trace; + obj_op.meta.modify_tail = true; + + r = obj_op.write_meta(dpp, actual_size, accounted_size, attrs, y); if (r < 0) { return r; } - - r = obj_op->write_meta(dpp, actual_size, accounted_size, y); - if (r < 0) { - return r; - } - if (!obj_op->params.canceled) { + if (!obj_op.meta.canceled) { // on success, clear the set of objects for deletion writer.clear_written(); } if (pcanceled) { - *pcanceled = obj_op->params.canceled; + *pcanceled = obj_op.meta.canceled; } return 0; } @@ -427,23 +424,21 @@ int MultipartObjectProcessor::complete(size_t accounted_size, return r; } - std::unique_ptr obj_op = head_obj->get_write_op(&obj_ctx); + RGWRados::Object op_target(store->getRados(), + head_obj->get_bucket()->get_info(), + obj_ctx, head_obj->get_obj()); + RGWRados::Object::Write obj_op(&op_target); - obj_op->params.versioning_disabled = true; - obj_op->params.set_mtime = set_mtime; - obj_op->params.mtime = mtime; - obj_op->params.owner = ACLOwner(owner); - obj_op->params.delete_at = delete_at; - obj_op->params.zones_trace = zones_trace; - obj_op->params.modify_tail = true; - obj_op->params.attrs = &attrs; - obj_op->params.pmeta_placement_rule = &tail_placement_rule; - r = obj_op->prepare(y); - if (r < 0) { - return r; - } + op_target.set_versioning_disabled(true); + op_target.set_meta_placement_rule(&tail_placement_rule); + obj_op.meta.set_mtime = set_mtime; + obj_op.meta.mtime = mtime; + obj_op.meta.owner = owner; + obj_op.meta.delete_at = delete_at; + obj_op.meta.zones_trace = zones_trace; + obj_op.meta.modify_tail = true; - r = obj_op->write_meta(dpp, actual_size, accounted_size, y); + r = obj_op.write_meta(dpp, actual_size, accounted_size, attrs, y); if (r < 0) return r; @@ -484,12 +479,12 @@ int MultipartObjectProcessor::complete(size_t accounted_size, return r == -ENOENT ? -ERR_NO_SUCH_UPLOAD : r; } - if (!obj_op->params.canceled) { + if (!obj_op.meta.canceled) { // on success, clear the set of objects for deletion writer.clear_written(); } if (pcanceled) { - *pcanceled = obj_op->params.canceled; + *pcanceled = obj_op.meta.canceled; } return 0; } @@ -610,26 +605,28 @@ int AppendObjectProcessor::complete(size_t accounted_size, const string &etag, c return r; } head_obj->set_atomic(&obj_ctx); - std::unique_ptr obj_op = head_obj->get_write_op(&obj_ctx); + RGWRados::Object op_target(store->getRados(), + head_obj->get_bucket()->get_info(), + obj_ctx, head_obj->get_obj()); + RGWRados::Object::Write obj_op(&op_target); //For Append obj, disable versioning - obj_op->params.versioning_disabled = true; + op_target.set_versioning_disabled(true); if (cur_manifest) { cur_manifest->append(dpp, manifest, store->get_zone()); - obj_op->params.manifest = cur_manifest; + obj_op.meta.manifest = cur_manifest; } else { - obj_op->params.manifest = &manifest; - } - obj_op->params.ptag = &unique_tag; /* use req_id as operation tag */ - obj_op->params.mtime = mtime; - obj_op->params.set_mtime = set_mtime; - obj_op->params.owner = ACLOwner(owner); - obj_op->params.flags = PUT_OBJ_CREATE; - obj_op->params.delete_at = delete_at; - obj_op->params.user_data = user_data; - obj_op->params.zones_trace = zones_trace; - obj_op->params.modify_tail = true; - obj_op->params.appendable = true; - obj_op->params.attrs = &attrs; + obj_op.meta.manifest = &manifest; + } + obj_op.meta.ptag = &unique_tag; /* use req_id as operation tag */ + obj_op.meta.mtime = mtime; + obj_op.meta.set_mtime = set_mtime; + obj_op.meta.owner = owner; + obj_op.meta.flags = PUT_OBJ_CREATE; + obj_op.meta.delete_at = delete_at; + obj_op.meta.user_data = user_data; + obj_op.meta.zones_trace = zones_trace; + obj_op.meta.modify_tail = true; + obj_op.meta.appendable = true; //Add the append part number bufferlist cur_part_num_bl; using ceph::encode; @@ -653,20 +650,18 @@ int AppendObjectProcessor::complete(size_t accounted_size, const string &etag, c etag_bl.append(final_etag_str, strlen(final_etag_str) + 1); attrs[RGW_ATTR_ETAG] = etag_bl; } - r = obj_op->prepare(y); - if (r < 0) { - return r; - } - r = obj_op->write_meta(dpp, actual_size + cur_size, accounted_size + *cur_accounted_size, y); + r = obj_op.write_meta(dpp, actual_size + cur_size, + accounted_size + *cur_accounted_size, + attrs, y); if (r < 0) { return r; } - if (!obj_op->params.canceled) { + if (!obj_op.meta.canceled) { // on success, clear the set of objects for deletion writer.clear_written(); } if (pcanceled) { - *pcanceled = obj_op->params.canceled; + *pcanceled = obj_op.meta.canceled; } *cur_accounted_size += accounted_size; diff --git a/src/rgw/rgw_sal.h b/src/rgw/rgw_sal.h index 2c2f26df014..4299c27dd0a 100644 --- a/src/rgw/rgw_sal.h +++ b/src/rgw/rgw_sal.h @@ -600,43 +600,6 @@ class Object { virtual int get_attr(const DoutPrefixProvider* dpp, const char* name, bufferlist& dest, optional_yield y) = 0; }; - struct WriteOp { - struct Params { - bool versioning_disabled{false}; - ceph::real_time* mtime{nullptr}; - Attrs* rmattrs{nullptr}; - const bufferlist* data{nullptr}; - RGWObjManifest* manifest{nullptr}; - const std::string* ptag{nullptr}; - std::list* remove_objs{nullptr}; - ceph::real_time set_mtime; - ACLOwner owner; - RGWObjCategory category{RGWObjCategory::Main}; - int flags{0}; - const char* if_match{nullptr}; - const char* if_nomatch{nullptr}; - std::optional olh_epoch; - ceph::real_time delete_at; - bool canceled{false}; - const std::string* user_data{nullptr}; - rgw_zone_set* zones_trace{nullptr}; - bool modify_tail{false}; - bool completeMultipart{false}; - bool appendable{false}; - Attrs* attrs{nullptr}; - // In MultipartObjectProcessor::complete, we need this parameter - // to tell the exact placement rule since it may be different from - // bucket.placement_rule when Storage Class is specified explicitly - const rgw_placement_rule *pmeta_placement_rule{nullptr}; - } params; - - virtual ~WriteOp() = default; - - virtual int prepare(optional_yield y) = 0; - virtual int write_meta(const DoutPrefixProvider* dpp, uint64_t size, uint64_t accounted_size, optional_yield y) = 0; - //virtual int write_data(const char* data, uint64_t ofs, uint64_t len, bool exclusive) = 0; - }; - struct DeleteOp { struct Params { ACLOwner bucket_owner; @@ -757,6 +720,7 @@ class Object { Attrs& get_attrs(void) { return attrs; } const Attrs& get_attrs(void) const { return attrs; } + virtual int set_attrs(Attrs a) { attrs = a; return 0; } ceph::real_time get_mtime(void) const { return mtime; } uint64_t get_obj_size(void) const { return obj_size; } Bucket* get_bucket(void) const { return bucket; } @@ -788,7 +752,6 @@ class Object { /* OPs */ virtual std::unique_ptr get_read_op(RGWObjectCtx*) = 0; - virtual std::unique_ptr get_write_op(RGWObjectCtx*) = 0; virtual std::unique_ptr get_delete_op(RGWObjectCtx*) = 0; virtual std::unique_ptr get_stat_op(RGWObjectCtx*) = 0; @@ -873,12 +836,16 @@ public: bool assume_unsorted = false) = 0; virtual int abort(const DoutPrefixProvider* dpp, CephContext* cct, RGWObjectCtx* obj_ctx) = 0; - virtual int complete(const DoutPrefixProvider* dpp, CephContext* cct, - std::string& etag, RGWObjManifest& manifest, + virtual int complete(const DoutPrefixProvider* dpp, + optional_yield y, CephContext* cct, std::map& part_etags, std::list& remove_objs, uint64_t& accounted_size, bool& compressed, - RGWCompressionInfo& cs_info, off_t& ofs) = 0; + RGWCompressionInfo& cs_info, off_t& ofs, + std::string& tag, ACLOwner& owner, + uint64_t olh_epoch, + rgw::sal::Object* target_obj, + RGWObjectCtx* obj_ctx) = 0; virtual int get_info(const DoutPrefixProvider *dpp, optional_yield y, RGWObjectCtx* obj_ctx, rgw_placement_rule** rule, rgw::sal::Attrs* attrs = nullptr) = 0; diff --git a/src/rgw/rgw_sal_rados.cc b/src/rgw/rgw_sal_rados.cc index 0b628855203..a7aff70c1b9 100644 --- a/src/rgw/rgw_sal_rados.cc +++ b/src/rgw/rgw_sal_rados.cc @@ -2022,57 +2022,6 @@ int RadosObject::RadosReadOp::iterate(const DoutPrefixProvider* dpp, int64_t ofs return parent_op.iterate(dpp, ofs, end, cb, y); } -std::unique_ptr RadosObject::get_write_op(RGWObjectCtx* ctx) -{ - return std::unique_ptr(new RadosObject::RadosWriteOp(this, ctx)); -} - -RadosObject::RadosWriteOp::RadosWriteOp(RadosObject* _source, RGWObjectCtx* _rctx) : - source(_source), - rctx(_rctx), - op_target(_source->store->getRados(), - _source->get_bucket()->get_info(), - *static_cast(rctx), - _source->get_obj()), - parent_op(&op_target) -{ } - -int RadosObject::RadosWriteOp::prepare(optional_yield y) -{ - op_target.set_versioning_disabled(params.versioning_disabled); - op_target.set_meta_placement_rule(params.pmeta_placement_rule); - parent_op.meta.mtime = params.mtime; - parent_op.meta.rmattrs = params.rmattrs; - parent_op.meta.data = params.data; - parent_op.meta.manifest = params.manifest; - parent_op.meta.ptag = params.ptag; - parent_op.meta.remove_objs = params.remove_objs; - parent_op.meta.set_mtime = params.set_mtime; - parent_op.meta.owner = params.owner.get_id(); - parent_op.meta.category = params.category; - parent_op.meta.flags = params.flags; - parent_op.meta.if_match = params.if_match; - parent_op.meta.if_nomatch = params.if_nomatch; - parent_op.meta.olh_epoch = params.olh_epoch; - parent_op.meta.delete_at = params.delete_at; - parent_op.meta.canceled = params.canceled; - parent_op.meta.user_data = params.user_data; - parent_op.meta.zones_trace = params.zones_trace; - parent_op.meta.modify_tail = params.modify_tail; - parent_op.meta.completeMultipart = params.completeMultipart; - parent_op.meta.appendable = params.appendable; - - return 0; -} - -int RadosObject::RadosWriteOp::write_meta(const DoutPrefixProvider* dpp, uint64_t size, uint64_t accounted_size, optional_yield y) -{ - int ret = parent_op.write_meta(dpp, size, accounted_size, *params.attrs, y); - params.canceled = parent_op.meta.canceled; - - return ret; -} - int RadosObject::swift_versioning_restore(RGWObjectCtx* obj_ctx, bool& restored, const DoutPrefixProvider* dpp) @@ -2203,25 +2152,25 @@ int RadosMultipartUpload::init(const DoutPrefixProvider *dpp, optional_yield y, obj->set_in_extra_data(true); obj->set_hash_source(oid); - std::unique_ptr obj_op = obj->get_write_op(obj_ctx); + RGWRados::Object op_target(store->getRados(), + obj->get_bucket()->get_info(), + *obj_ctx, obj->get_obj()); + RGWRados::Object::Write obj_op(&op_target); - obj_op->params.versioning_disabled = true; /* no versioning for multipart meta */ - obj_op->params.owner = owner; - obj_op->params.category = RGWObjCategory::MultiMeta; - obj_op->params.flags = PUT_OBJ_CREATE_EXCL; - obj_op->params.mtime = &mtime; - obj_op->params.attrs = &attrs; + op_target.set_versioning_disabled(true); /* no versioning for multipart meta */ + obj_op.meta.owner = owner.get_id(); + obj_op.meta.category = RGWObjCategory::MultiMeta; + obj_op.meta.flags = PUT_OBJ_CREATE_EXCL; + obj_op.meta.mtime = &mtime; multipart_upload_info upload_info; upload_info.dest_placement = dest_placement; bufferlist bl; encode(upload_info, bl); - obj_op->params.data = &bl; + obj_op.meta.data = &bl; - ret = obj_op->prepare(y); - - ret = obj_op->write_meta(dpp, bl.length(), 0, y); + ret = obj_op.write_meta(dpp, bl.length(), 0, attrs, y); } while (ret == -EEXIST); return ret; @@ -2327,15 +2276,21 @@ int RadosMultipartUpload::list_parts(const DoutPrefixProvider *dpp, CephContext return 0; } -int RadosMultipartUpload::complete(const DoutPrefixProvider *dpp, CephContext* cct, - std::string& etag, RGWObjManifest& manifest, +int RadosMultipartUpload::complete(const DoutPrefixProvider *dpp, + optional_yield y, CephContext* cct, map& part_etags, list& remove_objs, uint64_t& accounted_size, bool& compressed, - RGWCompressionInfo& cs_info, off_t& ofs) + RGWCompressionInfo& cs_info, off_t& ofs, + std::string& tag, ACLOwner& owner, + uint64_t olh_epoch, + rgw::sal::Object* target_obj, + RGWObjectCtx* obj_ctx) { char final_etag[CEPH_CRYPTO_MD5_DIGESTSIZE]; char final_etag_str[CEPH_CRYPTO_MD5_DIGESTSIZE * 2 + 16]; + std::string etag; + bufferlist etag_bl; MD5 hash; bool truncated; int ret; @@ -2346,6 +2301,7 @@ int RadosMultipartUpload::complete(const DoutPrefixProvider *dpp, CephContext* c int marker = 0; uint64_t min_part_size = cct->_conf->rgw_multipart_min_part_size; auto etags_iter = part_etags.begin(); + rgw::sal::Attrs attrs = target_obj->get_attrs(); do { ret = list_parts(dpp, cct, max_parts, marker, &marker, &truncated); @@ -2456,6 +2412,38 @@ int RadosMultipartUpload::complete(const DoutPrefixProvider *dpp, CephContext* c etag = final_etag_str; ldpp_dout(dpp, 10) << "calculated etag: " << etag << dendl; + etag_bl.append(etag); + + attrs[RGW_ATTR_ETAG] = etag_bl; + + if (compressed) { + // write compression attribute to full object + bufferlist tmp; + encode(cs_info, tmp); + attrs[RGW_ATTR_COMPRESSION] = tmp; + } + + target_obj->set_atomic(obj_ctx); + + RGWRados::Object op_target(store->getRados(), + target_obj->get_bucket()->get_info(), + *obj_ctx, target_obj->get_obj()); + RGWRados::Object::Write obj_op(&op_target); + + obj_op.meta.manifest = &manifest; + obj_op.meta.remove_objs = &remove_objs; + + obj_op.meta.ptag = &tag; /* use req_id as operation tag */ + obj_op.meta.owner = owner.get_id(); + obj_op.meta.flags = PUT_OBJ_CREATE; + obj_op.meta.modify_tail = true; + obj_op.meta.completeMultipart = true; + obj_op.meta.olh_epoch = olh_epoch; + + ret = obj_op.write_meta(dpp, ofs, accounted_size, attrs, y); + if (ret < 0) + return ret; + return ret; } diff --git a/src/rgw/rgw_sal_rados.h b/src/rgw/rgw_sal_rados.h index 3a9db6e045b..21627cea6e6 100644 --- a/src/rgw/rgw_sal_rados.h +++ b/src/rgw/rgw_sal_rados.h @@ -98,21 +98,6 @@ class RadosObject : public Object { virtual int get_attr(const DoutPrefixProvider* dpp, const char* name, bufferlist& dest, optional_yield y) override; }; - struct RadosWriteOp : public WriteOp { - private: - RadosObject* source; - RGWObjectCtx* rctx; - RGWRados::Object op_target; - RGWRados::Object::Write parent_op; - - public: - RadosWriteOp(RadosObject* _source, RGWObjectCtx* _rctx); - - virtual int prepare(optional_yield y) override; - virtual int write_meta(const DoutPrefixProvider* dpp, uint64_t size, uint64_t accounted_size, optional_yield y) override; - //virtual int write_data(const char* data, uint64_t ofs, uint64_t len, bool exclusive) override; - }; - struct RadosDeleteOp : public DeleteOp { private: RadosObject* source; @@ -218,7 +203,6 @@ class RadosObject : public Object { /* OPs */ virtual std::unique_ptr get_read_op(RGWObjectCtx *) override; - virtual std::unique_ptr get_write_op(RGWObjectCtx *) override; virtual std::unique_ptr get_delete_op(RGWObjectCtx*) override; virtual std::unique_ptr get_stat_op(RGWObjectCtx*) override; @@ -546,6 +530,7 @@ class RadosMultipartUpload : public MultipartUpload { RGWMPObj mp_obj; ceph::real_time mtime; rgw_placement_rule placement; + RGWObjManifest manifest; public: RadosMultipartUpload(RadosStore* _store, Bucket* _bucket, const std::string& oid, std::optional upload_id, ceph::real_time _mtime) : MultipartUpload(_bucket), store(_store), mp_obj(oid, upload_id), mtime(_mtime) {} @@ -563,12 +548,16 @@ public: bool assume_unsorted = false) override; virtual int abort(const DoutPrefixProvider* dpp, CephContext* cct, RGWObjectCtx* obj_ctx) override; - virtual int complete(const DoutPrefixProvider* dpp, CephContext* cct, - std::string& etag, RGWObjManifest& manifest, + virtual int complete(const DoutPrefixProvider* dpp, + optional_yield y, CephContext* cct, std::map& part_etags, std::list& remove_objs, uint64_t& accounted_size, bool& compressed, - RGWCompressionInfo& cs_info, off_t& ofs) override; + RGWCompressionInfo& cs_info, off_t& ofs, + std::string& tag, ACLOwner& owner, + uint64_t olh_epoch, + rgw::sal::Object* target_obj, + RGWObjectCtx* obj_ctx) override; virtual int get_info(const DoutPrefixProvider *dpp, optional_yield y, RGWObjectCtx* obj_ctx, rgw_placement_rule** rule, rgw::sal::Attrs* attrs = nullptr) override; virtual std::unique_ptr get_writer(const DoutPrefixProvider *dpp, optional_yield y, -- 2.39.5