From 8165044b6d0d0b83750bccb603866d2449df2ec9 Mon Sep 17 00:00:00 2001 From: zhagnlu <1542303831@qq.com> Date: Mon, 6 Jan 2025 15:14:54 +0800 Subject: [PATCH] fix: fix query incorrect in case of concurrent delete (#38991) #38961 Signed-off-by: luzhang Co-authored-by: luzhang --- internal/core/src/segcore/DeletedRecord.h | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/internal/core/src/segcore/DeletedRecord.h b/internal/core/src/segcore/DeletedRecord.h index d9934ed819..3f88dbc372 100644 --- a/internal/core/src/segcore/DeletedRecord.h +++ b/internal/core/src/segcore/DeletedRecord.h @@ -194,6 +194,19 @@ class DeletedRecord { accessor.lower_bound(std::make_pair(query_timestamp, 0)); auto it = start_iter; + + // when end_iter point to skiplist end, concurrent delete may append new value + // after lower_bound() called, so end_iter is not logical valid. + if (end_iter == accessor.end()) { + while (it != accessor.end() && it->first <= query_timestamp) { + if (it->second < insert_barrier) { + bitset.set(it->second); + } + it++; + } + return; + } + while (it != accessor.end() && it != end_iter) { if (it->second < insert_barrier) { bitset.set(it->second);