From 018665aba2d0fffae83111d356a696b3294380b1 Mon Sep 17 00:00:00 2001 From: zhannngchen <48427519+zhannngchen@users.noreply.github.com> Date: Fri, 29 Jul 2022 14:44:48 +0800 Subject: [PATCH] [feature-wip](unique-key-merge-on-write) some followup of #11057 (#11290) --- be/src/olap/rowset/beta_rowset_writer.cpp | 8 ++++++++ be/src/olap/rowset/beta_rowset_writer.h | 2 ++ be/src/olap/tablet.cpp | 6 +++++- 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/be/src/olap/rowset/beta_rowset_writer.cpp b/be/src/olap/rowset/beta_rowset_writer.cpp index 5a0625a870..228fcee95b 100644 --- a/be/src/olap/rowset/beta_rowset_writer.cpp +++ b/be/src/olap/rowset/beta_rowset_writer.cpp @@ -249,6 +249,7 @@ RowsetSharedPtr BetaRowsetWriter::build() { } else { _rowset_meta->set_rowset_state(VISIBLE); } + _rowset_meta->set_segments_key_bounds(_segments_encoded_key_bounds); if (_rowset_meta->oldest_write_timestamp() == -1) { _rowset_meta->set_oldest_write_timestamp(UnixSeconds()); @@ -319,6 +320,13 @@ Status BetaRowsetWriter::_flush_segment_writer(std::unique_ptrmin_encoded_key(); + Slice max_key = (*writer)->max_encoded_key(); + DCHECK_LE(min_key.compare(max_key), 0); + key_bounds.set_min_key(min_key.to_string()); + key_bounds.set_max_key(max_key.to_string()); + _segments_encoded_key_bounds.emplace_back(key_bounds); writer->reset(); return Status::OK(); } diff --git a/be/src/olap/rowset/beta_rowset_writer.h b/be/src/olap/rowset/beta_rowset_writer.h index 96a513f5fe..e046f3d101 100644 --- a/be/src/olap/rowset/beta_rowset_writer.h +++ b/be/src/olap/rowset/beta_rowset_writer.h @@ -101,6 +101,8 @@ private: bool _is_pending = false; bool _already_built = false; + // for unique key table with merge-on-write + std::vector _segments_encoded_key_bounds; // record rows number of every segment std::vector _segment_num_rows; }; diff --git a/be/src/olap/tablet.cpp b/be/src/olap/tablet.cpp index 290753de9e..75e64f875e 100644 --- a/be/src/olap/tablet.cpp +++ b/be/src/olap/tablet.cpp @@ -1897,7 +1897,11 @@ Status Tablet::lookup_row_key(const Slice& encoded_key, RowLocation* row_locatio return s; } loc.rowset_id = rs.first->rowset_id(); - // Check delete bitmap, if the row + if (version >= 0 && _tablet_meta->delete_bitmap().contains_agg( + {loc.rowset_id, loc.segment_id, version}, loc.row_id)) { + // The key is deleted, we don't need to search for it any more. + break; + } *row_location = loc; // find it and return return s;