From afd55123eabc0a03bbc366a1cd52ecce72599a36 Mon Sep 17 00:00:00 2001 From: bobhan1 Date: Wed, 20 Dec 2023 11:49:11 +0800 Subject: [PATCH] [fix](partial update) report error directly if missing rowsets during doing alignment when flushing memtable due to compaction (#28677) --- be/src/olap/rowset/beta_rowset_writer.cpp | 12 ++++++++++++ be/src/olap/rowset/segment_v2/segment_writer.cpp | 11 +++++++++++ .../rowset/segment_v2/vertical_segment_writer.cpp | 11 +++++++++++ 3 files changed, 34 insertions(+) diff --git a/be/src/olap/rowset/beta_rowset_writer.cpp b/be/src/olap/rowset/beta_rowset_writer.cpp index 6850ce0f43..85dd966b9a 100644 --- a/be/src/olap/rowset/beta_rowset_writer.cpp +++ b/be/src/olap/rowset/beta_rowset_writer.cpp @@ -182,6 +182,18 @@ Status BetaRowsetWriter::_generate_delete_bitmap(int32_t segment_id) { { std::shared_lock meta_rlock(tablet->get_header_lock()); specified_rowsets = tablet->get_rowset_by_ids(&_context.mow_context->rowset_ids); + if (specified_rowsets.size() != _context.mow_context->rowset_ids.size()) { + LOG(WARNING) << fmt::format( + "[Memtable Flush] some rowsets have been deleted due to " + "compaction(specified_rowsets.size()={}, but rowset_ids.size()={}), reset " + "rowset_ids to the latest value. tablet_id: {}, cur max_version: {}, " + "transaction_id: {}", + specified_rowsets.size(), _context.mow_context->rowset_ids.size(), + _context.tablet->tablet_id(), _context.mow_context->max_version, + _context.mow_context->txn_id); + return Status::InternalError( + "[Memtable Flush] some rowsets have been deleted due to compaction"); + } } OlapStopWatch watch; RETURN_IF_ERROR(tablet->calc_delete_bitmap(rowset, segments, specified_rowsets, diff --git a/be/src/olap/rowset/segment_v2/segment_writer.cpp b/be/src/olap/rowset/segment_v2/segment_writer.cpp index 0b34ce3dc3..a8f53eb317 100644 --- a/be/src/olap/rowset/segment_v2/segment_writer.cpp +++ b/be/src/olap/rowset/segment_v2/segment_writer.cpp @@ -412,6 +412,17 @@ Status SegmentWriter::append_block_with_partial_content(const vectorized::Block* { std::shared_lock rlock(tablet->get_header_lock()); specified_rowsets = tablet->get_rowset_by_ids(&_mow_context->rowset_ids); + if (specified_rowsets.size() != _mow_context->rowset_ids.size()) { + LOG(WARNING) << fmt::format( + "[Memtable Flush] some rowsets have been deleted due to " + "compaction(specified_rowsets.size()={}, but rowset_ids.size()={}), reset " + "rowset_ids to the latest value. tablet_id: {}, cur max_version: {}, " + "transaction_id: {}", + specified_rowsets.size(), _mow_context->rowset_ids.size(), tablet->tablet_id(), + _mow_context->max_version, _mow_context->txn_id); + return Status::InternalError( + "[Memtable Flush] some rowsets have been deleted due to compaction"); + } } std::vector> segment_caches(specified_rowsets.size()); // locate rows in base data diff --git a/be/src/olap/rowset/segment_v2/vertical_segment_writer.cpp b/be/src/olap/rowset/segment_v2/vertical_segment_writer.cpp index 2c8e165faf..4da71aa72a 100644 --- a/be/src/olap/rowset/segment_v2/vertical_segment_writer.cpp +++ b/be/src/olap/rowset/segment_v2/vertical_segment_writer.cpp @@ -346,6 +346,17 @@ Status VerticalSegmentWriter::_append_block_with_partial_content(RowsInBlock& da { std::shared_lock rlock(tablet->get_header_lock()); specified_rowsets = tablet->get_rowset_by_ids(&_mow_context->rowset_ids); + if (specified_rowsets.size() != _mow_context->rowset_ids.size()) { + LOG(WARNING) << fmt::format( + "[Memtable Flush] some rowsets have been deleted due to " + "compaction(specified_rowsets.size()={}, but rowset_ids.size()={}), reset " + "rowset_ids to the latest value. tablet_id: {}, cur max_version: {}, " + "transaction_id: {}", + specified_rowsets.size(), _mow_context->rowset_ids.size(), tablet->tablet_id(), + _mow_context->max_version, _mow_context->txn_id); + return Status::InternalError( + "[Memtable Flush] some rowsets have been deleted due to compaction"); + } } std::vector> segment_caches(specified_rowsets.size()); // locate rows in base data