github-actions[bot] commented on code in PR #31317:
URL: https://github.com/apache/doris/pull/31317#discussion_r1508834637


##########
be/src/olap/base_tablet.cpp:
##########
@@ -1059,4 +1064,200 @@
     return Status::OK();
 }
 
+Status BaseTablet::check_delete_bitmap_correctness(DeleteBitmapPtr 
delete_bitmap,
+                                                   int64_t max_version, 
int64_t txn_id,
+                                                   const RowsetIdUnorderedSet& 
rowset_ids,
+                                                   
std::vector<RowsetSharedPtr>* rowsets) {
+    RowsetIdUnorderedSet missing_ids;
+    for (const auto& rowsetid : rowset_ids) {
+        if (!delete_bitmap->delete_bitmap.contains({rowsetid, 
DeleteBitmap::INVALID_SEGMENT_ID,
+                                                    
DeleteBitmap::TEMP_VERSION_COMMON})) {
+            missing_ids.insert(rowsetid);
+        }
+    }
+
+    if (!missing_ids.empty()) {
+        LOG(WARNING) << "[txn_id:" << txn_id << "][tablet_id:" << tablet_id()
+                     << "][max_version: " << max_version
+                     << "] check delete bitmap correctness failed!";
+        rapidjson::Document root;
+        root.SetObject();
+        rapidjson::Document required_rowsets_arr;
+        required_rowsets_arr.SetArray();
+        rapidjson::Document missing_rowsets_arr;
+        missing_rowsets_arr.SetArray();
+
+        if (rowsets != nullptr) {
+            for (const auto& rowset : *rowsets) {
+                rapidjson::Value value;
+                std::string version_str = rowset->get_rowset_info_str();
+                value.SetString(version_str.c_str(), version_str.length(),
+                                required_rowsets_arr.GetAllocator());
+                required_rowsets_arr.PushBack(value, 
required_rowsets_arr.GetAllocator());
+            }
+        } else {
+            std::vector<RowsetSharedPtr> rowsets;
+            {
+                std::shared_lock meta_rlock(_meta_lock);
+                rowsets = get_rowset_by_ids(&rowset_ids);
+            }
+            for (const auto& rowset : rowsets) {
+                rapidjson::Value value;
+                std::string version_str = rowset->get_rowset_info_str();
+                value.SetString(version_str.c_str(), version_str.length(),
+                                required_rowsets_arr.GetAllocator());
+                required_rowsets_arr.PushBack(value, 
required_rowsets_arr.GetAllocator());
+            }
+        }
+        for (const auto& missing_rowset_id : missing_ids) {
+            rapidjson::Value miss_value;
+            std::string rowset_id_str = missing_rowset_id.to_string();
+            miss_value.SetString(rowset_id_str.c_str(), rowset_id_str.length(),
+                                 missing_rowsets_arr.GetAllocator());
+            missing_rowsets_arr.PushBack(miss_value, 
missing_rowsets_arr.GetAllocator());
+        }
+
+        root.AddMember("required_rowsets", required_rowsets_arr, 
root.GetAllocator());
+        root.AddMember("missing_rowsets", missing_rowsets_arr, 
root.GetAllocator());
+        rapidjson::StringBuffer strbuf;
+        rapidjson::PrettyWriter<rapidjson::StringBuffer> writer(strbuf);
+        root.Accept(writer);
+        std::string rowset_status_string = std::string(strbuf.GetString());
+        LOG_EVERY_SECOND(WARNING) << rowset_status_string;
+        // let it crash if correctness check failed in Debug mode
+        DCHECK(false) << "delete bitmap correctness check failed in publish 
phase!";
+        return Status::InternalError("check delete bitmap failed!");
+    }
+    return Status::OK();
+}
+
+void BaseTablet::_remove_sentinel_mark_from_delete_bitmap(DeleteBitmapPtr 
delete_bitmap) {
+    for (auto it = delete_bitmap->delete_bitmap.begin(), end = 
delete_bitmap->delete_bitmap.end();
+         it != end;) {
+        if (std::get<1>(it->first) == DeleteBitmap::INVALID_SEGMENT_ID) {
+            it = delete_bitmap->delete_bitmap.erase(it);
+        } else {
+            ++it;
+        }
+    }
+}
+
+Status BaseTablet::update_delete_bitmap(const BaseTabletSPtr& self, const 
TabletTxnInfo* txn_info,

Review Comment:
   warning: function 'update_delete_bitmap' exceeds recommended size/complexity 
thresholds [readability-function-size]
   ```cpp
   Status BaseTablet::update_delete_bitmap(const BaseTabletSPtr& self, const 
TabletTxnInfo* txn_info,
                      ^
   ```
   <details>
   <summary>Additional context</summary>
   
   **be/src/olap/base_tablet.cpp:1144:** 115 lines including whitespace and 
comments (threshold 80)
   ```cpp
   Status BaseTablet::update_delete_bitmap(const BaseTabletSPtr& self, const 
TabletTxnInfo* txn_info,
                      ^
   ```
   
   </details>
   



##########
be/src/olap/base_tablet.cpp:
##########
@@ -1059,4 +1064,200 @@ Status BaseTablet::_capture_consistent_rowsets_unlocked(
     return Status::OK();
 }
 
+Status BaseTablet::check_delete_bitmap_correctness(DeleteBitmapPtr 
delete_bitmap,
+                                                   int64_t max_version, 
int64_t txn_id,
+                                                   const RowsetIdUnorderedSet& 
rowset_ids,
+                                                   
std::vector<RowsetSharedPtr>* rowsets) {
+    RowsetIdUnorderedSet missing_ids;
+    for (const auto& rowsetid : rowset_ids) {
+        if (!delete_bitmap->delete_bitmap.contains({rowsetid, 
DeleteBitmap::INVALID_SEGMENT_ID,
+                                                    
DeleteBitmap::TEMP_VERSION_COMMON})) {
+            missing_ids.insert(rowsetid);
+        }
+    }
+
+    if (!missing_ids.empty()) {
+        LOG(WARNING) << "[txn_id:" << txn_id << "][tablet_id:" << tablet_id()
+                     << "][max_version: " << max_version
+                     << "] check delete bitmap correctness failed!";
+        rapidjson::Document root;
+        root.SetObject();
+        rapidjson::Document required_rowsets_arr;
+        required_rowsets_arr.SetArray();
+        rapidjson::Document missing_rowsets_arr;
+        missing_rowsets_arr.SetArray();
+
+        if (rowsets != nullptr) {
+            for (const auto& rowset : *rowsets) {
+                rapidjson::Value value;
+                std::string version_str = rowset->get_rowset_info_str();
+                value.SetString(version_str.c_str(), version_str.length(),
+                                required_rowsets_arr.GetAllocator());
+                required_rowsets_arr.PushBack(value, 
required_rowsets_arr.GetAllocator());
+            }
+        } else {
+            std::vector<RowsetSharedPtr> rowsets;
+            {
+                std::shared_lock meta_rlock(_meta_lock);
+                rowsets = get_rowset_by_ids(&rowset_ids);
+            }
+            for (const auto& rowset : rowsets) {
+                rapidjson::Value value;
+                std::string version_str = rowset->get_rowset_info_str();
+                value.SetString(version_str.c_str(), version_str.length(),
+                                required_rowsets_arr.GetAllocator());
+                required_rowsets_arr.PushBack(value, 
required_rowsets_arr.GetAllocator());
+            }
+        }
+        for (const auto& missing_rowset_id : missing_ids) {
+            rapidjson::Value miss_value;
+            std::string rowset_id_str = missing_rowset_id.to_string();
+            miss_value.SetString(rowset_id_str.c_str(), rowset_id_str.length(),
+                                 missing_rowsets_arr.GetAllocator());
+            missing_rowsets_arr.PushBack(miss_value, 
missing_rowsets_arr.GetAllocator());
+        }
+
+        root.AddMember("required_rowsets", required_rowsets_arr, 
root.GetAllocator());
+        root.AddMember("missing_rowsets", missing_rowsets_arr, 
root.GetAllocator());
+        rapidjson::StringBuffer strbuf;
+        rapidjson::PrettyWriter<rapidjson::StringBuffer> writer(strbuf);
+        root.Accept(writer);
+        std::string rowset_status_string = std::string(strbuf.GetString());
+        LOG_EVERY_SECOND(WARNING) << rowset_status_string;
+        // let it crash if correctness check failed in Debug mode
+        DCHECK(false) << "delete bitmap correctness check failed in publish 
phase!";
+        return Status::InternalError("check delete bitmap failed!");
+    }
+    return Status::OK();
+}
+
+void BaseTablet::_remove_sentinel_mark_from_delete_bitmap(DeleteBitmapPtr 
delete_bitmap) {
+    for (auto it = delete_bitmap->delete_bitmap.begin(), end = 
delete_bitmap->delete_bitmap.end();
+         it != end;) {
+        if (std::get<1>(it->first) == DeleteBitmap::INVALID_SEGMENT_ID) {
+            it = delete_bitmap->delete_bitmap.erase(it);
+        } else {
+            ++it;
+        }
+    }
+}
+
+Status BaseTablet::update_delete_bitmap(const BaseTabletSPtr& self, const 
TabletTxnInfo* txn_info,

Review Comment:
   warning: function 'update_delete_bitmap' has cognitive complexity of 56 
(threshold 50) [readability-function-cognitive-complexity]
   ```cpp
   Status BaseTablet::update_delete_bitmap(const BaseTabletSPtr& self, const 
TabletTxnInfo* txn_info,
                      ^
   ```
   <details>
   <summary>Additional context</summary>
   
   **be/src/olap/base_tablet.cpp:1162:** +1, including nesting penalty of 0, 
nesting level increased to 1
   ```cpp
       if (txn_info->partial_update_info && 
txn_info->partial_update_info->is_partial_update) {
       ^
   ```
   **be/src/olap/base_tablet.cpp:1162:** +1
   ```cpp
       if (txn_info->partial_update_info && 
txn_info->partial_update_info->is_partial_update) {
                                         ^
   ```
   **be/src/olap/base_tablet.cpp:1168:** +1, including nesting penalty of 0, 
nesting level increased to 1
   ```cpp
       
RETURN_IF_ERROR(std::dynamic_pointer_cast<BetaRowset>(rowset)->load_segments(&segments));
       ^
   ```
   **be/src/common/status.h:541:** expanded from macro 'RETURN_IF_ERROR'
   ```cpp
       do {                                \
       ^
   ```
   **be/src/olap/base_tablet.cpp:1168:** +2, including nesting penalty of 1, 
nesting level increased to 2
   ```cpp
       
RETURN_IF_ERROR(std::dynamic_pointer_cast<BetaRowset>(rowset)->load_segments(&segments));
       ^
   ```
   **be/src/common/status.h:543:** expanded from macro 'RETURN_IF_ERROR'
   ```cpp
           if (UNLIKELY(!_status_.ok())) { \
           ^
   ```
   **be/src/olap/base_tablet.cpp:1174:** +1, including nesting penalty of 0, 
nesting level increased to 1
   ```cpp
           if (self->tablet_state() == TABLET_NOTREADY) {
           ^
   ```
   **be/src/olap/base_tablet.cpp:1179:** +1, including nesting penalty of 0, 
nesting level increased to 1
   ```cpp
           RETURN_IF_ERROR(self->get_all_rs_id_unlocked(cur_version - 1, 
&cur_rowset_ids));
           ^
   ```
   **be/src/common/status.h:541:** expanded from macro 'RETURN_IF_ERROR'
   ```cpp
       do {                                \
       ^
   ```
   **be/src/olap/base_tablet.cpp:1179:** +2, including nesting penalty of 1, 
nesting level increased to 2
   ```cpp
           RETURN_IF_ERROR(self->get_all_rs_id_unlocked(cur_version - 1, 
&cur_rowset_ids));
           ^
   ```
   **be/src/common/status.h:543:** expanded from macro 'RETURN_IF_ERROR'
   ```cpp
           if (UNLIKELY(!_status_.ok())) { \
           ^
   ```
   **be/src/olap/base_tablet.cpp:1198:** +1, including nesting penalty of 0, 
nesting level increased to 1
   ```cpp
       if (segments.size() <= 1) {
       ^
   ```
   **be/src/olap/base_tablet.cpp:1199:** +2, including nesting penalty of 1, 
nesting level increased to 2
   ```cpp
           RETURN_IF_ERROR(calc_delete_bitmap(self, rowset, segments, 
specified_rowsets, delete_bitmap,
           ^
   ```
   **be/src/common/status.h:541:** expanded from macro 'RETURN_IF_ERROR'
   ```cpp
       do {                                \
       ^
   ```
   **be/src/olap/base_tablet.cpp:1199:** +3, including nesting penalty of 2, 
nesting level increased to 3
   ```cpp
           RETURN_IF_ERROR(calc_delete_bitmap(self, rowset, segments, 
specified_rowsets, delete_bitmap,
           ^
   ```
   **be/src/common/status.h:543:** expanded from macro 'RETURN_IF_ERROR'
   ```cpp
           if (UNLIKELY(!_status_.ok())) { \
           ^
   ```
   **be/src/olap/base_tablet.cpp:1202:** +1, nesting level increased to 1
   ```cpp
       } else {
         ^
   ```
   **be/src/olap/base_tablet.cpp:1204:** +2, including nesting penalty of 1, 
nesting level increased to 2
   ```cpp
           RETURN_IF_ERROR(calc_delete_bitmap(self, rowset, segments, 
specified_rowsets, delete_bitmap,
           ^
   ```
   **be/src/common/status.h:541:** expanded from macro 'RETURN_IF_ERROR'
   ```cpp
       do {                                \
       ^
   ```
   **be/src/olap/base_tablet.cpp:1204:** +3, including nesting penalty of 2, 
nesting level increased to 3
   ```cpp
           RETURN_IF_ERROR(calc_delete_bitmap(self, rowset, segments, 
specified_rowsets, delete_bitmap,
           ^
   ```
   **be/src/common/status.h:543:** expanded from macro 'RETURN_IF_ERROR'
   ```cpp
           if (UNLIKELY(!_status_.ok())) { \
           ^
   ```
   **be/src/olap/base_tablet.cpp:1206:** +2, including nesting penalty of 1, 
nesting level increased to 2
   ```cpp
           RETURN_IF_ERROR(token->wait());
           ^
   ```
   **be/src/common/status.h:541:** expanded from macro 'RETURN_IF_ERROR'
   ```cpp
       do {                                \
       ^
   ```
   **be/src/olap/base_tablet.cpp:1206:** +3, including nesting penalty of 2, 
nesting level increased to 3
   ```cpp
           RETURN_IF_ERROR(token->wait());
           ^
   ```
   **be/src/common/status.h:543:** expanded from macro 'RETURN_IF_ERROR'
   ```cpp
           if (UNLIKELY(!_status_.ok())) { \
           ^
   ```
   **be/src/olap/base_tablet.cpp:1210:** +1, including nesting penalty of 0, 
nesting level increased to 1
   ```cpp
       if (watch.get_elapse_time_us() < 1 * 1000 * 1000) {
       ^
   ```
   **be/src/olap/base_tablet.cpp:1212:** +1, nesting level increased to 1
   ```cpp
       } else {
         ^
   ```
   **be/src/olap/base_tablet.cpp:1220:** nesting level increased to 1
   ```cpp
               [](size_t sum, const segment_v2::SegmentSharedPtr& s) { return 
sum += s->num_rows(); });
               ^
   ```
   **be/src/olap/base_tablet.cpp:1227:** +1, including nesting penalty of 0, 
nesting level increased to 1
   ```cpp
       if (config::enable_merge_on_write_correctness_check && 
rowset->num_rows() != 0) {
       ^
   ```
   **be/src/olap/base_tablet.cpp:1227:** +1
   ```cpp
       if (config::enable_merge_on_write_correctness_check && 
rowset->num_rows() != 0) {
                                                           ^
   ```
   **be/src/olap/base_tablet.cpp:1232:** +2, including nesting penalty of 1, 
nesting level increased to 2
   ```cpp
           if (!st.ok()) {
           ^
   ```
   **be/src/olap/base_tablet.cpp:1238:** +1, including nesting penalty of 0, 
nesting level increased to 1
   ```cpp
       if (txn_info->partial_update_info && 
txn_info->partial_update_info->is_partial_update) {
       ^
   ```
   **be/src/olap/base_tablet.cpp:1238:** +1
   ```cpp
       if (txn_info->partial_update_info && 
txn_info->partial_update_info->is_partial_update) {
                                         ^
   ```
   **be/src/olap/base_tablet.cpp:1239:** +2, including nesting penalty of 1, 
nesting level increased to 2
   ```cpp
           
DBUG_EXECUTE_IF("Tablet.update_delete_bitmap.partial_update_write_rowset_fail", 
{
           ^
   ```
   **be/src/util/debug_points.h:34:** expanded from macro 'DBUG_EXECUTE_IF'
   ```cpp
       if (UNLIKELY(config::enable_debug_points)) {                             
 \
       ^
   ```
   **be/src/olap/base_tablet.cpp:1239:** +3, including nesting penalty of 2, 
nesting level increased to 3
   ```cpp
           
DBUG_EXECUTE_IF("Tablet.update_delete_bitmap.partial_update_write_rowset_fail", 
{
           ^
   ```
   **be/src/util/debug_points.h:36:** expanded from macro 'DBUG_EXECUTE_IF'
   ```cpp
           if (dp) {                                                            
 \
           ^
   ```
   **be/src/olap/base_tablet.cpp:1240:** +4, including nesting penalty of 3, 
nesting level increased to 4
   ```cpp
               if (rand() % 100 < (100 * dp->param("percent", 0.5))) {
               ^
   ```
   **be/src/olap/base_tablet.cpp:1248:** +2, including nesting penalty of 1, 
nesting level increased to 2
   ```cpp
           RETURN_IF_ERROR(rowset_writer->flush());
           ^
   ```
   **be/src/common/status.h:541:** expanded from macro 'RETURN_IF_ERROR'
   ```cpp
       do {                                \
       ^
   ```
   **be/src/olap/base_tablet.cpp:1248:** +3, including nesting penalty of 2, 
nesting level increased to 3
   ```cpp
           RETURN_IF_ERROR(rowset_writer->flush());
           ^
   ```
   **be/src/common/status.h:543:** expanded from macro 'RETURN_IF_ERROR'
   ```cpp
           if (UNLIKELY(!_status_.ok())) { \
           ^
   ```
   **be/src/olap/base_tablet.cpp:1250:** +2, including nesting penalty of 1, 
nesting level increased to 2
   ```cpp
           RETURN_IF_ERROR(rowset_writer->build(transient_rowset));
           ^
   ```
   **be/src/common/status.h:541:** expanded from macro 'RETURN_IF_ERROR'
   ```cpp
       do {                                \
       ^
   ```
   **be/src/olap/base_tablet.cpp:1250:** +3, including nesting penalty of 2, 
nesting level increased to 3
   ```cpp
           RETURN_IF_ERROR(rowset_writer->build(transient_rowset));
           ^
   ```
   **be/src/common/status.h:543:** expanded from macro 'RETURN_IF_ERROR'
   ```cpp
           if (UNLIKELY(!_status_.ok())) { \
           ^
   ```
   **be/src/olap/base_tablet.cpp:1257:** +1, including nesting penalty of 0, 
nesting level increased to 1
   ```cpp
       RETURN_IF_ERROR(self->save_delete_bitmap(txn_info, txn_id, 
delete_bitmap, rowset_writer.get(),
       ^
   ```
   **be/src/common/status.h:541:** expanded from macro 'RETURN_IF_ERROR'
   ```cpp
       do {                                \
       ^
   ```
   **be/src/olap/base_tablet.cpp:1257:** +2, including nesting penalty of 1, 
nesting level increased to 2
   ```cpp
       RETURN_IF_ERROR(self->save_delete_bitmap(txn_info, txn_id, 
delete_bitmap, rowset_writer.get(),
       ^
   ```
   **be/src/common/status.h:543:** expanded from macro 'RETURN_IF_ERROR'
   ```cpp
           if (UNLIKELY(!_status_.ok())) { \
           ^
   ```
   
   </details>
   



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to