From e2f34d7b7866f99f3d4d429fef7c3f07e9cdaa8c Mon Sep 17 00:00:00 2001 From: zhagnlu <1542303831@qq.com> Date: Mon, 1 Sep 2025 14:43:52 +0800 Subject: [PATCH] fix:expand lock range for dump_snapshot (#44130) issue: #44129 Signed-off-by: luzhang Co-authored-by: luzhang --- internal/core/src/segcore/DeletedRecord.h | 61 ++++++++++++----------- 1 file changed, 32 insertions(+), 29 deletions(-) diff --git a/internal/core/src/segcore/DeletedRecord.h b/internal/core/src/segcore/DeletedRecord.h index 34d96b4181..02a41c813a 100644 --- a/internal/core/src/segcore/DeletedRecord.h +++ b/internal/core/src/segcore/DeletedRecord.h @@ -105,7 +105,15 @@ class DeletedRecord { bool can_dump = timestamps[0] >= max_load_timestamp_; if (can_dump) { + auto start_time = std::chrono::steady_clock::now(); DumpSnapshot(); + auto end_time = std::chrono::steady_clock::now(); + auto duration = + std::chrono::duration_cast( + end_time - start_time); + LOG_INFO("dump delete record snapshot cost: {}ms for segment: {}", + duration.count() / 1000, + segment_id_); } } @@ -233,11 +241,11 @@ class DeletedRecord { void DumpSnapshot() { + std::unique_lock lock(snap_lock_); SortedDeleteList::Accessor accessor(deleted_lists_); int total_size = accessor.size(); - int dumped_size = dumped_entry_count_.load(); - while (total_size - dumped_size > DUMP_BATCH_SIZE) { + while (total_size - dumped_entry_count_.load() > DUMP_BATCH_SIZE) { int32_t bitsize = 0; if constexpr (is_sealed) { bitsize = sealed_row_count_; @@ -255,7 +263,7 @@ class DeletedRecord { snapshots_.back().second.size()); } - while (total_size - dumped_size > DUMP_BATCH_SIZE && + while (total_size - dumped_entry_count_.load() > DUMP_BATCH_SIZE && it != accessor.end()) { Timestamp dump_ts = 0; @@ -266,34 +274,29 @@ class DeletedRecord { } } - { - std::unique_lock lock(snap_lock_); - if (dump_ts == last_dump_ts) { - // only update - snapshots_.back().second = std::move(bitmap.clone()); - snap_next_iter_.back() = it; - } else { - // add new snapshot - snapshots_.push_back( - std::make_pair(dump_ts, bitmap.clone())); - Assert(it != accessor.end() && it.good()); - snap_next_iter_.push_back(it); - } - - dumped_entry_count_.store(dumped_size + DUMP_BATCH_SIZE); - LOG_INFO( - "dump delete record snapshot at ts: {}, cursor: {}, " - "total size:{} " - "current snapshot size: {} for segment: {}", - dump_ts, - dumped_size + DUMP_BATCH_SIZE, - total_size, - snapshots_.size(), - segment_id_); - last_dump_ts = dump_ts; + if (dump_ts == last_dump_ts) { + // only update + snapshots_.back().second = std::move(bitmap.clone()); + snap_next_iter_.back() = it; + } else { + // add new snapshot + snapshots_.push_back( + std::make_pair(dump_ts, bitmap.clone())); + Assert(it != accessor.end() && it.good()); + snap_next_iter_.push_back(it); } - dumped_size += DUMP_BATCH_SIZE; + dumped_entry_count_.fetch_add(DUMP_BATCH_SIZE); + LOG_INFO( + "dump delete record snapshot at ts: {}, cursor: {}, " + "total size:{} " + "current snapshot size: {} for segment: {}", + dump_ts, + dumped_entry_count_.load(), + total_size, + snapshots_.size(), + segment_id_); + last_dump_ts = dump_ts; } } }