Coverage Report

Created: 2025-10-10 19:27

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/root/doris/be/src/exec/rowid_fetcher.h
Line
Count
Source
1
// Licensed to the Apache Software Foundation (ASF) under one
2
// or more contributor license agreements.  See the NOTICE file
3
// distributed with this work for additional information
4
// regarding copyright ownership.  The ASF licenses this file
5
// to you under the Apache License, Version 2.0 (the
6
// "License"); you may not use this file except in compliance
7
// with the License.  You may obtain a copy of the License at
8
//
9
//   http://www.apache.org/licenses/LICENSE-2.0
10
//
11
// Unless required by applicable law or agreed to in writing,
12
// software distributed under the License is distributed on an
13
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14
// KIND, either express or implied.  See the License for the
15
// specific language governing permissions and limitations
16
// under the License.
17
18
#pragma once
19
20
#include <brpc/controller.h>
21
#include <bthread/countdown_event.h>
22
#include <gen_cpp/DataSinks_types.h>
23
#include <gen_cpp/internal_service.pb.h>
24
25
#include <memory>
26
#include <utility>
27
#include <vector>
28
29
#include "common/status.h"
30
#include "exec/tablet_info.h" // DorisNodesInfo
31
#include "olap/id_manager.h"
32
#include "vec/core/block.h"
33
#include "vec/data_types/data_type.h"
34
35
namespace doris {
36
37
class DorisNodesInfo;
38
class RuntimeState;
39
class TupleDescriptor;
40
41
struct FileMapping;
42
struct SegKey;
43
struct SegItem;
44
struct HashOfSegKey;
45
struct IteratorKey;
46
struct IteratorItem;
47
struct HashOfIteratorKey;
48
49
0
inline void fetch_callback(bthread::CountdownEvent* counter) {
50
0
    Defer __defer([&] { counter->signal(); });
51
0
}
52
53
namespace vectorized {
54
template <typename T>
55
class ColumnStr;
56
using ColumnString = ColumnStr<UInt32>;
57
class MutableBlock;
58
} // namespace vectorized
59
60
// fetch rows by global rowid
61
// tablet_id/rowset_name/segment_id/ordinal_id
62
63
struct FetchOption {
64
    TupleDescriptor* desc = nullptr;
65
    RuntimeState* runtime_state = nullptr;
66
    TFetchOption t_fetch_opt;
67
};
68
69
class RowIDFetcher {
70
public:
71
0
    RowIDFetcher(FetchOption fetch_opt) : _fetch_option(std::move(fetch_opt)) {}
72
    Status init();
73
    Status fetch(const vectorized::ColumnPtr& row_ids, vectorized::Block* block);
74
75
private:
76
    PMultiGetRequest _init_fetch_request(const vectorized::ColumnString& row_ids) const;
77
    Status _merge_rpc_results(const PMultiGetRequest& request,
78
                              const std::vector<PMultiGetResponse>& rsps,
79
                              const std::vector<brpc::Controller>& cntls,
80
                              vectorized::Block* output_block,
81
                              std::vector<PRowLocation>* rows_id) const;
82
83
    std::vector<std::shared_ptr<PBackendService_Stub>> _stubs;
84
    FetchOption _fetch_option;
85
};
86
87
struct RowStoreReadStruct {
88
0
    RowStoreReadStruct(std::string& buffer) : row_store_buffer(buffer) {};
89
    std::string& row_store_buffer;
90
    vectorized::DataTypeSerDeSPtrs serdes;
91
    std::unordered_map<uint32_t, uint32_t> col_uid_to_idx;
92
    std::vector<std::string> default_values;
93
};
94
95
class RowIdStorageReader {
96
public:
97
    //external profile info key.
98
    static const std::string ScannersRunningTimeProfile;
99
    static const std::string InitReaderAvgTimeProfile;
100
    static const std::string GetBlockAvgTimeProfile;
101
    static const std::string FileReadLinesProfile;
102
103
    static Status read_by_rowids(const PMultiGetRequest& request, PMultiGetResponse* response);
104
    static Status read_by_rowids(const PMultiGetRequestV2& request, PMultiGetResponseV2* response);
105
106
private:
107
    static Status read_doris_format_row(
108
            const std::shared_ptr<IdFileMap>& id_file_map,
109
            const std::shared_ptr<FileMapping>& file_mapping, const std::vector<uint32_t>& row_id,
110
            std::vector<SlotDescriptor>& slots, const TabletSchema& full_read_schema,
111
            RowStoreReadStruct& row_store_read_struct, OlapReaderStatistics& stats,
112
            int64_t* acquire_tablet_ms, int64_t* acquire_rowsets_ms, int64_t* acquire_segments_ms,
113
            int64_t* lookup_row_data_ms, std::unordered_map<SegKey, SegItem, HashOfSegKey>& seg_map,
114
            std::unordered_map<IteratorKey, IteratorItem, HashOfIteratorKey>& iterator_map,
115
            vectorized::Block& result_block);
116
117
    static Status read_batch_doris_format_row(
118
            const PRequestBlockDesc& request_block_desc, std::shared_ptr<IdFileMap> id_file_map,
119
            std::vector<SlotDescriptor>& slots, const TUniqueId& query_id,
120
            vectorized::Block& result_block, OlapReaderStatistics& stats,
121
            int64_t* acquire_tablet_ms, int64_t* acquire_rowsets_ms, int64_t* acquire_segments_ms,
122
            int64_t* lookup_row_data_ms);
123
124
    static Status read_batch_external_row(
125
            const uint64_t workload_group_id, const PRequestBlockDesc& request_block_desc,
126
            std::shared_ptr<IdFileMap> id_file_map, std::vector<SlotDescriptor>& slots,
127
            std::shared_ptr<FileMapping> first_file_mapping, const TUniqueId& query_id,
128
            vectorized::Block& result_block, PRuntimeProfileTree* pprofile,
129
            int64_t* init_reader_avg_ms, int64_t* get_block_avg_ms, size_t* scan_range_cnt);
130
131
    struct ExternalFetchStatistics {
132
        int64_t init_reader_ms = 0;
133
        int64_t get_block_ms = 0;
134
        std::string file_read_bytes;
135
        std::string file_read_times;
136
    };
137
};
138
139
template <typename Func>
140
48
auto scope_timer_run(Func fn, int64_t* cost) -> decltype(fn()) {
141
48
    MonotonicStopWatch watch;
142
48
    watch.start();
143
48
    auto res = fn();
144
48
    *cost += watch.elapsed_time() / 1000 / 1000;
145
48
    return res;
146
48
}
Unexecuted instantiation: rowid_fetcher.cpp:_ZN5doris15scope_timer_runIZNS_18RowIdStorageReader14read_by_rowidsERKNS_16PMultiGetRequestEPNS_17PMultiGetResponseEE3$_1EEDTclfp_EET_Pl
Unexecuted instantiation: rowid_fetcher.cpp:_ZN5doris15scope_timer_runIZNS_18RowIdStorageReader14read_by_rowidsERKNS_16PMultiGetRequestEPNS_17PMultiGetResponseEE3$_2EEDTclfp_EET_Pl
Unexecuted instantiation: rowid_fetcher.cpp:_ZN5doris15scope_timer_runIZNS_18RowIdStorageReader14read_by_rowidsERKNS_16PMultiGetRequestEPNS_17PMultiGetResponseEE3$_4EEDTclfp_EET_Pl
Unexecuted instantiation: rowid_fetcher.cpp:_ZN5doris15scope_timer_runIZNS_18RowIdStorageReader14read_by_rowidsERKNS_16PMultiGetRequestEPNS_17PMultiGetResponseEE3$_5EEDTclfp_EET_Pl
Unexecuted instantiation: rowid_fetcher.cpp:_ZN5doris15scope_timer_runIZNS_18RowIdStorageReader23read_batch_external_rowEmRKNS_17PRequestBlockDescESt10shared_ptrINS_9IdFileMapEERSt6vectorINS_14SlotDescriptorESaIS9_EES5_INS_11FileMappingEERKNS_9TUniqueIdERNS_10vectorized5BlockEPNS_19PRuntimeProfileTreeEPlSN_PmE3$_0EEDTclfp_EET_SN_
Unexecuted instantiation: rowid_fetcher.cpp:_ZN5doris15scope_timer_runIZNS_18RowIdStorageReader21read_doris_format_rowERKSt10shared_ptrINS_9IdFileMapEERKS2_INS_11FileMappingEERKSt6vectorIjSaIjEERSB_INS_14SlotDescriptorESaISG_EERKNS_12TabletSchemaERNS_18RowStoreReadStructERNS_20OlapReaderStatisticsEPlSR_SR_SR_RSt13unordered_mapINS_6SegKeyENS_7SegItemENS_12HashOfSegKeyESt8equal_toIST_ESaISt4pairIKST_SU_EEERSS_INS_11IteratorKeyENS_12IteratorItemENS_17HashOfIteratorKeyESW_IS14_ESaISY_IKS14_S15_EEERNS_10vectorized5BlockEE3$_1EEDTclfp_EET_SR_
Unexecuted instantiation: rowid_fetcher.cpp:_ZN5doris15scope_timer_runIZNS_18RowIdStorageReader21read_doris_format_rowERKSt10shared_ptrINS_9IdFileMapEERKS2_INS_11FileMappingEERKSt6vectorIjSaIjEERSB_INS_14SlotDescriptorESaISG_EERKNS_12TabletSchemaERNS_18RowStoreReadStructERNS_20OlapReaderStatisticsEPlSR_SR_SR_RSt13unordered_mapINS_6SegKeyENS_7SegItemENS_12HashOfSegKeyESt8equal_toIST_ESaISt4pairIKST_SU_EEERSS_INS_11IteratorKeyENS_12IteratorItemENS_17HashOfIteratorKeyESW_IS14_ESaISY_IKS14_S15_EEERNS_10vectorized5BlockEE3$_2EEDTclfp_EET_SR_
Unexecuted instantiation: rowid_fetcher.cpp:_ZN5doris15scope_timer_runIZNS_18RowIdStorageReader21read_doris_format_rowERKSt10shared_ptrINS_9IdFileMapEERKS2_INS_11FileMappingEERKSt6vectorIjSaIjEERSB_INS_14SlotDescriptorESaISG_EERKNS_12TabletSchemaERNS_18RowStoreReadStructERNS_20OlapReaderStatisticsEPlSR_SR_SR_RSt13unordered_mapINS_6SegKeyENS_7SegItemENS_12HashOfSegKeyESt8equal_toIST_ESaISt4pairIKST_SU_EEERSS_INS_11IteratorKeyENS_12IteratorItemENS_17HashOfIteratorKeyESW_IS14_ESaISY_IKS14_S15_EEERNS_10vectorized5BlockEE3$_3EEDTclfp_EET_SR_
Unexecuted instantiation: rowid_fetcher.cpp:_ZN5doris15scope_timer_runIZNS_18RowIdStorageReader21read_doris_format_rowERKSt10shared_ptrINS_9IdFileMapEERKS2_INS_11FileMappingEERKSt6vectorIjSaIjEERSB_INS_14SlotDescriptorESaISG_EERKNS_12TabletSchemaERNS_18RowStoreReadStructERNS_20OlapReaderStatisticsEPlSR_SR_SR_RSt13unordered_mapINS_6SegKeyENS_7SegItemENS_12HashOfSegKeyESt8equal_toIST_ESaISt4pairIKST_SU_EEERSS_INS_11IteratorKeyENS_12IteratorItemENS_17HashOfIteratorKeyESW_IS14_ESaISY_IKS14_S15_EEERNS_10vectorized5BlockEE3$_4EEDTclfp_EET_SR_
file_scanner.cpp:_ZN5doris15scope_timer_runIZNS_10vectorized11FileScanner21read_lines_from_rangeERKNS_14TFileRangeDescERKNSt7__cxx114listIlSaIlEEEPNS1_5BlockERKNS_23ExternalFileMappingInfoEPlSH_E3$_0EEDTclfp_EET_SH_
Line
Count
Source
140
24
auto scope_timer_run(Func fn, int64_t* cost) -> decltype(fn()) {
141
24
    MonotonicStopWatch watch;
142
24
    watch.start();
143
24
    auto res = fn();
144
24
    *cost += watch.elapsed_time() / 1000 / 1000;
145
24
    return res;
146
24
}
file_scanner.cpp:_ZN5doris15scope_timer_runIZNS_10vectorized11FileScanner21read_lines_from_rangeERKNS_14TFileRangeDescERKNSt7__cxx114listIlSaIlEEEPNS1_5BlockERKNS_23ExternalFileMappingInfoEPlSH_E3$_1EEDTclfp_EET_SH_
Line
Count
Source
140
24
auto scope_timer_run(Func fn, int64_t* cost) -> decltype(fn()) {
141
24
    MonotonicStopWatch watch;
142
24
    watch.start();
143
24
    auto res = fn();
144
24
    *cost += watch.elapsed_time() / 1000 / 1000;
145
24
    return res;
146
24
}
147
} // namespace doris