From: Jane Zhu Date: Fri, 19 Jan 2024 21:31:50 +0000 (-0500) Subject: rgw/multisite: avoid writing multipart parts to the bucket index log X-Git-Tag: v19.3.0~77^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=6383093e2731c2aec87b5ab286f48dc161edea37;p=ceph.git rgw/multisite: avoid writing multipart parts to the bucket index log Signed-off-by: Juan Zhu --- diff --git a/src/cls/rgw/cls_rgw.cc b/src/cls/rgw/cls_rgw.cc index 034660a11ed1..d4350e667518 100644 --- a/src/cls/rgw/cls_rgw.cc +++ b/src/cls/rgw/cls_rgw.cc @@ -963,7 +963,7 @@ static int read_key_entry(cls_method_context_t hctx, const cls_rgw_obj_key& key, // called by rgw_bucket_complete_op() for each item in op.remove_objs static int complete_remove_obj(cls_method_context_t hctx, rgw_bucket_dir_header& header, - const cls_rgw_obj_key& key, bool log_op) + const cls_rgw_obj_key& key) { rgw_bucket_dir_entry entry; string idx; @@ -978,17 +978,6 @@ static int complete_remove_obj(cls_method_context_t hctx, int(entry.meta.category)); unaccount_entry(header, entry); - if (log_op) { - ++header.ver; // increment index version, or we'll overwrite keys previously written - const std::string tag; - ret = log_index_operation(hctx, key, CLS_RGW_OP_DEL, tag, entry.meta.mtime, - entry.ver, CLS_RGW_STATE_COMPLETE, header.ver, - header.max_marker, 0, nullptr, nullptr, nullptr); - if (ret < 0) { - return ret; - } - } - ret = cls_cxx_map_remove_key(hctx, idx); if (ret < 0) { CLS_LOG(1, "%s: cls_cxx_map_remove_key failed with %d", __func__, ret); @@ -1210,7 +1199,7 @@ int rgw_bucket_complete_op(cls_method_context_t hctx, bufferlist *in, bufferlist CLS_LOG_BITX(bitx_inst, 20, "INFO: %s: completing object remove key=%s", __func__, escape_str(remove_key.to_string()).c_str()); - rc = complete_remove_obj(hctx, header, remove_key, default_log_op); + rc = complete_remove_obj(hctx, header, remove_key); if (rc < 0) { CLS_LOG_BITX(bitx_inst, 1, "WARNING: %s: complete_remove_obj, failed to remove entry, " diff --git a/src/rgw/driver/rados/rgw_sal_rados.cc b/src/rgw/driver/rados/rgw_sal_rados.cc index 709e748cb499..64c3c1a9e5e3 100644 --- a/src/rgw/driver/rados/rgw_sal_rados.cc +++ b/src/rgw/driver/rados/rgw_sal_rados.cc @@ -2289,7 +2289,7 @@ int RadosMultipartUpload::init(const DoutPrefixProvider *dpp, optional_yield y, encode(upload_info, bl); obj_op.meta.data = &bl; - ret = obj_op.write_meta(bl.length(), 0, attrs, rctx); + ret = obj_op.write_meta(bl.length(), 0, attrs, rctx, false); } while (ret == -EEXIST); return ret; @@ -2904,7 +2904,7 @@ int RadosMultipartWriter::complete(size_t accounted_size, const std::string& eta uint32_t flags) { return processor.complete(accounted_size, etag, mtime, set_mtime, attrs, delete_at, - if_match, if_nomatch, user_data, zones_trace, canceled, rctx, flags); + if_match, if_nomatch, user_data, zones_trace, canceled, rctx, flags); } bool RadosZoneGroup::placement_target_exists(std::string& target) const diff --git a/src/rgw/rgw_op.cc b/src/rgw/rgw_op.cc index 8f1ae6f4068e..f6011dbe5c9d 100644 --- a/src/rgw/rgw_op.cc +++ b/src/rgw/rgw_op.cc @@ -4525,12 +4525,16 @@ void RGWPutObj::execute(optional_yield y) emplace_attr(RGW_ATTR_OBJECT_RETENTION, std::move(obj_retention_bl)); } + // don't track the individual parts of multipart uploads. they replicate in + // full after CompleteMultipart + const uint32_t complete_flags = multipart ? 0 : rgw::sal::FLAG_LOG_OP; + tracepoint(rgw_op, processor_complete_enter, s->req_id.c_str()); const req_context rctx{this, s->yield, s->trace.get()}; op_ret = processor->complete(s->obj_size, etag, &mtime, real_time(), attrs, (delete_at ? *delete_at : real_time()), if_match, if_nomatch, (user_data.empty() ? nullptr : &user_data), nullptr, nullptr, - rctx, rgw::sal::FLAG_LOG_OP); + rctx, complete_flags); tracepoint(rgw_op, processor_complete_exit, s->req_id.c_str()); if (op_ret < 0) { return; @@ -6798,7 +6802,7 @@ void RGWCompleteMultipart::complete() // when the bucket is, as that would add an unneeded delete marker // moved to complete to prevent segmentation fault in publish commit if (meta_obj.get() != nullptr) { - int ret = meta_obj->delete_object(this, null_yield, rgw::sal::FLAG_PREVENT_VERSIONING | rgw::sal::FLAG_LOG_OP); + int ret = meta_obj->delete_object(this, null_yield, rgw::sal::FLAG_PREVENT_VERSIONING); if (ret >= 0) { /* serializer's exclusive lock is released */ serializer->clear_locked();