From 2ba56074f9085254f9091c7e9a60f7b7ca87c6f5 Mon Sep 17 00:00:00 2001 From: Vitaliy Filippov Date: Wed, 6 May 2026 00:21:59 +0300 Subject: [PATCH] Run copy_part_bitmaps only after all subops succeed (slightly more correct) --- src/client/cluster_client.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/client/cluster_client.cpp b/src/client/cluster_client.cpp index 20e22b69..f7c76464 100644 --- a/src/client/cluster_client.cpp +++ b/src/client/cluster_client.cpp @@ -1119,6 +1119,13 @@ resume_2: // Finished successfully // Even if the PG count has changed in meanwhile we treat it as success // because if some operations were invalid for the new PG count we'd get errors + if (op->opcode == OSD_OP_READ || op->opcode == OSD_OP_READ_BITMAP || op->opcode == OSD_OP_READ_CHAIN_BITMAP) + { + // Copy part bitmaps only after finishing all part reads + for (auto & part: op->parts) + if ((part.flags & (PART_SENT|PART_DONE|PART_VALID)) == (PART_SENT|PART_DONE|PART_VALID)) + copy_part_bitmap(op, &part); + } if (op->opcode == OSD_OP_READ || op->opcode == OSD_OP_READ_CHAIN_BITMAP) { // Check parent inode @@ -1630,13 +1637,6 @@ void cluster_client_t::handle_op_part(cluster_op_part_t *part) } if (op->inflight_count == 0 && !op->retry_after) { - // Copy part bitmaps only after finishing all part reads - if (op->opcode == OSD_OP_READ || op->opcode == OSD_OP_READ_BITMAP || op->opcode == OSD_OP_READ_CHAIN_BITMAP) - { - for (auto & part: op->parts) - if ((part.flags & (PART_SENT|PART_VALID|PART_DONE)) == (PART_SENT|PART_VALID|PART_DONE)) - copy_part_bitmap(op, &part); - } if (op->opcode == OSD_OP_SYNC) continue_sync(op); else