From f212158d612b16209163695a978fa573b13fb85f Mon Sep 17 00:00:00 2001 From: yah01 Date: Fri, 27 Oct 2023 10:24:10 +0800 Subject: [PATCH] Fix delete records timestamp may be reordered (#27941) Signed-off-by: yah01 --- .../core/src/segcore/SegmentGrowingImpl.cpp | 22 ++++++++++++------- .../core/src/segcore/SegmentSealedImpl.cpp | 20 ++++++++++------- 2 files changed, 26 insertions(+), 16 deletions(-) diff --git a/internal/core/src/segcore/SegmentGrowingImpl.cpp b/internal/core/src/segcore/SegmentGrowingImpl.cpp index 72a2295feb..69703b9952 100644 --- a/internal/core/src/segcore/SegmentGrowingImpl.cpp +++ b/internal/core/src/segcore/SegmentGrowingImpl.cpp @@ -17,6 +17,7 @@ #include #include #include +#include #include "common/Consts.h" #include "common/EasyAssert.h" @@ -236,19 +237,24 @@ SegmentGrowingImpl::Delete(int64_t reserved_begin, ParsePksFromIDs(pks, field_meta.get_data_type(), *ids); // filter out the deletions that the primary key not exists - auto end = std::remove_if(pks.begin(), pks.end(), [&](const PkType& pk) { - return !insert_record_.contain(pk); - }); - size = end - pks.begin(); + std::vector> ordering(size); + for (int i = 0; i < size; i++) { + ordering[i] = std::make_tuple(timestamps_raw[i], pks[i]); + } + auto end = + std::remove_if(ordering.begin(), + ordering.end(), + [&](const std::tuple& record) { + return !insert_record_.contain(std::get<1>(record)); + }); + size = end - ordering.begin(); + ordering.resize(size); if (size == 0) { return SegcoreError::success(); } // step 1: sort timestamp - std::vector> ordering(size); - for (int i = 0; i < size; i++) { - ordering[i] = std::make_tuple(timestamps_raw[i], pks[i]); - } + std::sort(ordering.begin(), ordering.end()); std::vector sort_pks(size); std::vector sort_timestamps(size); diff --git a/internal/core/src/segcore/SegmentSealedImpl.cpp b/internal/core/src/segcore/SegmentSealedImpl.cpp index 608cdc6fce..65706913e6 100644 --- a/internal/core/src/segcore/SegmentSealedImpl.cpp +++ b/internal/core/src/segcore/SegmentSealedImpl.cpp @@ -1147,19 +1147,23 @@ SegmentSealedImpl::Delete(int64_t reserved_offset, // deprecated ParsePksFromIDs(pks, field_meta.get_data_type(), *ids); // filter out the deletions that the primary key not exists - auto end = std::remove_if(pks.begin(), pks.end(), [&](const PkType& pk) { - return !insert_record_.contain(pk); - }); - size = end - pks.begin(); + std::vector> ordering(size); + for (int i = 0; i < size; i++) { + ordering[i] = std::make_tuple(timestamps_raw[i], pks[i]); + } + auto end = + std::remove_if(ordering.begin(), + ordering.end(), + [&](const std::tuple& record) { + return !insert_record_.contain(std::get<1>(record)); + }); + size = end - ordering.begin(); + ordering.resize(size); if (size == 0) { return SegcoreError::success(); } // step 1: sort timestamp - std::vector> ordering(size); - for (int i = 0; i < size; i++) { - ordering[i] = std::make_tuple(timestamps_raw[i], pks[i]); - } std::sort(ordering.begin(), ordering.end()); std::vector sort_pks(size); std::vector sort_timestamps(size);