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: v18.2.5~472^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=8bb0182d3389b9def5113813df637a5d875f9ed9;p=ceph.git rgw/multisite: avoid writing multipart parts to the bucket index log Signed-off-by: Juan Zhu (cherry picked from commit 6383093e2731c2aec87b5ab286f48dc161edea37) Conflicts: src/rgw/driver/rados/rgw_sal_rados.cc src/rgw/rgw_op.cc --- diff --git a/src/cls/rgw/cls_rgw.cc b/src/cls/rgw/cls_rgw.cc index a7e1b65e8a09..85a773d3ce4e 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 414f44bb8163..4b727b31b120 100644 --- a/src/rgw/driver/rados/rgw_sal_rados.cc +++ b/src/rgw/driver/rados/rgw_sal_rados.cc @@ -2565,7 +2565,7 @@ int RadosMultipartUpload::init(const DoutPrefixProvider *dpp, optional_yield y, encode(upload_info, bl); obj_op.meta.data = &bl; - ret = obj_op.write_meta(dpp, bl.length(), 0, attrs, y); + ret = obj_op.write_meta(dpp, bl.length(), 0, attrs, y, false); } while (ret == -EEXIST); return ret; diff --git a/src/rgw/rgw_op.cc b/src/rgw/rgw_op.cc index bb0bfdbfa7f5..99a1dbbf575c 100644 --- a/src/rgw/rgw_op.cc +++ b/src/rgw/rgw_op.cc @@ -4357,11 +4357,15 @@ 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()); 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, - s->yield, rgw::sal::FLAG_LOG_OP); + s->yield, complete_flags); tracepoint(rgw_op, processor_complete_exit, s->req_id.c_str()); /* produce torrent */ @@ -6645,7 +6649,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();