Coverage Report

Created: 2025-09-11 18:52

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/root/doris/be/src/service/http_service.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 "service/http_service.h"
19
20
#include <event2/bufferevent.h>
21
#include <event2/http.h>
22
#include <gen_cpp/FrontendService_types.h>
23
24
#include <string>
25
#include <vector>
26
27
#include "cloud/cloud_compaction_action.h"
28
#include "cloud/config.h"
29
#include "cloud/injection_point_action.h"
30
#include "common/config.h"
31
#include "common/status.h"
32
#include "http/action/adjust_log_level.h"
33
#include "http/action/adjust_tracing_dump.h"
34
#include "http/action/batch_download_action.h"
35
#include "http/action/be_proc_thread_action.h"
36
#include "http/action/calc_file_crc_action.h"
37
#include "http/action/check_rpc_channel_action.h"
38
#include "http/action/check_tablet_segment_action.h"
39
#include "http/action/checksum_action.h"
40
#include "http/action/clear_cache_action.h"
41
#include "http/action/compaction_action.h"
42
#include "http/action/compaction_score_action.h"
43
#include "http/action/config_action.h"
44
#include "http/action/debug_point_action.h"
45
#include "http/action/delete_bitmap_action.h"
46
#include "http/action/dictionary_status_action.h"
47
#include "http/action/download_action.h"
48
#include "http/action/download_binlog_action.h"
49
#include "http/action/file_cache_action.h"
50
#include "http/action/health_action.h"
51
#include "http/action/http_stream.h"
52
#include "http/action/jeprofile_actions.h"
53
#include "http/action/load_channel_action.h"
54
#include "http/action/load_stream_action.h"
55
#include "http/action/meta_action.h"
56
#include "http/action/metrics_action.h"
57
#include "http/action/pad_rowset_action.h"
58
#include "http/action/pipeline_task_action.h"
59
#include "http/action/pprof_actions.h"
60
#include "http/action/reload_tablet_action.h"
61
#include "http/action/report_action.h"
62
#include "http/action/reset_rpc_channel_action.h"
63
#include "http/action/restore_tablet_action.h"
64
#include "http/action/show_hotspot_action.h"
65
#include "http/action/show_nested_index_file_action.h"
66
#include "http/action/shrink_mem_action.h"
67
#include "http/action/snapshot_action.h"
68
#include "http/action/stream_load.h"
69
#include "http/action/stream_load_2pc.h"
70
#include "http/action/stream_load_forward_handler.h"
71
#include "http/action/tablet_migration_action.h"
72
#include "http/action/tablets_distribution_action.h"
73
#include "http/action/tablets_info_action.h"
74
#include "http/action/version_action.h"
75
#include "http/default_path_handlers.h"
76
#include "http/ev_http_server.h"
77
#include "http/http_method.h"
78
#include "http/web_page_handler.h"
79
#include "olap/options.h"
80
#include "olap/storage_engine.h"
81
#include "runtime/exec_env.h"
82
#include "runtime/load_path_mgr.h"
83
#include "util/doris_metrics.h"
84
85
namespace doris {
86
#include "common/compile_check_begin.h"
87
namespace {
88
1
std::shared_ptr<bufferevent_rate_limit_group> get_rate_limit_group(event_base* event_base) {
89
1
    auto rate_limit = config::download_binlog_rate_limit_kbs;
90
1
    if (rate_limit <= 0) {
91
1
        return nullptr;
92
1
    }
93
94
0
    auto max_value = std::numeric_limits<int32_t>::max() / 1024 * 10;
95
0
    if (rate_limit > max_value) {
96
0
        LOG(WARNING) << "rate limit is too large, set to max value.";
97
0
        rate_limit = max_value;
98
0
    }
99
0
    struct timeval cfg_tick = {0, 100 * 1000}; // 100ms
100
0
    rate_limit = rate_limit / 10 * 1024;       // convert to KB/S
101
102
0
    auto token_bucket = std::unique_ptr<ev_token_bucket_cfg, decltype(&ev_token_bucket_cfg_free)>(
103
0
            ev_token_bucket_cfg_new(rate_limit, rate_limit * 2, rate_limit, rate_limit * 2,
104
0
                                    &cfg_tick),
105
0
            ev_token_bucket_cfg_free);
106
0
    return {bufferevent_rate_limit_group_new(event_base, token_bucket.get()),
107
0
            bufferevent_rate_limit_group_free};
108
1
}
109
} // namespace
110
111
HttpService::HttpService(ExecEnv* env, int port, int num_threads)
112
1
        : _env(env),
113
1
          _ev_http_server(new EvHttpServer(port, num_threads)),
114
1
          _web_page_handler(new WebPageHandler(_ev_http_server.get(), env)) {}
115
116
1
HttpService::~HttpService() {
117
1
    stop();
118
1
}
119
120
// NOLINTBEGIN(readability-function-size)
121
1
Status HttpService::start() {
122
1
    add_default_path_handlers(_web_page_handler.get());
123
124
1
    auto event_base = _ev_http_server->get_event_bases()[0];
125
1
    _rate_limit_group = get_rate_limit_group(event_base.get());
126
127
    // register load
128
1
    StreamLoadAction* streamload_action = _pool.add(new StreamLoadAction(_env));
129
1
    _ev_http_server->register_handler(HttpMethod::PUT, "/api/{db}/{table}/_load",
130
1
                                      streamload_action);
131
1
    _ev_http_server->register_handler(HttpMethod::PUT, "/api/{db}/{table}/_stream_load",
132
1
                                      streamload_action);
133
1
    StreamLoad2PCAction* streamload_2pc_action = _pool.add(new StreamLoad2PCAction(_env));
134
1
    _ev_http_server->register_handler(HttpMethod::PUT, "/api/{db}/_stream_load_2pc",
135
1
                                      streamload_2pc_action);
136
1
    _ev_http_server->register_handler(HttpMethod::PUT, "/api/{db}/{table}/_stream_load_2pc",
137
1
                                      streamload_2pc_action);
138
139
    // register stream load forward handler
140
1
    auto* forward_handler = _pool.add(new StreamLoadForwardHandler());
141
1
    _ev_http_server->register_handler(HttpMethod::PUT, "/api/{db}/{table}/_stream_load_forward",
142
1
                                      forward_handler);
143
144
    // register http_stream
145
1
    HttpStreamAction* http_stream_action = _pool.add(new HttpStreamAction(_env));
146
1
    _ev_http_server->register_handler(HttpMethod::PUT, "/api/_http_stream", http_stream_action);
147
148
1
    DownloadAction* error_log_download_action =
149
1
            _pool.add(new DownloadAction(_env, _env->load_path_mgr()->get_load_error_file_dir()));
150
1
    _ev_http_server->register_handler(HttpMethod::GET, "/api/_load_error_log",
151
1
                                      error_log_download_action);
152
1
    _ev_http_server->register_handler(HttpMethod::HEAD, "/api/_load_error_log",
153
1
                                      error_log_download_action);
154
155
1
    AdjustLogLevelAction* adjust_log_level_action = _pool.add(new AdjustLogLevelAction(_env));
156
1
    _ev_http_server->register_handler(HttpMethod::POST, "api/glog/adjust", adjust_log_level_action);
157
158
    //TODO: add query GET interface
159
1
    auto* adjust_tracing_dump = _pool.add(new AdjustTracingDump(_env));
160
1
    _ev_http_server->register_handler(HttpMethod::POST, "api/pipeline/tracing",
161
1
                                      adjust_tracing_dump);
162
163
    // Register BE version action
164
1
    VersionAction* version_action =
165
1
            _pool.add(new VersionAction(_env, TPrivilegeHier::GLOBAL, TPrivilegeType::NONE));
166
1
    _ev_http_server->register_handler(HttpMethod::GET, "/api/be_version_info", version_action);
167
168
    // Register BE health action
169
1
    HealthAction* health_action = _pool.add(new HealthAction(_env));
170
1
    _ev_http_server->register_handler(HttpMethod::GET, "/api/health", health_action);
171
172
    // Clear cache action
173
1
    ClearCacheAction* clear_cache_action = _pool.add(new ClearCacheAction(_env));
174
1
    _ev_http_server->register_handler(HttpMethod::GET, "/api/clear_cache/{type}",
175
1
                                      clear_cache_action);
176
177
    // Dump all running pipeline tasks
178
1
    PipelineTaskAction* pipeline_task_action = _pool.add(new PipelineTaskAction(_env));
179
1
    _ev_http_server->register_handler(HttpMethod::GET, "/api/running_pipeline_tasks",
180
1
                                      pipeline_task_action);
181
182
    // Dump all running pipeline tasks which has been running for more than {duration} seconds
183
1
    LongPipelineTaskAction* long_pipeline_task_action = _pool.add(new LongPipelineTaskAction(_env));
184
1
    _ev_http_server->register_handler(HttpMethod::GET, "/api/running_pipeline_tasks/{duration}",
185
1
                                      long_pipeline_task_action);
186
187
    // Dump all running pipeline tasks which has been running for more than {duration} seconds
188
1
    QueryPipelineTaskAction* query_pipeline_task_action =
189
1
            _pool.add(new QueryPipelineTaskAction(_env));
190
1
    _ev_http_server->register_handler(HttpMethod::GET, "/api/query_pipeline_tasks/{query_id}",
191
1
                                      query_pipeline_task_action);
192
193
    // Dump all be process thread num
194
1
    BeProcThreadAction* be_proc_thread_action = _pool.add(new BeProcThreadAction(_env));
195
1
    _ev_http_server->register_handler(HttpMethod::GET, "/api/be_process_thread_num",
196
1
                                      be_proc_thread_action);
197
198
    // Register BE LoadStream action
199
1
    LoadStreamAction* load_stream_action = _pool.add(new LoadStreamAction(_env));
200
1
    _ev_http_server->register_handler(HttpMethod::GET, "/api/load_streams", load_stream_action);
201
202
    // Register BE LoadChannel action
203
1
    LoadChannelAction* load_channel_action = _pool.add(new LoadChannelAction(_env));
204
1
    _ev_http_server->register_handler(HttpMethod::GET, "/api/load_channels", load_channel_action);
205
206
    // Register Tablets Info action
207
1
    TabletsInfoAction* tablets_info_action =
208
1
            _pool.add(new TabletsInfoAction(_env, TPrivilegeHier::GLOBAL, TPrivilegeType::ADMIN));
209
1
    _ev_http_server->register_handler(HttpMethod::GET, "/tablets_json", tablets_info_action);
210
211
    // register pprof actions
212
1
    static_cast<void>(PprofActions::setup(_env, _ev_http_server.get(), _pool));
213
214
    // register jeprof actions
215
1
    SetJeHeapProfileActiveActions* set_jeheap_profile_active_action =
216
1
            _pool.add(new SetJeHeapProfileActiveActions(_env));
217
1
    _ev_http_server->register_handler(HttpMethod::GET, "/jeheap/active/{prof_value}",
218
1
                                      set_jeheap_profile_active_action);
219
220
1
    SetJeHeapProfileResetActions* set_jeheap_profile_reset_action =
221
1
            _pool.add(new SetJeHeapProfileResetActions(_env));
222
1
    _ev_http_server->register_handler(HttpMethod::GET, "/jeheap/reset/{reset_value}",
223
1
                                      set_jeheap_profile_reset_action);
224
225
1
    DumpJeHeapProfileToDotActions* dump_jeheap_profile_to_dot_action =
226
1
            _pool.add(new DumpJeHeapProfileToDotActions(_env));
227
1
    _ev_http_server->register_handler(HttpMethod::GET, "/jeheap/dump",
228
1
                                      dump_jeheap_profile_to_dot_action);
229
230
1
    DumpJeHeapProfileActions* dump_jeheap_profile_action =
231
1
            _pool.add(new DumpJeHeapProfileActions(_env));
232
1
    _ev_http_server->register_handler(HttpMethod::GET, "/jeheap/dump_only",
233
1
                                      dump_jeheap_profile_action);
234
235
    // register dictionary status action
236
1
    DictionaryStatusAction* dict_status_action = _pool.add(new DictionaryStatusAction(_env));
237
1
    _ev_http_server->register_handler(HttpMethod::GET, "/api/dictionary_status",
238
1
                                      dict_status_action);
239
240
    // register metrics
241
1
    {
242
1
        auto* action =
243
1
                _pool.add(new MetricsAction(DorisMetrics::instance()->metric_registry(), _env,
244
1
                                            TPrivilegeHier::GLOBAL, TPrivilegeType::NONE));
245
1
        _ev_http_server->register_handler(HttpMethod::GET, "/metrics", action);
246
1
    }
247
248
1
    MetaAction* meta_action =
249
1
            _pool.add(new MetaAction(_env, TPrivilegeHier::GLOBAL, TPrivilegeType::ADMIN));
250
1
    _ev_http_server->register_handler(HttpMethod::GET, "/api/meta/{op}/{tablet_id}", meta_action);
251
252
1
    ConfigAction* update_config_action =
253
1
            _pool.add(new ConfigAction(ConfigActionType::UPDATE_CONFIG, _env));
254
1
    _ev_http_server->register_handler(HttpMethod::POST, "/api/update_config", update_config_action);
255
256
1
    ConfigAction* show_config_action =
257
1
            _pool.add(new ConfigAction(ConfigActionType::SHOW_CONFIG, _env));
258
1
    _ev_http_server->register_handler(HttpMethod::GET, "/api/show_config", show_config_action);
259
260
    // 3 check action
261
1
    CheckRPCChannelAction* check_rpc_channel_action = _pool.add(
262
1
            new CheckRPCChannelAction(_env, TPrivilegeHier::GLOBAL, TPrivilegeType::ADMIN));
263
1
    _ev_http_server->register_handler(HttpMethod::GET,
264
1
                                      "/api/check_rpc_channel/{ip}/{port}/{payload_size}",
265
1
                                      check_rpc_channel_action);
266
267
1
    ResetRPCChannelAction* reset_rpc_channel_action = _pool.add(
268
1
            new ResetRPCChannelAction(_env, TPrivilegeHier::GLOBAL, TPrivilegeType::ADMIN));
269
1
    _ev_http_server->register_handler(HttpMethod::GET, "/api/reset_rpc_channel/{endpoints}",
270
1
                                      reset_rpc_channel_action);
271
272
1
    register_debug_point_handler();
273
274
1
    ReportAction* report_task_action = _pool.add(
275
1
            new ReportAction(_env, TPrivilegeHier::GLOBAL, TPrivilegeType::ADMIN, "REPORT_TASK"));
276
1
    _ev_http_server->register_handler(HttpMethod::GET, "/api/report/task", report_task_action);
277
278
    // shrink memory for starting co-exist process during upgrade
279
1
    ShrinkMemAction* shrink_mem_action = _pool.add(new ShrinkMemAction(_env));
280
1
    _ev_http_server->register_handler(HttpMethod::GET, "/api/shrink_mem", shrink_mem_action);
281
282
#ifndef BE_TEST
283
    auto& engine = _env->storage_engine();
284
    if (config::is_cloud_mode()) {
285
        register_cloud_handler(engine.to_cloud());
286
    } else {
287
        register_local_handler(engine.to_local());
288
    }
289
#endif
290
1
    _ev_http_server->start();
291
1
    return Status::OK();
292
1
}
293
// NOLINTEND(readability-function-size)
294
295
1
void HttpService::register_debug_point_handler() {
296
    // debug point
297
1
    AddDebugPointAction* add_debug_point_action =
298
1
            _pool.add(new AddDebugPointAction(_env, TPrivilegeHier::GLOBAL, TPrivilegeType::ADMIN));
299
1
    _ev_http_server->register_handler(HttpMethod::POST, "/api/debug_point/add/{debug_point}",
300
1
                                      add_debug_point_action);
301
302
1
    RemoveDebugPointAction* remove_debug_point_action = _pool.add(
303
1
            new RemoveDebugPointAction(_env, TPrivilegeHier::GLOBAL, TPrivilegeType::ADMIN));
304
1
    _ev_http_server->register_handler(HttpMethod::POST, "/api/debug_point/remove/{debug_point}",
305
1
                                      remove_debug_point_action);
306
307
1
    ClearDebugPointsAction* clear_debug_points_action = _pool.add(
308
1
            new ClearDebugPointsAction(_env, TPrivilegeHier::GLOBAL, TPrivilegeType::ADMIN));
309
1
    _ev_http_server->register_handler(HttpMethod::POST, "/api/debug_point/clear",
310
1
                                      clear_debug_points_action);
311
1
}
312
313
// NOLINTBEGIN(readability-function-size)
314
0
void HttpService::register_local_handler(StorageEngine& engine) {
315
    // register download action
316
0
    std::vector<std::string> allow_paths;
317
0
    for (const auto& path : _env->store_paths()) {
318
0
        allow_paths.emplace_back(path.path);
319
0
    }
320
0
    DownloadAction* download_action = _pool.add(new DownloadAction(_env, nullptr, allow_paths));
321
0
    _ev_http_server->register_handler(HttpMethod::HEAD, "/api/_download_load", download_action);
322
0
    _ev_http_server->register_handler(HttpMethod::GET, "/api/_download_load", download_action);
323
324
0
    DownloadAction* tablet_download_action =
325
0
            _pool.add(new DownloadAction(_env, _rate_limit_group, allow_paths));
326
0
    _ev_http_server->register_handler(HttpMethod::HEAD, "/api/_tablet/_download",
327
0
                                      tablet_download_action);
328
0
    _ev_http_server->register_handler(HttpMethod::GET, "/api/_tablet/_download",
329
0
                                      tablet_download_action);
330
331
0
    BatchDownloadAction* batch_download_action =
332
0
            _pool.add(new BatchDownloadAction(_env, _rate_limit_group, allow_paths));
333
0
    _ev_http_server->register_handler(HttpMethod::HEAD, "/api/_tablet/_batch_download",
334
0
                                      batch_download_action);
335
0
    _ev_http_server->register_handler(HttpMethod::GET, "/api/_tablet/_batch_download",
336
0
                                      batch_download_action);
337
0
    _ev_http_server->register_handler(HttpMethod::POST, "/api/_tablet/_batch_download",
338
0
                                      batch_download_action);
339
340
0
    if (config::enable_single_replica_load) {
341
0
        DownloadAction* single_replica_download_action = _pool.add(new DownloadAction(
342
0
                _env, nullptr, allow_paths, config::single_replica_load_download_num_workers));
343
0
        _ev_http_server->register_handler(HttpMethod::HEAD, "/api/_single_replica/_download",
344
0
                                          single_replica_download_action);
345
0
        _ev_http_server->register_handler(HttpMethod::GET, "/api/_single_replica/_download",
346
0
                                          single_replica_download_action);
347
0
    }
348
349
0
    DownloadBinlogAction* download_binlog_action =
350
0
            _pool.add(new DownloadBinlogAction(_env, engine, _rate_limit_group));
351
0
    _ev_http_server->register_handler(HttpMethod::GET, "/api/_binlog/_download",
352
0
                                      download_binlog_action);
353
0
    _ev_http_server->register_handler(HttpMethod::HEAD, "/api/_binlog/_download",
354
0
                                      download_binlog_action);
355
356
0
    FileCacheAction* file_cache_action = _pool.add(new FileCacheAction(_env));
357
0
    _ev_http_server->register_handler(HttpMethod::POST, "/api/file_cache", file_cache_action);
358
359
0
    TabletsDistributionAction* tablets_distribution_action =
360
0
            _pool.add(new TabletsDistributionAction(_env, engine, TPrivilegeHier::GLOBAL,
361
0
                                                    TPrivilegeType::ADMIN));
362
0
    _ev_http_server->register_handler(HttpMethod::GET, "/api/tablets_distribution",
363
0
                                      tablets_distribution_action);
364
365
    // Register tablet migration action
366
0
    TabletMigrationAction* tablet_migration_action = _pool.add(
367
0
            new TabletMigrationAction(_env, engine, TPrivilegeHier::GLOBAL, TPrivilegeType::ADMIN));
368
0
    _ev_http_server->register_handler(HttpMethod::GET, "/api/tablet_migration",
369
0
                                      tablet_migration_action);
370
371
#ifndef BE_TEST
372
    // Register BE checksum action
373
    ChecksumAction* checksum_action = _pool.add(
374
            new ChecksumAction(_env, engine, TPrivilegeHier::GLOBAL, TPrivilegeType::ADMIN));
375
    _ev_http_server->register_handler(HttpMethod::GET, "/api/checksum", checksum_action);
376
377
    // Register BE reload tablet action
378
    ReloadTabletAction* reload_tablet_action = _pool.add(
379
            new ReloadTabletAction(_env, engine, TPrivilegeHier::GLOBAL, TPrivilegeType::ADMIN));
380
    _ev_http_server->register_handler(HttpMethod::GET, "/api/reload_tablet", reload_tablet_action);
381
382
    RestoreTabletAction* restore_tablet_action = _pool.add(
383
            new RestoreTabletAction(_env, engine, TPrivilegeHier::GLOBAL, TPrivilegeType::ADMIN));
384
    _ev_http_server->register_handler(HttpMethod::POST, "/api/restore_tablet",
385
                                      restore_tablet_action);
386
387
    // Register BE snapshot action
388
    SnapshotAction* snapshot_action = _pool.add(
389
            new SnapshotAction(_env, engine, TPrivilegeHier::GLOBAL, TPrivilegeType::ADMIN));
390
    _ev_http_server->register_handler(HttpMethod::GET, "/api/snapshot", snapshot_action);
391
#endif
392
    // 2 compaction actions
393
0
    CompactionAction* show_compaction_action =
394
0
            _pool.add(new CompactionAction(CompactionActionType::SHOW_INFO, _env, engine,
395
0
                                           TPrivilegeHier::GLOBAL, TPrivilegeType::ADMIN));
396
0
    _ev_http_server->register_handler(HttpMethod::GET, "/api/compaction/show",
397
0
                                      show_compaction_action);
398
0
    CompactionAction* run_compaction_action =
399
0
            _pool.add(new CompactionAction(CompactionActionType::RUN_COMPACTION, _env, engine,
400
0
                                           TPrivilegeHier::GLOBAL, TPrivilegeType::ADMIN));
401
0
    _ev_http_server->register_handler(HttpMethod::POST, "/api/compaction/run",
402
0
                                      run_compaction_action);
403
0
    CompactionAction* run_status_compaction_action =
404
0
            _pool.add(new CompactionAction(CompactionActionType::RUN_COMPACTION_STATUS, _env,
405
0
                                           engine, TPrivilegeHier::GLOBAL, TPrivilegeType::ADMIN));
406
407
0
    _ev_http_server->register_handler(HttpMethod::GET, "/api/compaction/run_status",
408
0
                                      run_status_compaction_action);
409
410
0
    DeleteBitmapAction* count_delete_bitmap_action =
411
0
            _pool.add(new DeleteBitmapAction(DeleteBitmapActionType::COUNT_LOCAL, _env, engine,
412
0
                                             TPrivilegeHier::GLOBAL, TPrivilegeType::ADMIN));
413
0
    _ev_http_server->register_handler(HttpMethod::GET, "/api/delete_bitmap/count_local",
414
0
                                      count_delete_bitmap_action);
415
0
    DeleteBitmapAction* count_agg_cache_delete_bitmap_action =
416
0
            _pool.add(new DeleteBitmapAction(DeleteBitmapActionType::COUNT_AGG_CACHE, _env, engine,
417
0
                                             TPrivilegeHier::GLOBAL, TPrivilegeType::ADMIN));
418
0
    _ev_http_server->register_handler(HttpMethod::GET, "/api/delete_bitmap/count_agg_cache",
419
0
                                      count_agg_cache_delete_bitmap_action);
420
421
0
    CheckTabletSegmentAction* check_tablet_segment_action = _pool.add(new CheckTabletSegmentAction(
422
0
            _env, engine, TPrivilegeHier::GLOBAL, TPrivilegeType::ADMIN));
423
0
    _ev_http_server->register_handler(HttpMethod::POST, "/api/check_tablet_segment_lost",
424
0
                                      check_tablet_segment_action);
425
426
0
    PadRowsetAction* pad_rowset_action = _pool.add(
427
0
            new PadRowsetAction(_env, engine, TPrivilegeHier::GLOBAL, TPrivilegeType::ADMIN));
428
0
    _ev_http_server->register_handler(HttpMethod::POST, "/api/pad_rowset", pad_rowset_action);
429
430
0
    ReportAction* report_tablet_action = _pool.add(new ReportAction(
431
0
            _env, TPrivilegeHier::GLOBAL, TPrivilegeType::ADMIN, "REPORT_OLAP_TABLET"));
432
0
    _ev_http_server->register_handler(HttpMethod::GET, "/api/report/tablet", report_tablet_action);
433
434
0
    ReportAction* report_disk_action = _pool.add(new ReportAction(
435
0
            _env, TPrivilegeHier::GLOBAL, TPrivilegeType::ADMIN, "REPORT_DISK_STATE"));
436
0
    _ev_http_server->register_handler(HttpMethod::GET, "/api/report/disk", report_disk_action);
437
438
0
    CalcFileCrcAction* calc_crc_action = _pool.add(
439
0
            new CalcFileCrcAction(_env, engine, TPrivilegeHier::GLOBAL, TPrivilegeType::ADMIN));
440
0
    _ev_http_server->register_handler(HttpMethod::GET, "/api/calc_crc", calc_crc_action);
441
442
0
    ShowNestedIndexFileAction* show_nested_index_file_action = _pool.add(
443
0
            new ShowNestedIndexFileAction(_env, TPrivilegeHier::GLOBAL, TPrivilegeType::ADMIN));
444
0
    _ev_http_server->register_handler(HttpMethod::GET, "/api/show_nested_index_file",
445
0
                                      show_nested_index_file_action);
446
447
0
    CompactionScoreAction* compaction_score_action = _pool.add(new CompactionScoreAction(
448
0
            _env, TPrivilegeHier::GLOBAL, TPrivilegeType::ADMIN, engine.tablet_manager()));
449
0
    _ev_http_server->register_handler(HttpMethod::GET, "/api/compaction_score",
450
0
                                      compaction_score_action);
451
0
}
452
453
0
void HttpService::register_cloud_handler(CloudStorageEngine& engine) {
454
0
    CloudCompactionAction* show_compaction_action =
455
0
            _pool.add(new CloudCompactionAction(CompactionActionType::SHOW_INFO, _env, engine,
456
0
                                                TPrivilegeHier::GLOBAL, TPrivilegeType::ADMIN));
457
0
    _ev_http_server->register_handler(HttpMethod::GET, "/api/compaction/show",
458
0
                                      show_compaction_action);
459
0
    CloudCompactionAction* run_compaction_action =
460
0
            _pool.add(new CloudCompactionAction(CompactionActionType::RUN_COMPACTION, _env, engine,
461
0
                                                TPrivilegeHier::GLOBAL, TPrivilegeType::ADMIN));
462
0
    _ev_http_server->register_handler(HttpMethod::POST, "/api/compaction/run",
463
0
                                      run_compaction_action);
464
0
    CloudCompactionAction* run_status_compaction_action = _pool.add(
465
0
            new CloudCompactionAction(CompactionActionType::RUN_COMPACTION_STATUS, _env, engine,
466
0
                                      TPrivilegeHier::GLOBAL, TPrivilegeType::ADMIN));
467
0
    _ev_http_server->register_handler(HttpMethod::GET, "/api/compaction/run_status",
468
0
                                      run_status_compaction_action);
469
0
    DeleteBitmapAction* count_local_delete_bitmap_action =
470
0
            _pool.add(new DeleteBitmapAction(DeleteBitmapActionType::COUNT_LOCAL, _env, engine,
471
0
                                             TPrivilegeHier::GLOBAL, TPrivilegeType::ADMIN));
472
0
    _ev_http_server->register_handler(HttpMethod::GET, "/api/delete_bitmap/count_local",
473
0
                                      count_local_delete_bitmap_action);
474
0
    DeleteBitmapAction* count_ms_delete_bitmap_action =
475
0
            _pool.add(new DeleteBitmapAction(DeleteBitmapActionType::COUNT_MS, _env, engine,
476
0
                                             TPrivilegeHier::GLOBAL, TPrivilegeType::ADMIN));
477
0
    _ev_http_server->register_handler(HttpMethod::GET, "/api/delete_bitmap/count_ms",
478
0
                                      count_ms_delete_bitmap_action);
479
0
    DeleteBitmapAction* count_agg_cache_delete_bitmap_action =
480
0
            _pool.add(new DeleteBitmapAction(DeleteBitmapActionType::COUNT_AGG_CACHE, _env, engine,
481
0
                                             TPrivilegeHier::GLOBAL, TPrivilegeType::ADMIN));
482
0
    _ev_http_server->register_handler(HttpMethod::GET, "/api/delete_bitmap/count_agg_cache",
483
0
                                      count_agg_cache_delete_bitmap_action);
484
#ifdef ENABLE_INJECTION_POINT
485
    InjectionPointAction* injection_point_action = _pool.add(new InjectionPointAction);
486
    _ev_http_server->register_handler(HttpMethod::GET, "/api/injection_point/{op}",
487
                                      injection_point_action);
488
#endif
489
0
    FileCacheAction* file_cache_action = _pool.add(new FileCacheAction(_env));
490
0
    _ev_http_server->register_handler(HttpMethod::GET, "/api/file_cache", file_cache_action);
491
0
    auto* show_hotspot_action = _pool.add(new ShowHotspotAction(engine, _env));
492
0
    _ev_http_server->register_handler(HttpMethod::GET, "/api/hotspot/tablet", show_hotspot_action);
493
494
0
    CalcFileCrcAction* calc_crc_action = _pool.add(
495
0
            new CalcFileCrcAction(_env, engine, TPrivilegeHier::GLOBAL, TPrivilegeType::ADMIN));
496
0
    _ev_http_server->register_handler(HttpMethod::GET, "/api/calc_crc", calc_crc_action);
497
498
0
    ShowNestedIndexFileAction* show_nested_index_file_action = _pool.add(
499
0
            new ShowNestedIndexFileAction(_env, TPrivilegeHier::GLOBAL, TPrivilegeType::ADMIN));
500
0
    _ev_http_server->register_handler(HttpMethod::GET, "/api/show_nested_index_file",
501
0
                                      show_nested_index_file_action);
502
0
    CompactionScoreAction* compaction_score_action = _pool.add(new CompactionScoreAction(
503
0
            _env, TPrivilegeHier::GLOBAL, TPrivilegeType::ADMIN, engine.tablet_mgr()));
504
0
    _ev_http_server->register_handler(HttpMethod::GET, "/api/compaction_score",
505
0
                                      compaction_score_action);
506
0
}
507
// NOLINTEND(readability-function-size)
508
509
1
void HttpService::stop() {
510
1
    if (stopped) {
511
0
        return;
512
0
    }
513
1
    _ev_http_server->stop();
514
1
    _pool.clear();
515
1
    stopped = true;
516
1
}
517
518
1
int HttpService::get_real_port() const {
519
1
    return _ev_http_server->get_real_port();
520
1
}
521
522
#include "common/compile_check_end.h"
523
} // namespace doris