Coverage Report

Created: 2026-07-06 01:39

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
be/src/exec/scan/meta_scanner.cpp
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
#include "exec/scan/meta_scanner.h"
19
20
#include <fmt/format.h>
21
#include <gen_cpp/FrontendService.h>
22
#include <gen_cpp/FrontendService_types.h>
23
#include <gen_cpp/HeartbeatService_types.h>
24
#include <gen_cpp/PaloInternalService_types.h>
25
#include <gen_cpp/PlanNodes_types.h>
26
27
#include <ostream>
28
#include <string>
29
#include <unordered_map>
30
31
#include "common/cast_set.h"
32
#include "common/logging.h"
33
#include "core/block/block.h"
34
#include "core/column/column.h"
35
#include "core/column/column_nullable.h"
36
#include "core/column/column_string.h"
37
#include "core/column/column_vector.h"
38
#include "core/data_type/define_primitive_type.h"
39
#include "core/types.h"
40
#include "format/table/parquet_metadata_reader.h"
41
#include "runtime/descriptors.h"
42
#include "runtime/exec_env.h"
43
#include "runtime/runtime_state.h"
44
#include "util/client_cache.h"
45
#include "util/thrift_rpc_helper.h"
46
47
namespace doris {
48
class RuntimeProfile;
49
class VExprContext;
50
} // namespace doris
51
52
namespace doris {
53
54
MetaScanner::MetaScanner(RuntimeState* state, ScanLocalStateBase* local_state, TupleId tuple_id,
55
                         const TScanRangeParams& scan_range, int64_t limit, RuntimeProfile* profile,
56
                         TUserIdentity user_identity)
57
5.63k
        : Scanner(state, local_state, limit, profile),
58
5.63k
          _meta_eos(false),
59
5.63k
          _tuple_id(tuple_id),
60
5.63k
          _user_identity(user_identity),
61
5.63k
          _scan_range(scan_range.scan_range) {}
62
63
5.63k
Status MetaScanner::_open_impl(RuntimeState* state) {
64
5.63k
    VLOG_CRITICAL << "MetaScanner::open";
65
5.63k
    RETURN_IF_ERROR(Scanner::_open_impl(state));
66
5.63k
    if (_scan_range.meta_scan_range.metadata_type == TMetadataType::PARQUET) {
67
41
        auto reader = ParquetMetadataReader::create_unique(_tuple_desc->slots(), state, _profile,
68
41
                                                           _scan_range.meta_scan_range);
69
41
        RETURN_IF_ERROR(reader->init_reader());
70
41
        _reader = std::move(reader);
71
5.59k
    } else {
72
5.59k
        RETURN_IF_ERROR(_fetch_metadata(_scan_range.meta_scan_range));
73
5.59k
    }
74
5.63k
    return Status::OK();
75
5.63k
}
76
77
5.63k
Status MetaScanner::init(RuntimeState* state, const VExprContextSPtrs& conjuncts) {
78
5.63k
    VLOG_CRITICAL << "MetaScanner::init";
79
5.63k
    RETURN_IF_ERROR(Scanner::init(_state, conjuncts));
80
5.63k
    _tuple_desc = state->desc_tbl().get_tuple_descriptor(_tuple_id);
81
5.63k
    return Status::OK();
82
5.63k
}
83
84
10.4k
Status MetaScanner::_get_block_impl(RuntimeState* state, Block* block, bool* eof) {
85
10.4k
    VLOG_CRITICAL << "MetaScanner::_get_block_impl";
86
10.4k
    if (nullptr == state || nullptr == block || nullptr == eof) {
87
0
        return Status::InternalError("input is NULL pointer");
88
0
    }
89
90
    // Build name to index map only once on first call
91
10.4k
    if (_src_block_name_to_idx.empty()) {
92
5.63k
        _src_block_name_to_idx = block->get_name_to_pos_map();
93
5.63k
    }
94
95
10.4k
    if (_reader) {
96
        // TODO: This is a temporary workaround; the code is planned to be refactored later.
97
79
        size_t read_rows = 0;
98
79
        return _reader->get_next_block(block, &read_rows, eof);
99
79
    }
100
101
10.3k
    if (_meta_eos == true) {
102
4.74k
        *eof = true;
103
4.74k
        return Status::OK();
104
4.74k
    }
105
106
5.59k
    auto column_size = _tuple_desc->slots().size();
107
5.59k
    std::vector<MutableColumnPtr> columns(column_size);
108
5.59k
    bool mem_reuse = block->mem_reuse();
109
5.59k
    do {
110
5.59k
        RETURN_IF_CANCELLED(state);
111
112
5.59k
        columns.resize(column_size);
113
35.4k
        for (auto i = 0; i < column_size; i++) {
114
29.8k
            if (mem_reuse) {
115
29.8k
                columns[i] = IColumn::mutate(std::move(block->get_by_position(i).column));
116
29.8k
            } else {
117
0
                columns[i] = _tuple_desc->slots()[i]->get_empty_mutable_column();
118
0
            }
119
29.8k
        }
120
        // fill block
121
5.59k
        RETURN_IF_ERROR(_fill_block_with_remote_data(columns));
122
5.59k
        const bool empty_result = columns.empty() || columns.front()->empty();
123
5.59k
        if (!mem_reuse) {
124
0
            int column_index = 0;
125
0
            for (const auto slot_desc : _tuple_desc->slots()) {
126
0
                block->insert(ColumnWithTypeAndName(std::move(columns[column_index++]),
127
0
                                                    slot_desc->get_data_type_ptr(),
128
0
                                                    slot_desc->col_name()));
129
0
            }
130
5.59k
        } else {
131
5.59k
            block->set_columns(std::move(columns));
132
5.59k
        }
133
5.59k
        if (_meta_eos == true) {
134
5.59k
            if (empty_result) {
135
846
                *eof = true;
136
846
            }
137
5.59k
            break;
138
5.59k
        }
139
0
        VLOG_ROW << "VMetaScanNode output rows: " << block->rows();
140
0
    } while (block->rows() == 0 && !(*eof));
141
5.59k
    return Status::OK();
142
5.59k
}
143
144
5.59k
Status MetaScanner::_fill_block_with_remote_data(const std::vector<MutableColumnPtr>& columns) {
145
5.59k
    VLOG_CRITICAL << "MetaScanner::_fill_block_with_remote_data";
146
35.3k
    for (int col_idx = 0; col_idx < columns.size(); col_idx++) {
147
29.8k
        auto slot_desc = _tuple_desc->slots()[col_idx];
148
149
3.18M
        for (int _row_idx = 0; _row_idx < _batch_data.size(); _row_idx++) {
150
3.15M
            IColumn* col_ptr = columns[col_idx].get();
151
3.15M
            TCell& cell = _batch_data[_row_idx].column_value[col_idx];
152
3.15M
            if (cell.__isset.isNull && cell.isNull) {
153
41
                DCHECK(slot_desc->is_nullable())
154
0
                        << "cell is null but column is not nullable: " << slot_desc->col_name();
155
41
                auto& null_col = reinterpret_cast<ColumnNullable&>(*col_ptr);
156
41
                null_col.get_nested_column().insert_default();
157
41
                null_col.get_null_map_data().push_back(1);
158
3.15M
            } else {
159
3.15M
                if (slot_desc->is_nullable()) {
160
115
                    auto& null_col = reinterpret_cast<ColumnNullable&>(*col_ptr);
161
115
                    null_col.get_null_map_data().push_back(0);
162
115
                    col_ptr = null_col.get_nested_column_ptr().get();
163
115
                }
164
3.15M
                switch (slot_desc->type()->get_primitive_type()) {
165
5.34k
                case TYPE_BOOLEAN: {
166
5.34k
                    bool data = cell.boolVal;
167
5.34k
                    assert_cast<ColumnBool*>(col_ptr)->insert_value((uint8_t)data);
168
5.34k
                    break;
169
0
                }
170
2
                case TYPE_TINYINT: {
171
2
                    int8_t data = (int8_t)cell.intVal;
172
2
                    assert_cast<ColumnInt8*>(col_ptr)->insert_value(data);
173
2
                    break;
174
0
                }
175
2
                case TYPE_SMALLINT: {
176
2
                    int16_t data = (int16_t)cell.intVal;
177
2
                    assert_cast<ColumnInt16*>(col_ptr)->insert_value(data);
178
2
                    break;
179
0
                }
180
101
                case TYPE_INT: {
181
101
                    int32_t data = cell.intVal;
182
101
                    assert_cast<ColumnInt32*>(col_ptr)->insert_value(data);
183
101
                    break;
184
0
                }
185
3.52k
                case TYPE_BIGINT: {
186
3.52k
                    int64_t data = cell.longVal;
187
3.52k
                    assert_cast<ColumnInt64*>(col_ptr)->insert_value(data);
188
3.52k
                    break;
189
0
                }
190
39
                case TYPE_FLOAT: {
191
39
                    auto data = static_cast<float>(cell.doubleVal);
192
39
                    assert_cast<ColumnFloat32*>(col_ptr)->insert_value(data);
193
39
                    break;
194
0
                }
195
15
                case TYPE_DOUBLE: {
196
15
                    double data = cell.doubleVal;
197
15
                    assert_cast<ColumnFloat64*>(col_ptr)->insert_value(data);
198
15
                    break;
199
0
                }
200
2
                case TYPE_DATEV2: {
201
2
                    uint32_t data = (uint32_t)cell.longVal;
202
2
                    assert_cast<ColumnDateV2*>(col_ptr)->insert_value(data);
203
2
                    break;
204
0
                }
205
2
                case TYPE_DATETIMEV2: {
206
2
                    uint64_t data = cell.longVal;
207
2
                    assert_cast<ColumnDateTimeV2*>(col_ptr)->insert_value(data);
208
2
                    break;
209
0
                }
210
3.14M
                case TYPE_STRING:
211
3.14M
                case TYPE_CHAR:
212
3.14M
                case TYPE_VARCHAR: {
213
3.14M
                    std::string data = cell.stringVal;
214
3.14M
                    assert_cast<ColumnString*>(col_ptr)->insert_data(data.c_str(), data.length());
215
3.14M
                    break;
216
3.14M
                }
217
0
                default: {
218
0
                    std::string error_msg =
219
0
                            fmt::format("Invalid column type {} on column: {}.",
220
0
                                        slot_desc->type()->get_name(), slot_desc->col_name());
221
0
                    return Status::InternalError(std::string(error_msg));
222
3.14M
                }
223
3.15M
                }
224
3.15M
            }
225
3.15M
        }
226
29.8k
    }
227
5.49k
    _meta_eos = true;
228
5.49k
    return Status::OK();
229
5.59k
}
230
231
5.59k
Status MetaScanner::_fetch_metadata(const TMetaScanRange& meta_scan_range) {
232
5.59k
    VLOG_CRITICAL << "MetaScanner::_fetch_metadata";
233
5.59k
    TFetchSchemaTableDataRequest request;
234
5.59k
    switch (meta_scan_range.metadata_type) {
235
0
    case TMetadataType::HUDI:
236
0
        RETURN_IF_ERROR(_build_hudi_metadata_request(meta_scan_range, &request));
237
0
        break;
238
15
    case TMetadataType::BACKENDS:
239
15
        RETURN_IF_ERROR(_build_backends_metadata_request(meta_scan_range, &request));
240
15
        break;
241
37
    case TMetadataType::FRONTENDS:
242
37
        RETURN_IF_ERROR(_build_frontends_metadata_request(meta_scan_range, &request));
243
37
        break;
244
37
    case TMetadataType::FRONTENDS_DISKS:
245
7
        RETURN_IF_ERROR(_build_frontends_disks_metadata_request(meta_scan_range, &request));
246
7
        break;
247
7
    case TMetadataType::WORKLOAD_SCHED_POLICY:
248
0
        RETURN_IF_ERROR(_build_workload_sched_policy_metadata_request(meta_scan_range, &request));
249
0
        break;
250
25
    case TMetadataType::CATALOGS:
251
25
        RETURN_IF_ERROR(_build_catalogs_metadata_request(meta_scan_range, &request));
252
25
        break;
253
2.22k
    case TMetadataType::MATERIALIZED_VIEWS:
254
2.22k
        RETURN_IF_ERROR(_build_materialized_views_metadata_request(meta_scan_range, &request));
255
2.22k
        break;
256
2.22k
    case TMetadataType::PARTITIONS:
257
22
        RETURN_IF_ERROR(_build_partitions_metadata_request(meta_scan_range, &request));
258
22
        break;
259
947
    case TMetadataType::JOBS:
260
947
        RETURN_IF_ERROR(_build_jobs_metadata_request(meta_scan_range, &request));
261
947
        break;
262
2.29k
    case TMetadataType::TASKS:
263
2.29k
        RETURN_IF_ERROR(_build_tasks_metadata_request(meta_scan_range, &request));
264
2.29k
        break;
265
2.29k
    case TMetadataType::PARTITION_VALUES:
266
20
        RETURN_IF_ERROR(_build_partition_values_metadata_request(meta_scan_range, &request));
267
20
        break;
268
20
    case TMetadataType::BROKERS:
269
0
        RETURN_IF_ERROR(_build_brokers_metadata_request(meta_scan_range, &request));
270
0
        break;
271
0
    default:
272
0
        _meta_eos = true;
273
0
        return Status::OK();
274
5.59k
    }
275
276
    // set filter columns
277
5.59k
    std::vector<std::string> filter_columns;
278
29.8k
    for (const auto& slot : _tuple_desc->slots()) {
279
29.8k
        filter_columns.emplace_back(slot->col_name_lower_case());
280
29.8k
    }
281
5.59k
    request.metada_table_params.__set_columns_name(filter_columns);
282
283
    // _state->execution_timeout() is seconds, change to milliseconds
284
5.59k
    int time_out = _state->execution_timeout() * 1000;
285
5.59k
    TNetworkAddress master_addr = ExecEnv::GetInstance()->cluster_info()->master_fe_addr;
286
5.59k
    TFetchSchemaTableDataResult result;
287
5.59k
    RETURN_IF_ERROR(ThriftRpcHelper::rpc<FrontendServiceClient>(
288
5.59k
            master_addr.hostname, master_addr.port,
289
5.59k
            [&request, &result](FrontendServiceConnection& client) {
290
5.59k
                client->fetchSchemaTableData(result, request);
291
5.59k
            },
292
5.59k
            time_out));
293
294
5.59k
    Status status(Status::create(result.status));
295
5.59k
    if (!status.ok()) {
296
0
        LOG(WARNING) << "fetch schema table data from master failed, errmsg=" << status;
297
0
        return status;
298
0
    }
299
5.59k
    _batch_data = std::move(result.data_batch);
300
5.59k
    return Status::OK();
301
5.59k
}
302
303
Status MetaScanner::_build_hudi_metadata_request(const TMetaScanRange& meta_scan_range,
304
0
                                                 TFetchSchemaTableDataRequest* request) {
305
0
    VLOG_CRITICAL << "MetaScanner::_build_hudi_metadata_request";
306
0
    if (!meta_scan_range.__isset.hudi_params) {
307
0
        return Status::InternalError("Can not find THudiMetadataParams from meta_scan_range.");
308
0
    }
309
310
    // create request
311
0
    request->__set_cluster_name("");
312
0
    request->__set_schema_table_name(TSchemaTableName::METADATA_TABLE);
313
314
    // create TMetadataTableRequestParams
315
0
    TMetadataTableRequestParams metadata_table_params;
316
0
    metadata_table_params.__set_metadata_type(TMetadataType::HUDI);
317
0
    metadata_table_params.__set_hudi_metadata_params(meta_scan_range.hudi_params);
318
319
0
    request->__set_metada_table_params(metadata_table_params);
320
0
    return Status::OK();
321
0
}
322
323
Status MetaScanner::_build_backends_metadata_request(const TMetaScanRange& meta_scan_range,
324
15
                                                     TFetchSchemaTableDataRequest* request) {
325
15
    VLOG_CRITICAL << "MetaScanner::_build_backends_metadata_request";
326
15
    if (!meta_scan_range.__isset.backends_params) {
327
0
        return Status::InternalError("Can not find TBackendsMetadataParams from meta_scan_range.");
328
0
    }
329
    // create request
330
15
    request->__set_cluster_name("");
331
15
    request->__set_schema_table_name(TSchemaTableName::METADATA_TABLE);
332
333
    // create TMetadataTableRequestParams
334
15
    TMetadataTableRequestParams metadata_table_params;
335
15
    metadata_table_params.__set_metadata_type(TMetadataType::BACKENDS);
336
15
    metadata_table_params.__set_backends_metadata_params(meta_scan_range.backends_params);
337
338
15
    request->__set_metada_table_params(metadata_table_params);
339
15
    return Status::OK();
340
15
}
341
342
Status MetaScanner::_build_frontends_metadata_request(const TMetaScanRange& meta_scan_range,
343
37
                                                      TFetchSchemaTableDataRequest* request) {
344
37
    VLOG_CRITICAL << "MetaScanner::_build_frontends_metadata_request";
345
37
    if (!meta_scan_range.__isset.frontends_params) {
346
0
        return Status::InternalError("Can not find TFrontendsMetadataParams from meta_scan_range.");
347
0
    }
348
    // create request
349
37
    request->__set_cluster_name("");
350
37
    request->__set_schema_table_name(TSchemaTableName::METADATA_TABLE);
351
352
    // create TMetadataTableRequestParams
353
37
    TMetadataTableRequestParams metadata_table_params;
354
37
    metadata_table_params.__set_metadata_type(TMetadataType::FRONTENDS);
355
37
    metadata_table_params.__set_frontends_metadata_params(meta_scan_range.frontends_params);
356
357
37
    request->__set_metada_table_params(metadata_table_params);
358
37
    return Status::OK();
359
37
}
360
361
Status MetaScanner::_build_frontends_disks_metadata_request(const TMetaScanRange& meta_scan_range,
362
7
                                                            TFetchSchemaTableDataRequest* request) {
363
7
    VLOG_CRITICAL << "MetaScanner::_build_frontends_metadata_request";
364
7
    if (!meta_scan_range.__isset.frontends_params) {
365
0
        return Status::InternalError("Can not find TFrontendsMetadataParams from meta_scan_range.");
366
0
    }
367
    // create request
368
7
    request->__set_cluster_name("");
369
7
    request->__set_schema_table_name(TSchemaTableName::METADATA_TABLE);
370
371
    // create TMetadataTableRequestParams
372
7
    TMetadataTableRequestParams metadata_table_params;
373
7
    metadata_table_params.__set_metadata_type(TMetadataType::FRONTENDS_DISKS);
374
7
    metadata_table_params.__set_frontends_metadata_params(meta_scan_range.frontends_params);
375
376
7
    request->__set_metada_table_params(metadata_table_params);
377
7
    return Status::OK();
378
7
}
379
380
Status MetaScanner::_build_workload_sched_policy_metadata_request(
381
0
        const TMetaScanRange& meta_scan_range, TFetchSchemaTableDataRequest* request) {
382
0
    VLOG_CRITICAL << "MetaScanner::_build_workload_sched_policy_metadata_request";
383
384
    // create request
385
0
    request->__set_cluster_name("");
386
0
    request->__set_schema_table_name(TSchemaTableName::METADATA_TABLE);
387
388
    // create TMetadataTableRequestParams
389
0
    TMetadataTableRequestParams metadata_table_params;
390
0
    metadata_table_params.__set_metadata_type(TMetadataType::WORKLOAD_SCHED_POLICY);
391
0
    metadata_table_params.__set_current_user_ident(_user_identity);
392
393
0
    request->__set_metada_table_params(metadata_table_params);
394
0
    return Status::OK();
395
0
}
396
397
Status MetaScanner::_build_catalogs_metadata_request(const TMetaScanRange& meta_scan_range,
398
25
                                                     TFetchSchemaTableDataRequest* request) {
399
25
    VLOG_CRITICAL << "MetaScanner::_build_catalogs_metadata_request";
400
401
    // create request
402
25
    request->__set_schema_table_name(TSchemaTableName::METADATA_TABLE);
403
404
    // create TMetadataTableRequestParams
405
25
    TMetadataTableRequestParams metadata_table_params;
406
25
    metadata_table_params.__set_metadata_type(TMetadataType::CATALOGS);
407
25
    metadata_table_params.__set_current_user_ident(_user_identity);
408
409
25
    request->__set_metada_table_params(metadata_table_params);
410
25
    return Status::OK();
411
25
}
412
413
Status MetaScanner::_build_materialized_views_metadata_request(
414
2.22k
        const TMetaScanRange& meta_scan_range, TFetchSchemaTableDataRequest* request) {
415
2.22k
    VLOG_CRITICAL << "MetaScanner::_build_materialized_views_metadata_request";
416
2.22k
    if (!meta_scan_range.__isset.materialized_views_params) {
417
0
        return Status::InternalError(
418
0
                "Can not find TMaterializedViewsMetadataParams from meta_scan_range.");
419
0
    }
420
421
    // create request
422
2.22k
    request->__set_schema_table_name(TSchemaTableName::METADATA_TABLE);
423
424
    // create TMetadataTableRequestParams
425
2.22k
    TMetadataTableRequestParams metadata_table_params;
426
2.22k
    metadata_table_params.__set_metadata_type(TMetadataType::MATERIALIZED_VIEWS);
427
2.22k
    metadata_table_params.__set_materialized_views_metadata_params(
428
2.22k
            meta_scan_range.materialized_views_params);
429
430
2.22k
    request->__set_metada_table_params(metadata_table_params);
431
2.22k
    return Status::OK();
432
2.22k
}
433
434
Status MetaScanner::_build_partitions_metadata_request(const TMetaScanRange& meta_scan_range,
435
22
                                                       TFetchSchemaTableDataRequest* request) {
436
22
    VLOG_CRITICAL << "MetaScanner::_build_partitions_metadata_request";
437
22
    if (!meta_scan_range.__isset.partitions_params) {
438
0
        return Status::InternalError(
439
0
                "Can not find TPartitionsMetadataParams from meta_scan_range.");
440
0
    }
441
442
    // create request
443
22
    request->__set_schema_table_name(TSchemaTableName::METADATA_TABLE);
444
445
    // create TMetadataTableRequestParams
446
22
    TMetadataTableRequestParams metadata_table_params;
447
22
    metadata_table_params.__set_metadata_type(TMetadataType::PARTITIONS);
448
22
    metadata_table_params.__set_partitions_metadata_params(meta_scan_range.partitions_params);
449
450
22
    request->__set_metada_table_params(metadata_table_params);
451
22
    return Status::OK();
452
22
}
453
454
Status MetaScanner::_build_jobs_metadata_request(const TMetaScanRange& meta_scan_range,
455
947
                                                 TFetchSchemaTableDataRequest* request) {
456
947
    VLOG_CRITICAL << "MetaScanner::_build_jobs_metadata_request";
457
947
    if (!meta_scan_range.__isset.jobs_params) {
458
0
        return Status::InternalError("Can not find TJobsMetadataParams from meta_scan_range.");
459
0
    }
460
461
    // create request
462
947
    request->__set_schema_table_name(TSchemaTableName::METADATA_TABLE);
463
464
    // create TMetadataTableRequestParams
465
947
    TMetadataTableRequestParams metadata_table_params;
466
947
    metadata_table_params.__set_metadata_type(TMetadataType::JOBS);
467
947
    metadata_table_params.__set_jobs_metadata_params(meta_scan_range.jobs_params);
468
469
947
    request->__set_metada_table_params(metadata_table_params);
470
947
    return Status::OK();
471
947
}
472
473
Status MetaScanner::_build_tasks_metadata_request(const TMetaScanRange& meta_scan_range,
474
2.29k
                                                  TFetchSchemaTableDataRequest* request) {
475
2.29k
    VLOG_CRITICAL << "MetaScanner::_build_tasks_metadata_request";
476
2.29k
    if (!meta_scan_range.__isset.tasks_params) {
477
0
        return Status::InternalError("Can not find TTasksMetadataParams from meta_scan_range.");
478
0
    }
479
480
    // create request
481
2.29k
    request->__set_schema_table_name(TSchemaTableName::METADATA_TABLE);
482
483
    // create TMetadataTableRequestParams
484
2.29k
    TMetadataTableRequestParams metadata_table_params;
485
2.29k
    metadata_table_params.__set_metadata_type(TMetadataType::TASKS);
486
2.29k
    metadata_table_params.__set_tasks_metadata_params(meta_scan_range.tasks_params);
487
488
2.29k
    request->__set_metada_table_params(metadata_table_params);
489
2.29k
    return Status::OK();
490
2.29k
}
491
492
Status MetaScanner::_build_partition_values_metadata_request(
493
20
        const TMetaScanRange& meta_scan_range, TFetchSchemaTableDataRequest* request) {
494
20
    VLOG_CRITICAL << "MetaScanner::_build_partition_values_metadata_request";
495
20
    if (!meta_scan_range.__isset.partition_values_params) {
496
0
        return Status::InternalError(
497
0
                "Can not find TPartitionValuesMetadataParams from meta_scan_range.");
498
0
    }
499
500
    // create request
501
20
    request->__set_schema_table_name(TSchemaTableName::METADATA_TABLE);
502
503
    // create TMetadataTableRequestParams
504
20
    TMetadataTableRequestParams metadata_table_params;
505
20
    metadata_table_params.__set_metadata_type(TMetadataType::PARTITION_VALUES);
506
20
    metadata_table_params.__set_partition_values_metadata_params(
507
20
            meta_scan_range.partition_values_params);
508
509
20
    request->__set_metada_table_params(metadata_table_params);
510
20
    return Status::OK();
511
20
}
512
Status MetaScanner::_build_brokers_metadata_request(const TMetaScanRange& meta_scan_range,
513
0
                                                    TFetchSchemaTableDataRequest* request) {
514
0
    VLOG_CRITICAL << "MetaScanner::_build_brokers_metadata_request";
515
0
    if (!meta_scan_range.__isset.brokers_params) {
516
0
        return Status::InternalError("Can not find TBrokersMetadataParams from meta_scan_range.");
517
0
    }
518
    // create request
519
0
    request->__set_cluster_name(meta_scan_range.brokers_params.cluster_name);
520
0
    request->__set_schema_table_name(TSchemaTableName::METADATA_TABLE);
521
522
    // create TMetadataTableRequestParams
523
0
    TMetadataTableRequestParams metadata_table_params;
524
0
    metadata_table_params.__set_metadata_type(TMetadataType::BROKERS);
525
0
    metadata_table_params.__set_brokers_metadata_params(meta_scan_range.brokers_params);
526
527
0
    request->__set_metada_table_params(metadata_table_params);
528
0
    return Status::OK();
529
0
}
530
531
5.63k
Status MetaScanner::close(RuntimeState* state) {
532
5.63k
    VLOG_CRITICAL << "MetaScanner::close";
533
5.63k
    if (!_try_close()) {
534
0
        return Status::OK();
535
0
    }
536
5.63k
    if (_reader) {
537
41
        RETURN_IF_ERROR(_reader->close());
538
41
    }
539
5.63k
    RETURN_IF_ERROR(Scanner::close(state));
540
5.63k
    return Status::OK();
541
5.63k
}
542
543
} // namespace doris