This is an automated email from the ASF dual-hosted git repository.
yiguolei pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/master by this push:
new a5643822de [feature-wip](unique-key-merge-on-write) fix calculate
delete bitmap when has sequence column (#12789)
a5643822de is described below
commit a5643822dee06277cdeeab38590d8fbb2df50924
Author: Xin Liao <[email protected]>
AuthorDate: Wed Sep 21 09:21:07 2022 +0800
[feature-wip](unique-key-merge-on-write) fix calculate delete bitmap when
has sequence column (#12789)
when the rowset has multiple segments with sequence column, we should
compare sequence id with previous segment.
---
be/src/olap/tablet.cpp | 41 ++++++++++++++++++++++++++++-------------
be/src/olap/tablet.h | 6 +++---
2 files changed, 31 insertions(+), 16 deletions(-)
diff --git a/be/src/olap/tablet.cpp b/be/src/olap/tablet.cpp
index fd935c0a12..257c7a04dc 100644
--- a/be/src/olap/tablet.cpp
+++ b/be/src/olap/tablet.cpp
@@ -2002,19 +2002,30 @@ Status Tablet::calc_delete_bitmap(RowsetId rowset_id,
}
for (size_t i = 0; i < num_read; i++) {
const Slice* key = reinterpret_cast<const
Slice*>(cvb->cell_ptr(i));
+ RowLocation loc;
// first check if exist in pre segment
if (check_pre_segments) {
- bool find = _check_pk_in_pre_segments(pre_segments, *key,
dummy_version,
- delete_bitmap);
- if (find) {
+ auto st = _check_pk_in_pre_segments(pre_segments, *key,
dummy_version,
+ delete_bitmap, &loc);
+ if (st.ok()) {
+ delete_bitmap->add({loc.rowset_id, loc.segment_id,
dummy_version.first},
+ loc.row_id);
+ cnt++;
+ ++row_id;
+ continue;
+ } else if (st.is_already_exist()) {
+ delete_bitmap->add({rowset_id, seg->id(),
dummy_version.first}, row_id);
cnt++;
+ ++row_id;
continue;
}
}
- RowLocation loc;
auto st = lookup_row_key(*key, specified_rowset_ids, &loc,
dummy_version.first - 1);
CHECK(st.ok() || st.is_not_found() || st.is_already_exist());
- if (st.is_not_found()) continue;
+ if (st.is_not_found()) {
+ ++row_id;
+ continue;
+ }
// sequence id smaller than the previous one, so delete
current row
if (st.is_already_exist()) {
@@ -2041,20 +2052,24 @@ Status Tablet::calc_delete_bitmap(RowsetId rowset_id,
return Status::OK();
}
-bool Tablet::_check_pk_in_pre_segments(
+Status Tablet::_check_pk_in_pre_segments(
const std::vector<segment_v2::SegmentSharedPtr>& pre_segments, const
Slice& key,
- const Version& version, DeleteBitmapPtr delete_bitmap) {
+ const Version& version, DeleteBitmapPtr delete_bitmap, RowLocation*
loc) {
for (auto it = pre_segments.rbegin(); it != pre_segments.rend(); ++it) {
- RowLocation loc;
- auto st = (*it)->lookup_row_key(key, &loc);
- CHECK(st.ok() || st.is_not_found());
+ auto st = (*it)->lookup_row_key(key, loc);
+ CHECK(st.ok() || st.is_not_found() || st.is_already_exist());
if (st.is_not_found()) {
continue;
+ } else if (st.ok() && _schema->has_sequence_col() &&
+ delete_bitmap->contains({loc->rowset_id, loc->segment_id,
version.first},
+ loc->row_id)) {
+ // if has sequence col, we continue to compare the sequence_id of
+ // all segments, util we find an existing key.
+ continue;
}
- delete_bitmap->add({loc.rowset_id, loc.segment_id, version.first},
loc.row_id);
- return true;
+ return st;
}
- return false;
+ return Status::NotFound("Can't find key in the segment");
}
void Tablet::_rowset_ids_difference(const RowsetIdUnorderedSet& cur,
diff --git a/be/src/olap/tablet.h b/be/src/olap/tablet.h
index 7020bf0a7f..8152666d80 100644
--- a/be/src/olap/tablet.h
+++ b/be/src/olap/tablet.h
@@ -379,9 +379,9 @@ private:
bool _reconstruct_version_tracker_if_necessary();
void _init_context_common_fields(RowsetWriterContext& context);
- bool _check_pk_in_pre_segments(const
std::vector<segment_v2::SegmentSharedPtr>& pre_segments,
- const Slice& key, const Version& version,
- DeleteBitmapPtr delete_bitmap);
+ Status _check_pk_in_pre_segments(const
std::vector<segment_v2::SegmentSharedPtr>& pre_segments,
+ const Slice& key, const Version& version,
+ DeleteBitmapPtr delete_bitmap,
RowLocation* loc);
void _rowset_ids_difference(const RowsetIdUnorderedSet& cur, const
RowsetIdUnorderedSet& pre,
RowsetIdUnorderedSet* to_add,
RowsetIdUnorderedSet* to_del);
Status _load_rowset_segments(const RowsetSharedPtr& rowset,
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]