This is an automated email from the ASF dual-hosted git repository.

zhangchen 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 e05a0466f2 [improve](Status) Add new status code`KEY_NOT_FOUND` and 
`KEY_ALREADY_EXISTS` for merge on write (#23619)
e05a0466f2 is described below

commit e05a0466f2cb4f23343e1760677804fb06f04856
Author: bobhan1 <bh2444151...@outlook.com>
AuthorDate: Wed Aug 30 08:50:07 2023 +0800

    [improve](Status) Add new status code`KEY_NOT_FOUND` and 
`KEY_ALREADY_EXISTS` for merge on write (#23619)
---
 be/src/common/status.h                           |  6 ++++-
 be/src/olap/rowset/segment_v2/segment.cpp        |  9 ++++---
 be/src/olap/rowset/segment_v2/segment_writer.cpp |  6 ++---
 be/src/olap/tablet.cpp                           | 34 +++++-------------------
 be/src/olap/tablet.h                             |  4 ---
 be/src/service/point_query_executor.cpp          |  2 +-
 6 files changed, 21 insertions(+), 40 deletions(-)

diff --git a/be/src/common/status.h b/be/src/common/status.h
index f949b6bbce..deaa56e91d 100644
--- a/be/src/common/status.h
+++ b/be/src/common/status.h
@@ -268,6 +268,8 @@ E(INVERTED_INDEX_NO_TERMS, -6005);
 E(INVERTED_INDEX_RENAME_FILE_FAILED, -6006);
 E(INVERTED_INDEX_EVALUATE_SKIPPED, -6007);
 E(INVERTED_INDEX_BUILD_WAITTING, -6008);
+E(KEY_NOT_FOUND, -6009);
+E(KEY_ALREADY_EXISTS, -6010);
 #undef E
 } // namespace ErrorCode
 
@@ -305,7 +307,9 @@ constexpr bool capture_stacktrace(int code) {
         && code != ErrorCode::TRANSACTION_NOT_EXIST
         && code != ErrorCode::TRANSACTION_ALREADY_VISIBLE
         && code != ErrorCode::TOO_MANY_TRANSACTIONS
-        && code != ErrorCode::TRANSACTION_ALREADY_COMMITTED;
+        && code != ErrorCode::TRANSACTION_ALREADY_COMMITTED
+        && code != ErrorCode::KEY_NOT_FOUND
+        && code != ErrorCode::KEY_ALREADY_EXISTS;
 }
 // clang-format on
 
diff --git a/be/src/olap/rowset/segment_v2/segment.cpp 
b/be/src/olap/rowset/segment_v2/segment.cpp
index c6d472d035..8a11cd0049 100644
--- a/be/src/olap/rowset/segment_v2/segment.cpp
+++ b/be/src/olap/rowset/segment_v2/segment.cpp
@@ -367,14 +367,14 @@ Status Segment::lookup_row_key(const Slice& key, bool 
with_seq_col, RowLocation*
 
     DCHECK(_pk_index_reader != nullptr);
     if (!_pk_index_reader->check_present(key_without_seq)) {
-        return Status::NotFound("Can't find key in the segment");
+        return Status::Error<ErrorCode::KEY_NOT_FOUND>("Can't find key in the 
segment");
     }
     bool exact_match = false;
     std::unique_ptr<segment_v2::IndexedColumnIterator> index_iterator;
     RETURN_IF_ERROR(_pk_index_reader->new_iterator(&index_iterator));
     RETURN_IF_ERROR(index_iterator->seek_at_or_after(&key_without_seq, 
&exact_match));
     if (!has_seq_col && !exact_match) {
-        return Status::NotFound("Can't find key in the segment");
+        return Status::Error<ErrorCode::KEY_NOT_FOUND>("Can't find key in the 
segment");
     }
     row_location->row_id = index_iterator->get_current_ordinal();
     row_location->segment_id = _segment_id;
@@ -396,7 +396,7 @@ Status Segment::lookup_row_key(const Slice& key, bool 
with_seq_col, RowLocation*
 
         // compare key
         if (key_without_seq.compare(sought_key_without_seq) != 0) {
-            return Status::NotFound("Can't find key in the segment");
+            return Status::Error<ErrorCode::KEY_NOT_FOUND>("Can't find key in 
the segment");
         }
 
         if (!with_seq_col) {
@@ -409,7 +409,8 @@ Status Segment::lookup_row_key(const Slice& key, bool 
with_seq_col, RowLocation*
         Slice previous_sequence_id = Slice(
                 sought_key.get_data() + sought_key_without_seq.get_size() + 1, 
seq_col_length - 1);
         if (sequence_id.compare(previous_sequence_id) < 0) {
-            return Status::AlreadyExist("key with higher sequence id exists");
+            return Status::Error<ErrorCode::KEY_ALREADY_EXISTS>(
+                    "key with higher sequence id exists");
         }
     }
 
diff --git a/be/src/olap/rowset/segment_v2/segment_writer.cpp 
b/be/src/olap/rowset/segment_v2/segment_writer.cpp
index bd3e31596a..639e2ec081 100644
--- a/be/src/olap/rowset/segment_v2/segment_writer.cpp
+++ b/be/src/olap/rowset/segment_v2/segment_writer.cpp
@@ -419,7 +419,7 @@ Status 
SegmentWriter::append_block_with_partial_content(const vectorized::Block*
         RowsetSharedPtr rowset;
         auto st = _tablet->lookup_row_key(key, have_input_seq_column, 
specified_rowsets, &loc,
                                           _mow_context->max_version, 
segment_caches, &rowset);
-        if (st.is<NOT_FOUND>()) {
+        if (st.is<KEY_NOT_FOUND>()) {
             if (_tablet_schema->is_strict_mode()) {
                 ++num_rows_filtered;
                 // delete the invalid newly inserted row
@@ -436,7 +436,7 @@ Status 
SegmentWriter::append_block_with_partial_content(const vectorized::Block*
             use_default_or_null_flag.emplace_back(true);
             continue;
         }
-        if (!st.ok() && !st.is<ALREADY_EXIST>()) {
+        if (!st.ok() && !st.is<KEY_ALREADY_EXISTS>()) {
             LOG(WARNING) << "failed to lookup row key, error: " << st;
             return st;
         }
@@ -454,7 +454,7 @@ Status 
SegmentWriter::append_block_with_partial_content(const vectorized::Block*
             _tablet->prepare_to_read(loc, segment_pos, &_rssid_to_rid);
         }
 
-        if (st.is<ALREADY_EXIST>()) {
+        if (st.is<KEY_ALREADY_EXISTS>()) {
             // although we need to mark delete current row, we still need to 
read missing columns
             // for this row, we need to ensure that each column is aligned
             _mow_context->delete_bitmap->add({_opts.rowset_ctx->rowset_id, 
_segment_id, 0},
diff --git a/be/src/olap/tablet.cpp b/be/src/olap/tablet.cpp
index 76fafe2ddd..644c6a4c59 100644
--- a/be/src/olap/tablet.cpp
+++ b/be/src/olap/tablet.cpp
@@ -2832,10 +2832,10 @@ Status Tablet::lookup_row_key(const Slice& encoded_key, 
bool with_seq_col,
 
         for (auto id : picked_segments) {
             Status s = segments[id]->lookup_row_key(encoded_key, with_seq_col, 
&loc);
-            if (s.is<NOT_FOUND>()) {
+            if (s.is<KEY_NOT_FOUND>()) {
                 continue;
             }
-            if (!s.ok() && !s.is<ALREADY_EXIST>()) {
+            if (!s.ok() && !s.is<KEY_ALREADY_EXISTS>()) {
                 return s;
             }
             if (s.ok() && 
_tablet_meta->delete_bitmap().contains_agg_without_cache(
@@ -2848,7 +2848,7 @@ Status Tablet::lookup_row_key(const Slice& encoded_key, 
bool with_seq_col,
                 // The key is deleted, we don't need to search for it any more.
                 break;
             }
-            // `st` is either OK or ALREADY_EXIST now.
+            // `st` is either OK or KEY_ALREADY_EXISTS now.
             // for partial update, even if the key is already exists, we still 
need to
             // read it's original values to keep all columns align.
             *row_location = loc;
@@ -2861,7 +2861,7 @@ Status Tablet::lookup_row_key(const Slice& encoded_key, 
bool with_seq_col,
         }
     }
     g_tablet_pk_not_found << 1;
-    return Status::NotFound("can't find key in all rowsets");
+    return Status::Error<ErrorCode::KEY_NOT_FOUND>("can't find key in all 
rowsets");
 }
 
 // load segment may do io so it should out lock
@@ -2975,17 +2975,17 @@ Status 
Tablet::calc_segment_delete_bitmap(RowsetSharedPtr rowset,
             RowsetSharedPtr rowset_find;
             auto st = lookup_row_key(key, true, specified_rowsets, &loc, 
dummy_version.first - 1,
                                      segment_caches, &rowset_find);
-            bool expected_st = st.ok() || st.is<NOT_FOUND>() || 
st.is<ALREADY_EXIST>();
+            bool expected_st = st.ok() || st.is<KEY_NOT_FOUND>() || 
st.is<KEY_ALREADY_EXISTS>();
             DCHECK(expected_st) << "unexpected error status while 
lookup_row_key:" << st;
             if (!expected_st) {
                 return st;
             }
-            if (st.is<NOT_FOUND>()) {
+            if (st.is<KEY_NOT_FOUND>()) {
                 continue;
             }
 
             // sequence id smaller than the previous one, so delete current row
-            if (st.is<ALREADY_EXIST>()) {
+            if (st.is<KEY_ALREADY_EXISTS>()) {
                 delete_bitmap->add({rowset_id, seg->id(), 0}, row_id);
                 continue;
             } else if (is_partial_update && rowset_writer != nullptr) {
@@ -3215,26 +3215,6 @@ void Tablet::prepare_to_read(const RowLocation& 
row_location, size_t pos,
     seg_it->second.emplace_back(RidAndPos {row_location.row_id, pos});
 }
 
-Status Tablet::_check_pk_in_pre_segments(
-        RowsetId rowset_id, const std::vector<segment_v2::SegmentSharedPtr>& 
pre_segments,
-        const Slice& key, DeleteBitmapPtr delete_bitmap, RowLocation* loc) {
-    for (auto it = pre_segments.rbegin(); it != pre_segments.rend(); ++it) {
-        auto st = (*it)->lookup_row_key(key, true, loc);
-        DCHECK(st.ok() || st.is<NOT_FOUND>() || st.is<ALREADY_EXIST>())
-                << "unexpected error status while lookup_row_key:" << st;
-        if (st.is<NOT_FOUND>()) {
-            continue;
-        } else if (st.ok() && _schema->has_sequence_col() &&
-                   delete_bitmap->contains({rowset_id, loc->segment_id, 0}, 
loc->row_id)) {
-            // if has sequence col, we continue to compare the sequence_id of
-            // all segments, util we find an existing key.
-            continue;
-        }
-        return st;
-    }
-    return Status::NotFound("Can't find key in the segment");
-}
-
 void Tablet::_rowset_ids_difference(const RowsetIdUnorderedSet& cur,
                                     const RowsetIdUnorderedSet& pre, 
RowsetIdUnorderedSet* to_add,
                                     RowsetIdUnorderedSet* to_del) {
diff --git a/be/src/olap/tablet.h b/be/src/olap/tablet.h
index 8ba3f60c3d..5ea64cce78 100644
--- a/be/src/olap/tablet.h
+++ b/be/src/olap/tablet.h
@@ -580,10 +580,6 @@ private:
     bool _reconstruct_version_tracker_if_necessary();
     void _init_context_common_fields(RowsetWriterContext& context);
 
-    Status _check_pk_in_pre_segments(RowsetId rowset_id,
-                                     const 
std::vector<segment_v2::SegmentSharedPtr>& pre_segments,
-                                     const Slice& key, 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,
diff --git a/be/src/service/point_query_executor.cpp 
b/be/src/service/point_query_executor.cpp
index 4463c0d01a..c7d1b52362 100644
--- a/be/src/service/point_query_executor.cpp
+++ b/be/src/service/point_query_executor.cpp
@@ -287,7 +287,7 @@ Status PointQueryExecutor::_lookup_row_key() {
         st = (_tablet->lookup_row_key(_row_read_ctxs[i]._primary_key, true, 
specified_rowsets,
                                       &location, INT32_MAX /*rethink?*/, 
segment_caches,
                                       rowset_ptr.get()));
-        if (st.is<ErrorCode::NOT_FOUND>()) {
+        if (st.is<ErrorCode::KEY_NOT_FOUND>()) {
             continue;
         }
         RETURN_IF_ERROR(st);


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org
For additional commands, e-mail: commits-h...@doris.apache.org

Reply via email to