yiguolei commented on code in PR #51271:
URL: https://github.com/apache/doris/pull/51271#discussion_r2108317650


##########
be/src/olap/rowset/beta_rowset.cpp:
##########
@@ -70,23 +74,73 @@ Status BetaRowset::init() {
 }
 
 Status BetaRowset::get_segment_num_rows(std::vector<uint32_t>* segment_rows) {
-    DCHECK(_rowset_state_machine.rowset_state() == ROWSET_LOADED);
+    RETURN_IF_ERROR(load_segments_info());
+    segment_rows->assign(_segments_rows.cbegin(), _segments_rows.cend());
+    return Status::OK();
+}
 
-    RETURN_IF_ERROR(_load_segment_rows_once.call([this] {
+Status BetaRowset::load_segments_info() {
+    DCHECK_NE(_rowset_state_machine.rowset_state(), ROWSET_UNLOADED);
+
+    return _load_segments_info_once.call([this] {
         auto segment_count = num_segments();
         _segments_rows.resize(segment_count);
+
+        bool has_invalid_segment = false;
+        size_t columns_has_zone_map_count = 0;
+        DorisMap<uint32_t, std::vector<ZoneMapPB>> columns_zone_maps;
+        std::map<uint32_t, std::pair<FieldType, int32_t>> 
columns_type_and_length;
+
         for (int64_t i = 0; i != segment_count; ++i) {
             SegmentCacheHandle segment_cache_handle;
             RETURN_IF_ERROR(SegmentLoader::instance()->load_segment(
                     std::static_pointer_cast<BetaRowset>(shared_from_this()), 
i,
                     &segment_cache_handle, false, false));
-            const auto& tmp_segments = segment_cache_handle.get_segments();
-            _segments_rows[i] = tmp_segments[0]->num_rows();
+            const auto& segment = segment_cache_handle.get_segments()[0];
+            _segments_rows[i] = segment->num_rows();
+
+            if (!config::enable_rowset_zone_map_cache) {
+                continue;
+            }
+
+            auto zone_maps = segment->get_zone_maps();
+            if (zone_maps.empty()) {
+                if (_segments_rows[i] != 0) {
+                    has_invalid_segment = true;
+                }
+                continue;
+            }
+
+            if (has_invalid_segment) {
+                continue;
+            }
+
+            if (columns_has_zone_map_count == 0) {
+                columns_has_zone_map_count = zone_maps.size();
+            } else if (columns_has_zone_map_count != zone_maps.size()) {
+                has_invalid_segment = true;
+                continue;
+            }
+
+            for (auto&& [uid, zone_map] : zone_maps) {
+                
columns_zone_maps[uid].emplace_back(std::move(zone_map.zone_map));
+                columns_type_and_length[uid].first = zone_map.field_type;
+                columns_type_and_length[uid].second = zone_map.field_length;
+            }
+        }
+
+        if (has_invalid_segment) {
+            LOG(INFO) << "has invalid segment, rowset_id=" << rowset_id();

Review Comment:
   日志需要写完整了,否则,这个日志就只是给写这个代码的人看的。
   比如我们写成: Has invalid segment, rowset_id=" << rowset_id() << ", skip build 
rowset level zonemap".
   同时,我们最好记录下,invalid segment的reason,也一起输出,否则到线上如果有问题,很难知道什么原因。



-- 
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