From 363f731d6a2407b5071e7e2c7e687583a06fd045 Mon Sep 17 00:00:00 2001 From: Dongdong Tao Date: Fri, 22 Nov 2024 10:56:30 +0900 Subject: [PATCH] osd: optimize extent comparison in PrimaryLogPG Improve the performance of finish_extent_cmp by using bufferlist iterators instead of array access operator[]. This change: - Replaces O(N) array access with O(1) iterator operations The original implementation used array access which has O(N) complexity for each access in bufferlist (N being the number of buffers in a bufferlist). The new version uses iterators which wprovide O(1) increment operations, reducing the overall function complexity from O(M*N) to O(M) with M being the length of the bufferlist. Fixes: https://tracker.ceph.com/issues/69014 Signed-off-by: Dongdong Tao (cherry picked from commit 60797f6862f8387be2b09ad61e198a60c55383d5) --- src/osd/PrimaryLogPG.cc | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/src/osd/PrimaryLogPG.cc b/src/osd/PrimaryLogPG.cc index 2669bd9fbf9..610c6515ef2 100644 --- a/src/osd/PrimaryLogPG.cc +++ b/src/osd/PrimaryLogPG.cc @@ -5769,10 +5769,19 @@ int PrimaryLogPG::do_extent_cmp(OpContext *ctx, OSDOp& osd_op) int PrimaryLogPG::finish_extent_cmp(OSDOp& osd_op, const bufferlist &read_bl) { - for (uint64_t idx = 0; idx < osd_op.indata.length(); ++idx) { - char read_byte = (idx < read_bl.length() ? read_bl[idx] : 0); - if (osd_op.indata[idx] != read_byte) { - return (-MAX_ERRNO - idx); + auto input_iter = osd_op.indata.begin(); + auto read_iter = read_bl.begin(); + uint64_t idx = 0; + + while (input_iter != osd_op.indata.end()) { + char read_byte = (read_iter != read_bl.end() ? *read_iter : 0); + if (*input_iter != read_byte) { + return (-MAX_ERRNO - idx); + } + ++idx; + ++input_iter; + if (read_iter != read_bl.end()) { + ++read_iter; } } -- 2.39.5