Coverage Report

Created: 2026-04-24 11:56

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