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


##########
be/src/olap/tablet.cpp:
##########
@@ -3833,4 +3844,194 @@ Status 
Tablet::check_delete_bitmap_correctness(DeleteBitmapPtr delete_bitmap, in
     }
     return Status::OK();
 }
+
+Status Tablet::check_primary_keys_consistency(
+        const PartialUpdateReadPlan* read_plan,

Review Comment:
   warning: method 'check_primary_keys_consistency' can be made static 
[readability-convert-member-functions-to-static]
   
   be/src/olap/tablet.cpp:3847:
   ```diff
   -   }
   +   }static 
   ```
   



##########
be/src/olap/tablet.cpp:
##########
@@ -3833,4 +3844,194 @@ Status 
Tablet::check_delete_bitmap_correctness(DeleteBitmapPtr delete_bitmap, in
     }
     return Status::OK();
 }
+
+Status Tablet::check_primary_keys_consistency(
+        const PartialUpdateReadPlan* read_plan,
+        const std::map<RowsetId, RowsetSharedPtr>* rsid_to_rowset,
+        std::unordered_map<uint32_t, std::string>* pk_entries, bool 
with_seq_col) {
+    size_t count = 0;
+    for (auto& [rowset_id, segment_read_info] : *read_plan) {
+        for (auto& [segment_id, rows_info] : segment_read_info) {
+            auto rowset_iter = rsid_to_rowset->find(rowset_id);
+            CHECK(rowset_iter != rsid_to_rowset->end());
+            BetaRowsetSharedPtr rowset = 
std::static_pointer_cast<BetaRowset>(rowset_iter->second);
+            CHECK(rowset);
+            const TabletSchemaSPtr tablet_schema = rowset->tablet_schema();
+            SegmentCacheHandle segment_cache;
+            RETURN_IF_ERROR(SegmentLoader::instance()->load_segments(rowset, 
&segment_cache, true));
+            auto it = std::find_if(segment_cache.get_segments().cbegin(),
+                                   segment_cache.get_segments().cend(),
+                                   [segment_id](const 
segment_v2::SegmentSharedPtr& seg) {
+                                       return seg->id() == segment_id;
+                                   });
+            if (it == segment_cache.get_segments().end()) {
+                return Status::NotFound(fmt::format("rowset {} 's segemnt not 
found, seg_id {}",
+                                                    
rowset->rowset_id().to_string(), segment_id));
+            }
+
+            segment_v2::SegmentSharedPtr segment = *it;
+            LOG(INFO) << fmt::format(
+                    
"[Tablet::check_primary_keys_consistency][rowset_id:{}][segment_id:{}]",
+                    segment->rowset_id().to_string(), segment->id());
+            RETURN_IF_ERROR(segment->load_index());
+            auto pk_index = segment->get_primary_key_index();
+            std::unique_ptr<segment_v2::IndexedColumnIterator> iter;
+            RETURN_IF_ERROR(pk_index->new_iterator(&iter));
+            auto index_type = 
vectorized::DataTypeFactory::instance().create_data_type(
+                    pk_index->type_info()->type(), 1, 0);
+            auto index_column = index_type->create_column();
+
+            size_t idx = 0;
+            for (auto [rowid, pos] : rows_info) {
+                RETURN_IF_ERROR(iter->seek_to_ordinal(rowid));
+                size_t num_read = 1;
+                RETURN_IF_ERROR(iter->next_batch(&num_read, index_column));
+                CHECK(num_read == 1);
+                std::string prev_pk_entry = 
index_column->get_data_at(idx++).to_string();
+                std::string cur_pk_entry = pk_entries->at(pos);
+                Slice key1 = Slice(prev_pk_entry.data(), prev_pk_entry.size());
+                Slice key2 = Slice(cur_pk_entry.data(), cur_pk_entry.size());
+                int result = 0;
+                // always ignore the seq col
+                if (tablet_schema->has_sequence_col()) {
+                    auto seq_col_length =
+                            
tablet_schema->column(tablet_schema->sequence_col_idx()).length() + 1;
+                    key1 = Slice(prev_pk_entry.data(), prev_pk_entry.size() - 
seq_col_length);
+                    if (with_seq_col) {
+                        key2 = Slice(cur_pk_entry.data(), cur_pk_entry.size() 
- seq_col_length);
+                    }
+                }
+                result = key1.compare(key2);
+                if (result != 0) {
+                    LOG(WARNING) << fmt::format(
+                            "check primary keys consistency failed, pk at pos 
{} in current "
+                            "block is {}, but in previous conflict segment is 
{}!",
+                            pos, key2.to_string(), key1.to_string());
+                    return Status::InternalError("check primary keys 
consistency failed");
+                }
+            }
+            count += rows_info.size();
+        }
+    }
+    if (count != pk_entries->size()) {
+        return Status::InternalError(
+                "check primary keys consistency failed, pk_entries.size():{}, 
but number of keys "
+                "in read plan is {}",
+                pk_entries->size(), count);
+    }
+    return Status::OK();
+}
+
+Status Tablet::check_primary_keys_consistency(
+        const PartialUpdateReadPlan* read_plan,

Review Comment:
   warning: method 'check_primary_keys_consistency' can be made static 
[readability-convert-member-functions-to-static]
   
   be/src/olap/tablet.cpp:3924:
   ```diff
   -   }
   +   }static 
   ```
   



-- 
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: commits-unsubscr...@doris.apache.org

For queries about this service, please contact Infrastructure at:
us...@infra.apache.org


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

Reply via email to