]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
osd: optimize extent comparison in PrimaryLogPG 61337/head
authorDongdong Tao <tdd21151186@gmail.com>
Fri, 22 Nov 2024 01:56:30 +0000 (10:56 +0900)
committerIlya Dryomov <idryomov@gmail.com>
Sun, 12 Jan 2025 16:53:21 +0000 (17:53 +0100)
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 <dongdong.tao@canonical.com>
(cherry picked from commit 60797f6862f8387be2b09ad61e198a60c55383d5)

src/osd/PrimaryLogPG.cc

index 6b9010177f44a65482a3d94ee67452beee388b1e..19777c9fb219c93e9bebc3f64fd9516d91bc680c 100644 (file)
@@ -5745,10 +5745,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;
     }
   }