Config.cpp 38.3 KB
Newer Older
J
jinhai 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements.  See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership.  The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License.  You may obtain a copy of the License at
//
//   http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied.  See the License for the
// specific language governing permissions and limitations
// under the License.

G
groot 已提交
18
#include <sys/stat.h>
Y
yudong.cai 已提交
19
#include <algorithm>
S
starlord 已提交
20
#include <iostream>
21
#include <regex>
S
starlord 已提交
22
#include <string>
S
starlord 已提交
23
#include <vector>
G
groot 已提交
24

25 26
#include "config/YamlConfigMgr.h"
#include "server/Config.h"
27 28
#include "utils/CommonUtil.h"
#include "utils/ValidationUtil.h"
G
groot 已提交
29

J
jinhai 已提交
30
namespace milvus {
G
groot 已提交
31 32
namespace server {

Y
yudong.cai 已提交
33
constexpr uint64_t GB = 1UL << 30;
34

S
starlord 已提交
35
Config&
36 37 38
Config::GetInstance() {
    static Config config_inst;
    return config_inst;
G
groot 已提交
39 40
}

S
starlord 已提交
41
Status
S
starlord 已提交
42
Config::LoadConfigFile(const std::string& filename) {
43
    if (filename.empty()) {
44
        return Status(SERVER_UNEXPECTED_ERROR, "No specified config file");
G
groot 已提交
45
    }
46 47 48 49 50

    struct stat file_stat;
    if (stat(filename.c_str(), &file_stat) != 0) {
        std::string str = "Config file not exist: " + filename;
        return Status(SERVER_FILE_NOT_FOUND, str);
G
groot 已提交
51 52 53
    }

    try {
54 55 56 57
        ConfigMgr* mgr = YamlConfigMgr::GetInstance();
        Status s = mgr->LoadConfigFile(filename);
        if (!s.ok()) {
            return s;
G
groot 已提交
58
        }
S
starlord 已提交
59
    } catch (YAML::Exception& e) {
60 61
        std::string str = "Exception occurs when loading config file: " + filename;
        return Status(SERVER_UNEXPECTED_ERROR, str);
G
groot 已提交
62 63
    }

S
starlord 已提交
64
    return Status::OK();
G
groot 已提交
65 66
}

Y
yudong.cai 已提交
67 68 69 70 71 72 73
Status
Config::ValidateConfig() {
    Status s;

    /* server config */
    std::string server_addr;
    s = GetServerConfigAddress(server_addr);
S
starlord 已提交
74 75 76
    if (!s.ok()) {
        return s;
    }
Y
yudong.cai 已提交
77 78 79

    std::string server_port;
    s = GetServerConfigPort(server_port);
S
starlord 已提交
80 81 82
    if (!s.ok()) {
        return s;
    }
Y
yudong.cai 已提交
83 84

    std::string server_mode;
Y
yudong.cai 已提交
85
    s = GetServerConfigDeployMode(server_mode);
S
starlord 已提交
86 87 88
    if (!s.ok()) {
        return s;
    }
Y
yudong.cai 已提交
89 90 91

    std::string server_time_zone;
    s = GetServerConfigTimeZone(server_time_zone);
S
starlord 已提交
92 93 94
    if (!s.ok()) {
        return s;
    }
Y
yudong.cai 已提交
95 96 97 98

    /* db config */
    std::string db_primary_path;
    s = GetDBConfigPrimaryPath(db_primary_path);
S
starlord 已提交
99 100 101
    if (!s.ok()) {
        return s;
    }
Y
yudong.cai 已提交
102 103 104

    std::string db_secondary_path;
    s = GetDBConfigSecondaryPath(db_secondary_path);
S
starlord 已提交
105 106 107
    if (!s.ok()) {
        return s;
    }
Y
yudong.cai 已提交
108 109 110

    std::string db_backend_url;
    s = GetDBConfigBackendUrl(db_backend_url);
S
starlord 已提交
111 112 113
    if (!s.ok()) {
        return s;
    }
Y
yudong.cai 已提交
114 115 116

    int32_t db_archive_disk_threshold;
    s = GetDBConfigArchiveDiskThreshold(db_archive_disk_threshold);
S
starlord 已提交
117 118 119
    if (!s.ok()) {
        return s;
    }
Y
yudong.cai 已提交
120 121 122

    int32_t db_archive_days_threshold;
    s = GetDBConfigArchiveDaysThreshold(db_archive_days_threshold);
S
starlord 已提交
123 124 125
    if (!s.ok()) {
        return s;
    }
Y
yudong.cai 已提交
126 127 128

    int32_t db_insert_buffer_size;
    s = GetDBConfigInsertBufferSize(db_insert_buffer_size);
S
starlord 已提交
129 130 131
    if (!s.ok()) {
        return s;
    }
Y
yudong.cai 已提交
132 133 134 135

    /* metric config */
    bool metric_enable_monitor;
    s = GetMetricConfigEnableMonitor(metric_enable_monitor);
S
starlord 已提交
136 137 138
    if (!s.ok()) {
        return s;
    }
Y
yudong.cai 已提交
139 140 141

    std::string metric_collector;
    s = GetMetricConfigCollector(metric_collector);
S
starlord 已提交
142 143 144
    if (!s.ok()) {
        return s;
    }
Y
yudong.cai 已提交
145 146 147

    std::string metric_prometheus_port;
    s = GetMetricConfigPrometheusPort(metric_prometheus_port);
S
starlord 已提交
148 149 150
    if (!s.ok()) {
        return s;
    }
Y
yudong.cai 已提交
151 152

    /* cache config */
W
wxyu 已提交
153
    int64_t cache_cpu_cache_capacity;
Y
yudong.cai 已提交
154
    s = GetCacheConfigCpuCacheCapacity(cache_cpu_cache_capacity);
S
starlord 已提交
155 156 157
    if (!s.ok()) {
        return s;
    }
Y
yudong.cai 已提交
158

Y
yudong.cai 已提交
159 160
    float cache_cpu_cache_threshold;
    s = GetCacheConfigCpuCacheThreshold(cache_cpu_cache_threshold);
S
starlord 已提交
161 162 163
    if (!s.ok()) {
        return s;
    }
Y
yudong.cai 已提交
164

W
wxyu 已提交
165
    int64_t cache_gpu_cache_capacity;
Y
yudong.cai 已提交
166
    s = GetCacheConfigGpuCacheCapacity(cache_gpu_cache_capacity);
S
starlord 已提交
167 168 169
    if (!s.ok()) {
        return s;
    }
Y
yudong.cai 已提交
170

Y
yudong.cai 已提交
171 172
    float cache_gpu_cache_threshold;
    s = GetCacheConfigGpuCacheThreshold(cache_gpu_cache_threshold);
S
starlord 已提交
173 174 175
    if (!s.ok()) {
        return s;
    }
Y
yudong.cai 已提交
176 177 178

    bool cache_insert_data;
    s = GetCacheConfigCacheInsertData(cache_insert_data);
S
starlord 已提交
179 180 181
    if (!s.ok()) {
        return s;
    }
Y
yudong.cai 已提交
182 183

    /* engine config */
Y
yudong.cai 已提交
184 185
    int32_t engine_use_blas_threshold;
    s = GetEngineConfigUseBlasThreshold(engine_use_blas_threshold);
S
starlord 已提交
186 187 188
    if (!s.ok()) {
        return s;
    }
Y
yudong.cai 已提交
189 190 191

    int32_t engine_omp_thread_num;
    s = GetEngineConfigOmpThreadNum(engine_omp_thread_num);
S
starlord 已提交
192 193 194
    if (!s.ok()) {
        return s;
    }
Y
yudong.cai 已提交
195

196 197
    int32_t engine_gpu_search_threshold;
    s = GetEngineConfigGpuSearchThreshold(engine_gpu_search_threshold);
W
wxyu 已提交
198 199 200 201
    if (!s.ok()) {
        return s;
    }

Y
yudong.cai 已提交
202 203 204
    /* resource config */
    std::string resource_mode;
    s = GetResourceConfigMode(resource_mode);
S
starlord 已提交
205 206 207
    if (!s.ok()) {
        return s;
    }
Y
yudong.cai 已提交
208

209 210 211 212 213 214 215 216
    std::vector<std::string> search_resources;
    s = GetResourceConfigSearchResources(search_resources);
    if (!s.ok()) {
        return s;
    }

    int32_t resource_index_build_device;
    s = GetResourceConfigIndexBuildDevice(resource_index_build_device);
S
starlord 已提交
217 218 219
    if (!s.ok()) {
        return s;
    }
Y
yudong.cai 已提交
220 221 222 223

    return Status::OK();
}

Y
yudong.cai 已提交
224 225 226 227 228 229
Status
Config::ResetDefaultConfig() {
    Status s;

    /* server config */
    s = SetServerConfigAddress(CONFIG_SERVER_ADDRESS_DEFAULT);
S
starlord 已提交
230 231 232
    if (!s.ok()) {
        return s;
    }
Y
yudong.cai 已提交
233 234

    s = SetServerConfigPort(CONFIG_SERVER_PORT_DEFAULT);
S
starlord 已提交
235 236 237
    if (!s.ok()) {
        return s;
    }
Y
yudong.cai 已提交
238 239

    s = SetServerConfigDeployMode(CONFIG_SERVER_DEPLOY_MODE_DEFAULT);
S
starlord 已提交
240 241 242
    if (!s.ok()) {
        return s;
    }
Y
yudong.cai 已提交
243 244

    s = SetServerConfigTimeZone(CONFIG_SERVER_TIME_ZONE_DEFAULT);
S
starlord 已提交
245 246 247
    if (!s.ok()) {
        return s;
    }
Y
yudong.cai 已提交
248 249 250

    /* db config */
    s = SetDBConfigPrimaryPath(CONFIG_DB_PRIMARY_PATH_DEFAULT);
S
starlord 已提交
251 252 253
    if (!s.ok()) {
        return s;
    }
Y
yudong.cai 已提交
254 255

    s = SetDBConfigSecondaryPath(CONFIG_DB_SECONDARY_PATH_DEFAULT);
S
starlord 已提交
256 257 258
    if (!s.ok()) {
        return s;
    }
Y
yudong.cai 已提交
259 260

    s = SetDBConfigBackendUrl(CONFIG_DB_BACKEND_URL_DEFAULT);
S
starlord 已提交
261 262 263
    if (!s.ok()) {
        return s;
    }
Y
yudong.cai 已提交
264 265

    s = SetDBConfigArchiveDiskThreshold(CONFIG_DB_ARCHIVE_DISK_THRESHOLD_DEFAULT);
S
starlord 已提交
266 267 268
    if (!s.ok()) {
        return s;
    }
Y
yudong.cai 已提交
269 270

    s = SetDBConfigArchiveDaysThreshold(CONFIG_DB_ARCHIVE_DAYS_THRESHOLD_DEFAULT);
S
starlord 已提交
271 272 273
    if (!s.ok()) {
        return s;
    }
Y
yudong.cai 已提交
274 275

    s = SetDBConfigInsertBufferSize(CONFIG_DB_INSERT_BUFFER_SIZE_DEFAULT);
S
starlord 已提交
276 277 278
    if (!s.ok()) {
        return s;
    }
Y
yudong.cai 已提交
279 280 281

    /* metric config */
    s = SetMetricConfigEnableMonitor(CONFIG_METRIC_ENABLE_MONITOR_DEFAULT);
S
starlord 已提交
282 283 284
    if (!s.ok()) {
        return s;
    }
Y
yudong.cai 已提交
285 286

    s = SetMetricConfigCollector(CONFIG_METRIC_COLLECTOR_DEFAULT);
S
starlord 已提交
287 288 289
    if (!s.ok()) {
        return s;
    }
Y
yudong.cai 已提交
290 291

    s = SetMetricConfigPrometheusPort(CONFIG_METRIC_PROMETHEUS_PORT_DEFAULT);
S
starlord 已提交
292 293 294
    if (!s.ok()) {
        return s;
    }
Y
yudong.cai 已提交
295 296

    /* cache config */
Y
yudong.cai 已提交
297
    s = SetCacheConfigCpuCacheCapacity(CONFIG_CACHE_CPU_CACHE_CAPACITY_DEFAULT);
S
starlord 已提交
298 299 300
    if (!s.ok()) {
        return s;
    }
Y
yudong.cai 已提交
301

Y
yudong.cai 已提交
302
    s = SetCacheConfigCpuCacheThreshold(CONFIG_CACHE_CPU_CACHE_THRESHOLD_DEFAULT);
S
starlord 已提交
303 304 305
    if (!s.ok()) {
        return s;
    }
Y
yudong.cai 已提交
306

Y
yudong.cai 已提交
307
    s = SetCacheConfigGpuCacheCapacity(CONFIG_CACHE_GPU_CACHE_CAPACITY_DEFAULT);
S
starlord 已提交
308 309 310
    if (!s.ok()) {
        return s;
    }
Y
yudong.cai 已提交
311

Y
yudong.cai 已提交
312
    s = SetCacheConfigGpuCacheThreshold(CONFIG_CACHE_GPU_CACHE_THRESHOLD_DEFAULT);
S
starlord 已提交
313 314 315
    if (!s.ok()) {
        return s;
    }
Y
yudong.cai 已提交
316 317

    s = SetCacheConfigCacheInsertData(CONFIG_CACHE_CACHE_INSERT_DATA_DEFAULT);
S
starlord 已提交
318 319 320
    if (!s.ok()) {
        return s;
    }
Y
yudong.cai 已提交
321 322

    /* engine config */
Y
yudong.cai 已提交
323
    s = SetEngineConfigUseBlasThreshold(CONFIG_ENGINE_USE_BLAS_THRESHOLD_DEFAULT);
S
starlord 已提交
324 325 326
    if (!s.ok()) {
        return s;
    }
Y
yudong.cai 已提交
327 328

    s = SetEngineConfigOmpThreadNum(CONFIG_ENGINE_OMP_THREAD_NUM_DEFAULT);
S
starlord 已提交
329 330 331
    if (!s.ok()) {
        return s;
    }
Y
yudong.cai 已提交
332

333
    s = SetEngineConfigGpuSearchThreshold(CONFIG_ENGINE_GPU_SEARCH_THRESHOLD_DEFAULT);
W
wxyu 已提交
334 335 336 337
    if (!s.ok()) {
        return s;
    }

Y
yudong.cai 已提交
338 339
    /* resource config */
    s = SetResourceConfigMode(CONFIG_RESOURCE_MODE_DEFAULT);
S
starlord 已提交
340 341 342
    if (!s.ok()) {
        return s;
    }
Y
yudong.cai 已提交
343

344 345 346 347 348
    s = SetResourceConfigIndexBuildDevice(CONFIG_RESOURCE_INDEX_BUILD_DEVICE_DEFAULT);
    if (!s.ok()) {
        return s;
    }

Y
yudong.cai 已提交
349 350 351
    return Status::OK();
}

Y
yudong.cai 已提交
352
void
S
starlord 已提交
353
Config::PrintConfigSection(const std::string& config_node_name) {
Y
yudong.cai 已提交
354 355 356
    std::cout << std::endl;
    std::cout << config_node_name << ":" << std::endl;
    if (config_map_.find(config_node_name) != config_map_.end()) {
S
starlord 已提交
357
        for (auto item : config_map_[config_node_name]) {
Y
yudong.cai 已提交
358 359
            std::cout << item.first << ": " << item.second << std::endl;
        }
Z
zhiru 已提交
360 361 362
    }
}

Y
yudong.cai 已提交
363 364 365 366 367 368 369 370 371 372 373
void
Config::PrintAll() {
    PrintConfigSection(CONFIG_SERVER);
    PrintConfigSection(CONFIG_DB);
    PrintConfigSection(CONFIG_CACHE);
    PrintConfigSection(CONFIG_METRIC);
    PrintConfigSection(CONFIG_ENGINE);
    PrintConfigSection(CONFIG_RESOURCE);
}

////////////////////////////////////////////////////////////////////////////////
S
starlord 已提交
374
Status
S
starlord 已提交
375
Config::CheckServerConfigAddress(const std::string& value) {
Y
yudong.cai 已提交
376
    if (!ValidationUtil::ValidateIpAddress(value).ok()) {
S
starlord 已提交
377 378
        std::string msg =
            "Invalid server IP address: " + value + ". Possible reason: server_config.address is invalid.";
379
        return Status(SERVER_INVALID_ARGUMENT, msg);
Z
zhiru 已提交
380
    }
Y
yudong.cai 已提交
381 382
    return Status::OK();
}
Z
zhiru 已提交
383

Y
yudong.cai 已提交
384
Status
S
starlord 已提交
385
Config::CheckServerConfigPort(const std::string& value) {
Y
yudong.cai 已提交
386
    if (!ValidationUtil::ValidateStringIsNumber(value).ok()) {
S
starlord 已提交
387
        std::string msg = "Invalid server port: " + value + ". Possible reason: server_config.port is not a number.";
388
        return Status(SERVER_INVALID_ARGUMENT, msg);
389
    } else {
Y
yudong.cai 已提交
390
        int32_t port = std::stoi(value);
391
        if (!(port > 1024 && port < 65535)) {
S
starlord 已提交
392 393
            std::string msg = "Invalid server port: " + value +
                              ". Possible reason: server_config.port is not in range [1025, 65534].";
394
            return Status(SERVER_INVALID_ARGUMENT, msg);
Z
zhiru 已提交
395 396
        }
    }
Y
yudong.cai 已提交
397 398
    return Status::OK();
}
Z
zhiru 已提交
399

Y
yudong.cai 已提交
400
Status
S
starlord 已提交
401 402
Config::CheckServerConfigDeployMode(const std::string& value) {
    if (value != "single" && value != "cluster_readonly" && value != "cluster_writable") {
Y
yudong.cai 已提交
403
        return Status(SERVER_INVALID_ARGUMENT,
S
starlord 已提交
404
                      "server_config.deploy_mode is not one of "
405
                      "single, cluster_readonly, and cluster_writable.");
406
    }
Y
yudong.cai 已提交
407 408
    return Status::OK();
}
409

Y
yudong.cai 已提交
410
Status
S
starlord 已提交
411
Config::CheckServerConfigTimeZone(const std::string& value) {
Y
yudong.cai 已提交
412
    if (value.length() <= 3) {
S
starlord 已提交
413
        return Status(SERVER_INVALID_ARGUMENT, "Invalid server_config.time_zone: " + value);
414
    } else {
Y
yudong.cai 已提交
415
        if (value.substr(0, 3) != "UTC") {
S
starlord 已提交
416
            return Status(SERVER_INVALID_ARGUMENT, "Invalid server_config.time_zone: " + value);
417 418
        } else {
            try {
Y
yudong.cai 已提交
419
                stoi(value.substr(3));
420
            } catch (...) {
S
starlord 已提交
421
                return Status(SERVER_INVALID_ARGUMENT, "Invalid server_config.time_zone: " + value);
422
            }
423 424
        }
    }
Y
yudong.cai 已提交
425
    return Status::OK();
Z
zhiru 已提交
426 427
}

S
starlord 已提交
428
Status
S
starlord 已提交
429
Config::CheckDBConfigPrimaryPath(const std::string& value) {
Y
yudong.cai 已提交
430
    if (value.empty()) {
S
starlord 已提交
431
        return Status(SERVER_INVALID_ARGUMENT, "db_config.db_path is empty.");
Z
zhiru 已提交
432
    }
Y
yudong.cai 已提交
433 434
    return Status::OK();
}
Z
zhiru 已提交
435

Y
yudong.cai 已提交
436
Status
S
starlord 已提交
437
Config::CheckDBConfigSecondaryPath(const std::string& value) {
Y
yudong.cai 已提交
438 439 440
    return Status::OK();
}

Y
yudong.cai 已提交
441
Status
S
starlord 已提交
442
Config::CheckDBConfigBackendUrl(const std::string& value) {
Y
yudong.cai 已提交
443
    if (!ValidationUtil::ValidateDbURI(value).ok()) {
444
        std::string msg =
S
starlord 已提交
445
            "Invalid backend url: " + value + ". Possible reason: db_config.db_backend_url is invalid. " +
446
            "The correct format should be like sqlite://:@:/ or mysql://root:123456@127.0.0.1:3306/milvus.";
447
        return Status(SERVER_INVALID_ARGUMENT, "invalid db_backend_url: " + value);
Z
zhiru 已提交
448
    }
Y
yudong.cai 已提交
449 450
    return Status::OK();
}
Z
zhiru 已提交
451

Y
yudong.cai 已提交
452
Status
S
starlord 已提交
453
Config::CheckDBConfigArchiveDiskThreshold(const std::string& value) {
Y
yudong.cai 已提交
454
    if (!ValidationUtil::ValidateStringIsNumber(value).ok()) {
455
        std::string msg = "Invalid archive disk threshold: " + value +
S
starlord 已提交
456
                          ". Possible reason: db_config.archive_disk_threshold is invalid.";
457
        return Status(SERVER_INVALID_ARGUMENT, msg);
Z
zhiru 已提交
458
    }
Y
yudong.cai 已提交
459 460
    return Status::OK();
}
Z
zhiru 已提交
461

Y
yudong.cai 已提交
462
Status
S
starlord 已提交
463
Config::CheckDBConfigArchiveDaysThreshold(const std::string& value) {
Y
yudong.cai 已提交
464
    if (!ValidationUtil::ValidateStringIsNumber(value).ok()) {
465
        std::string msg = "Invalid archive days threshold: " + value +
466
                          ". Possible reason: db_config.archive_days_threshold is invalid.";
467
        return Status(SERVER_INVALID_ARGUMENT, msg);
Z
zhiru 已提交
468
    }
Y
yudong.cai 已提交
469 470
    return Status::OK();
}
Z
zhiru 已提交
471

Y
yudong.cai 已提交
472
Status
S
starlord 已提交
473
Config::CheckDBConfigInsertBufferSize(const std::string& value) {
Y
yudong.cai 已提交
474
    if (!ValidationUtil::ValidateStringIsNumber(value).ok()) {
475
        std::string msg = "Invalid insert buffer size: " + value +
S
starlord 已提交
476
                          ". Possible reason: db_config.insert_buffer_size is not a positive integer.";
477
        return Status(SERVER_INVALID_ARGUMENT, msg);
478
    } else {
Y
yudong.cai 已提交
479
        int64_t buffer_size = std::stoi(value) * GB;
480 481
        if (buffer_size <= 0) {
            std::string msg = "Invalid insert buffer size: " + value +
S
starlord 已提交
482
                              ". Possible reason: db_config.insert_buffer_size is not a positive integer.";
483 484 485
            return Status(SERVER_INVALID_ARGUMENT, msg);
        }

S
starlord 已提交
486
        uint64_t total_mem = 0, free_mem = 0;
Z
zhiru 已提交
487
        CommonUtil::GetSystemMemInfo(total_mem, free_mem);
Y
yudong.cai 已提交
488
        if (buffer_size >= total_mem) {
S
starlord 已提交
489 490
            std::string msg = "Invalid insert buffer size: " + value +
                              ". Possible reason: db_config.insert_buffer_size exceeds system memory.";
491
            return Status(SERVER_INVALID_ARGUMENT, msg);
Z
zhiru 已提交
492 493
        }
    }
Y
yudong.cai 已提交
494 495
    return Status::OK();
}
Z
zhiru 已提交
496

S
starlord 已提交
497
Status
S
starlord 已提交
498
Config::CheckMetricConfigEnableMonitor(const std::string& value) {
Y
yudong.cai 已提交
499
    if (!ValidationUtil::ValidateStringIsBool(value).ok()) {
500
        std::string msg =
S
starlord 已提交
501
            "Invalid metric config: " + value + ". Possible reason: metric_config.enable_monitor is not a boolean.";
502
        return Status(SERVER_INVALID_ARGUMENT, msg);
Z
zhiru 已提交
503
    }
Y
yudong.cai 已提交
504 505
    return Status::OK();
}
Z
zhiru 已提交
506

Y
yudong.cai 已提交
507
Status
S
starlord 已提交
508
Config::CheckMetricConfigCollector(const std::string& value) {
Y
yudong.cai 已提交
509
    if (value != "prometheus") {
S
starlord 已提交
510 511
        std::string msg =
            "Invalid metric collector: " + value + ". Possible reason: metric_config.collector is invalid.";
512
        return Status(SERVER_INVALID_ARGUMENT, msg);
Y
yudong.cai 已提交
513 514 515 516
    }
    return Status::OK();
}

Y
yudong.cai 已提交
517
Status
S
starlord 已提交
518
Config::CheckMetricConfigPrometheusPort(const std::string& value) {
Y
yudong.cai 已提交
519
    if (!ValidationUtil::ValidateStringIsNumber(value).ok()) {
S
starlord 已提交
520 521
        std::string msg = "Invalid metric port: " + value +
                          ". Possible reason: metric_config.prometheus_config.port is not in range [1025, 65534].";
Y
yudong.cai 已提交
522
        return Status(SERVER_INVALID_ARGUMENT, "Invalid metric config prometheus_port: " + value);
Z
zhiru 已提交
523
    }
Y
yudong.cai 已提交
524
    return Status::OK();
Z
zhiru 已提交
525 526
}

S
starlord 已提交
527
Status
S
starlord 已提交
528
Config::CheckCacheConfigCpuCacheCapacity(const std::string& value) {
Y
yudong.cai 已提交
529
    if (!ValidationUtil::ValidateStringIsNumber(value).ok()) {
530
        std::string msg = "Invalid cpu cache capacity: " + value +
S
starlord 已提交
531
                          ". Possible reason: cache_config.cpu_cache_capacity is not a positive integer.";
532
        return Status(SERVER_INVALID_ARGUMENT, msg);
533
    } else {
534 535 536
        int64_t cpu_cache_capacity = std::stoi(value) * GB;
        if (cpu_cache_capacity <= 0) {
            std::string msg = "Invalid cpu cache capacity: " + value +
S
starlord 已提交
537
                              ". Possible reason: cache_config.cpu_cache_capacity is not a positive integer.";
538 539 540
            return Status(SERVER_INVALID_ARGUMENT, msg);
        }

S
starlord 已提交
541
        uint64_t total_mem = 0, free_mem = 0;
Z
zhiru 已提交
542
        CommonUtil::GetSystemMemInfo(total_mem, free_mem);
543 544
        if (static_cast<uint64_t>(cpu_cache_capacity) >= total_mem) {
            std::string msg = "Invalid cpu cache capacity: " + value +
S
starlord 已提交
545
                              ". Possible reason: cache_config.cpu_cache_capacity exceeds system memory.";
546
            return Status(SERVER_INVALID_ARGUMENT, msg);
547
        } else if (static_cast<double>(cpu_cache_capacity) > static_cast<double>(total_mem * 0.9)) {
548
            std::cerr << "WARNING: cpu cache capacity value is too big" << std::endl;
Z
zhiru 已提交
549
        }
550

Y
yudong.cai 已提交
551 552
        int32_t buffer_value;
        Status s = GetDBConfigInsertBufferSize(buffer_value);
S
starlord 已提交
553 554 555 556
        if (!s.ok()) {
            return s;
        }

Y
yudong.cai 已提交
557
        int64_t insert_buffer_size = buffer_value * GB;
Y
yudong.cai 已提交
558
        if (insert_buffer_size + cpu_cache_capacity >= total_mem) {
559
            std::string msg = "Invalid cpu cache capacity: " + value +
S
starlord 已提交
560
                              ". Possible reason: sum of cache_config.cpu_cache_capacity and "
561
                              "db_config.insert_buffer_size exceeds system memory.";
562
            return Status(SERVER_INVALID_ARGUMENT, msg);
Z
zhiru 已提交
563 564
        }
    }
Y
yudong.cai 已提交
565 566
    return Status::OK();
}
Z
zhiru 已提交
567

Y
yudong.cai 已提交
568
Status
S
starlord 已提交
569
Config::CheckCacheConfigCpuCacheThreshold(const std::string& value) {
Y
yudong.cai 已提交
570
    if (!ValidationUtil::ValidateStringIsFloat(value).ok()) {
571
        std::string msg = "Invalid cpu cache threshold: " + value +
S
starlord 已提交
572
                          ". Possible reason: cache_config.cpu_cache_threshold is not in range (0.0, 1.0].";
573
        return Status(SERVER_INVALID_ARGUMENT, msg);
Y
yudong.cai 已提交
574
    } else {
Y
yudong.cai 已提交
575 576
        float cpu_cache_threshold = std::stof(value);
        if (cpu_cache_threshold <= 0.0 || cpu_cache_threshold >= 1.0) {
577
            std::string msg = "Invalid cpu cache threshold: " + value +
S
starlord 已提交
578
                              ". Possible reason: cache_config.cpu_cache_threshold is not in range (0.0, 1.0].";
579
            return Status(SERVER_INVALID_ARGUMENT, msg);
Y
yudong.cai 已提交
580
        }
581
    }
Y
yudong.cai 已提交
582 583
    return Status::OK();
}
584

Y
yudong.cai 已提交
585
Status
S
starlord 已提交
586
Config::CheckCacheConfigGpuCacheCapacity(const std::string& value) {
Y
yudong.cai 已提交
587
    if (!ValidationUtil::ValidateStringIsNumber(value).ok()) {
588
        std::string msg = "Invalid gpu cache capacity: " + value +
S
starlord 已提交
589
                          ". Possible reason: cache_config.gpu_cache_capacity is not a positive integer.";
590
        return Status(SERVER_INVALID_ARGUMENT, msg);
591
    } else {
Y
yudong.cai 已提交
592 593
        uint64_t gpu_cache_capacity = std::stoi(value) * GB;
        int gpu_index;
594
        Status s = GetResourceConfigIndexBuildDevice(gpu_index);
S
starlord 已提交
595 596 597 598
        if (!s.ok()) {
            return s;
        }

Z
zhiru 已提交
599
        size_t gpu_memory;
S
starlord 已提交
600
        if (!ValidationUtil::GetGpuMemory(gpu_index, gpu_memory).ok()) {
601 602
            std::string msg = "Fail to get GPU memory for GPU device: " + std::to_string(gpu_index);
            return Status(SERVER_UNEXPECTED_ERROR, msg);
603
        } else if (gpu_cache_capacity >= gpu_memory) {
604
            std::string msg = "Invalid gpu cache capacity: " + value +
S
starlord 已提交
605
                              ". Possible reason: cache_config.gpu_cache_capacity exceeds GPU memory.";
606
            return Status(SERVER_INVALID_ARGUMENT, msg);
S
starlord 已提交
607
        } else if (gpu_cache_capacity > (double)gpu_memory * 0.9) {
608
            std::cerr << "Warning: gpu cache capacity value is too big" << std::endl;
Z
zhiru 已提交
609 610
        }
    }
Y
yudong.cai 已提交
611 612
    return Status::OK();
}
Z
zhiru 已提交
613

Y
yudong.cai 已提交
614
Status
S
starlord 已提交
615
Config::CheckCacheConfigGpuCacheThreshold(const std::string& value) {
Y
yudong.cai 已提交
616
    if (!ValidationUtil::ValidateStringIsFloat(value).ok()) {
617
        std::string msg = "Invalid gpu cache threshold: " + value +
S
starlord 已提交
618
                          ". Possible reason: cache_config.gpu_cache_threshold is not in range (0.0, 1.0].";
619
        return Status(SERVER_INVALID_ARGUMENT, msg);
Y
yudong.cai 已提交
620
    } else {
Y
yudong.cai 已提交
621 622
        float gpu_cache_threshold = std::stof(value);
        if (gpu_cache_threshold <= 0.0 || gpu_cache_threshold >= 1.0) {
623
            std::string msg = "Invalid gpu cache threshold: " + value +
S
starlord 已提交
624
                              ". Possible reason: cache_config.gpu_cache_threshold is not in range (0.0, 1.0].";
625
            return Status(SERVER_INVALID_ARGUMENT, msg);
Y
yudong.cai 已提交
626
        }
Z
zhiru 已提交
627
    }
Y
yudong.cai 已提交
628 629
    return Status::OK();
}
Z
zhiru 已提交
630

Y
yudong.cai 已提交
631
Status
S
starlord 已提交
632
Config::CheckCacheConfigCacheInsertData(const std::string& value) {
Y
yudong.cai 已提交
633
    if (!ValidationUtil::ValidateStringIsBool(value).ok()) {
634
        std::string msg = "Invalid cache insert data option: " + value +
S
starlord 已提交
635
                          ". Possible reason: cache_config.cache_insert_data is not a boolean.";
636
        return Status(SERVER_INVALID_ARGUMENT, msg);
Y
yudong.cai 已提交
637 638
    }
    return Status::OK();
Z
zhiru 已提交
639 640
}

S
starlord 已提交
641
Status
S
starlord 已提交
642
Config::CheckEngineConfigUseBlasThreshold(const std::string& value) {
Y
yudong.cai 已提交
643
    if (!ValidationUtil::ValidateStringIsNumber(value).ok()) {
644
        std::string msg = "Invalid use blas threshold: " + value +
S
starlord 已提交
645
                          ". Possible reason: engine_config.use_blas_threshold is not a positive integer.";
646
        return Status(SERVER_INVALID_ARGUMENT, msg);
Z
zhiru 已提交
647
    }
Y
yudong.cai 已提交
648 649
    return Status::OK();
}
Z
zhiru 已提交
650

Y
yudong.cai 已提交
651
Status
S
starlord 已提交
652
Config::CheckEngineConfigOmpThreadNum(const std::string& value) {
Y
yudong.cai 已提交
653
    if (!ValidationUtil::ValidateStringIsNumber(value).ok()) {
654
        std::string msg = "Invalid omp thread num: " + value +
S
starlord 已提交
655
                          ". Possible reason: engine_config.omp_thread_num is not a positive integer.";
656
        return Status(SERVER_INVALID_ARGUMENT, msg);
S
starlord 已提交
657 658 659 660 661 662
    }

    int32_t omp_thread = std::stoi(value);
    uint32_t sys_thread_cnt = 8;
    CommonUtil::GetSystemAvailableThreads(sys_thread_cnt);
    if (omp_thread > static_cast<int32_t>(sys_thread_cnt)) {
663
        std::string msg = "Invalid omp thread num: " + value +
S
starlord 已提交
664
                          ". Possible reason: engine_config.omp_thread_num exceeds system cpu cores.";
665
        return Status(SERVER_INVALID_ARGUMENT, msg);
Z
zhiru 已提交
666
    }
Y
yudong.cai 已提交
667
    return Status::OK();
Z
zhiru 已提交
668 669
}

W
wxyu 已提交
670
Status
671
Config::CheckEngineConfigGpuSearchThreshold(const std::string& value) {
W
wxyu 已提交
672
    if (!ValidationUtil::ValidateStringIsNumber(value).ok()) {
673 674
        std::string msg = "Invalid gpu search threshold: " + value +
                          ". Possible reason: engine_config.gpu_search_threshold is not a positive integer.";
W
wxyu 已提交
675 676 677 678 679
        return Status(SERVER_INVALID_ARGUMENT, msg);
    }
    return Status::OK();
}

S
starlord 已提交
680
Status
S
starlord 已提交
681
Config::CheckResourceConfigMode(const std::string& value) {
Y
yudong.cai 已提交
682
    if (value != "simple") {
S
starlord 已提交
683
        std::string msg = "Invalid resource mode: " + value + ". Possible reason: resource_config.mode is invalid.";
684
        return Status(SERVER_INVALID_ARGUMENT, msg);
W
wxyu 已提交
685
    }
Y
yudong.cai 已提交
686 687
    return Status::OK();
}
688

Y
yudong.cai 已提交
689
Status
690 691 692 693
CheckGpuDevice(const std::string& value) {
    const std::regex pat("gpu(\\d+)");
    std::cmatch m;
    if (!std::regex_match(value.c_str(), m, pat)) {
694
        std::string msg = "Invalid gpu device: " + value +
S
starlord 已提交
695
                          ". Possible reason: resource_config.search_resources does not match your hardware.";
696
        return Status(SERVER_INVALID_ARGUMENT, msg);
697 698 699 700
    }

    int32_t gpu_index = std::stoi(value.substr(3));
    if (!ValidationUtil::ValidateGpuIndex(gpu_index).ok()) {
701
        std::string msg = "Invalid gpu device: " + value +
S
starlord 已提交
702
                          ". Possible reason: resource_config.search_resources does not match your hardware.";
703
        return Status(SERVER_INVALID_ARGUMENT, msg);
704 705 706 707 708 709
    }
    return Status::OK();
}

Status
Config::CheckResourceConfigSearchResources(const std::vector<std::string>& value) {
Y
yudong.cai 已提交
710
    if (value.empty()) {
711 712 713
        std::string msg =
            "Invalid search resource. "
            "Possible reason: resource_config.search_resources is empty.";
714
        return Status(SERVER_INVALID_ARGUMENT, msg);
715 716
    }

717 718 719 720 721 722
    for (auto& device : value) {
        if (device == "cpu") {
            continue;
        }
        if (!CheckGpuDevice(device).ok()) {
            std::string msg = "Invalid search resource: " + device +
S
starlord 已提交
723
                              ". Possible reason: resource_config.search_resources does not match your hardware.";
724
            return Status(SERVER_INVALID_ARGUMENT, msg);
725 726 727 728 729 730 731
        }
    }
    return Status::OK();
}

Status
Config::CheckResourceConfigIndexBuildDevice(const std::string& value) {
732 733 734
    if (value == "cpu") {
        return Status::OK();
    }
735
    if (!CheckGpuDevice(value).ok()) {
736
        std::string msg = "Invalid index build device: " + value +
S
starlord 已提交
737
                          ". Possible reason: resource_config.index_build_device does not match your hardware.";
738
        return Status(SERVER_INVALID_ARGUMENT, msg);
G
groot 已提交
739
    }
Y
yudong.cai 已提交
740
    return Status::OK();
G
groot 已提交
741 742
}

Y
yudong.cai 已提交
743
////////////////////////////////////////////////////////////////////////////////
S
starlord 已提交
744 745
ConfigNode&
Config::GetConfigNode(const std::string& name) {
746
    ConfigMgr* mgr = YamlConfigMgr::GetInstance();
S
starlord 已提交
747
    ConfigNode& root_node = mgr->GetRootNode();
G
groot 已提交
748
    return root_node.GetChild(name);
G
groot 已提交
749 750
}

Y
yudong.cai 已提交
751
Status
S
starlord 已提交
752
Config::GetConfigValueInMem(const std::string& parent_key, const std::string& child_key, std::string& value) {
Y
yudong.cai 已提交
753
    std::lock_guard<std::mutex> lock(mutex_);
Y
yudong.cai 已提交
754 755 756 757 758
    if (config_map_.find(parent_key) != config_map_.end() &&
        config_map_[parent_key].find(child_key) != config_map_[parent_key].end()) {
        value = config_map_[parent_key][child_key];
        return Status::OK();
    }
S
starlord 已提交
759
    return Status(SERVER_UNEXPECTED_ERROR, "key not exist");
Y
yudong.cai 已提交
760 761
}

Y
yudong.cai 已提交
762
void
S
starlord 已提交
763
Config::SetConfigValueInMem(const std::string& parent_key, const std::string& child_key, const std::string& value) {
Y
yudong.cai 已提交
764 765 766 767 768
    std::lock_guard<std::mutex> lock(mutex_);
    config_map_[parent_key][child_key] = value;
}

////////////////////////////////////////////////////////////////////////////////
Y
yudong.cai 已提交
769
std::string
S
starlord 已提交
770
Config::GetConfigStr(const std::string& parent_key, const std::string& child_key, const std::string& default_value) {
Y
yudong.cai 已提交
771
    std::string value;
S
starlord 已提交
772 773 774
    if (!GetConfigValueInMem(parent_key, child_key, value).ok()) {
        value = GetConfigNode(parent_key).GetValue(child_key, default_value);
        SetConfigValueInMem(parent_key, child_key, value);
Y
yudong.cai 已提交
775
    }
Y
yudong.cai 已提交
776
    return value;
Y
yudong.cai 已提交
777 778
}

779
Status
S
starlord 已提交
780
Config::GetServerConfigAddress(std::string& value) {
S
starlord 已提交
781
    value = GetConfigStr(CONFIG_SERVER, CONFIG_SERVER_ADDRESS, CONFIG_SERVER_ADDRESS_DEFAULT);
Y
yudong.cai 已提交
782
    return CheckServerConfigAddress(value);
783 784 785
}

Status
S
starlord 已提交
786
Config::GetServerConfigPort(std::string& value) {
S
starlord 已提交
787
    value = GetConfigStr(CONFIG_SERVER, CONFIG_SERVER_PORT, CONFIG_SERVER_PORT_DEFAULT);
Y
yudong.cai 已提交
788
    return CheckServerConfigPort(value);
789 790 791
}

Status
S
starlord 已提交
792
Config::GetServerConfigDeployMode(std::string& value) {
S
starlord 已提交
793
    value = GetConfigStr(CONFIG_SERVER, CONFIG_SERVER_DEPLOY_MODE, CONFIG_SERVER_DEPLOY_MODE_DEFAULT);
Y
yudong.cai 已提交
794
    return CheckServerConfigDeployMode(value);
795 796 797
}

Status
S
starlord 已提交
798
Config::GetServerConfigTimeZone(std::string& value) {
S
starlord 已提交
799
    value = GetConfigStr(CONFIG_SERVER, CONFIG_SERVER_TIME_ZONE, CONFIG_SERVER_TIME_ZONE_DEFAULT);
Y
yudong.cai 已提交
800
    return CheckServerConfigTimeZone(value);
801 802 803
}

Status
S
starlord 已提交
804
Config::GetDBConfigPrimaryPath(std::string& value) {
S
starlord 已提交
805
    value = GetConfigStr(CONFIG_DB, CONFIG_DB_PRIMARY_PATH, CONFIG_DB_PRIMARY_PATH_DEFAULT);
Y
yudong.cai 已提交
806
    return CheckDBConfigPrimaryPath(value);
807 808 809
}

Status
S
starlord 已提交
810
Config::GetDBConfigSecondaryPath(std::string& value) {
S
starlord 已提交
811
    value = GetConfigStr(CONFIG_DB, CONFIG_DB_SECONDARY_PATH, CONFIG_DB_SECONDARY_PATH_DEFAULT);
Y
yudong.cai 已提交
812
    return Status::OK();
813 814 815
}

Status
S
starlord 已提交
816
Config::GetDBConfigBackendUrl(std::string& value) {
S
starlord 已提交
817
    value = GetConfigStr(CONFIG_DB, CONFIG_DB_BACKEND_URL, CONFIG_DB_BACKEND_URL_DEFAULT);
Y
yudong.cai 已提交
818
    return CheckDBConfigBackendUrl(value);
819 820 821
}

Status
S
starlord 已提交
822
Config::GetDBConfigArchiveDiskThreshold(int32_t& value) {
S
starlord 已提交
823 824
    std::string str =
        GetConfigStr(CONFIG_DB, CONFIG_DB_ARCHIVE_DISK_THRESHOLD, CONFIG_DB_ARCHIVE_DISK_THRESHOLD_DEFAULT);
Y
yudong.cai 已提交
825
    Status s = CheckDBConfigArchiveDiskThreshold(str);
S
starlord 已提交
826 827 828 829
    if (!s.ok()) {
        return s;
    }

830 831 832 833 834
    value = std::stoi(str);
    return Status::OK();
}

Status
S
starlord 已提交
835
Config::GetDBConfigArchiveDaysThreshold(int32_t& value) {
S
starlord 已提交
836 837
    std::string str =
        GetConfigStr(CONFIG_DB, CONFIG_DB_ARCHIVE_DAYS_THRESHOLD, CONFIG_DB_ARCHIVE_DAYS_THRESHOLD_DEFAULT);
Y
yudong.cai 已提交
838
    Status s = CheckDBConfigArchiveDaysThreshold(str);
S
starlord 已提交
839 840 841 842
    if (!s.ok()) {
        return s;
    }

843 844 845 846 847
    value = std::stoi(str);
    return Status::OK();
}

Status
S
starlord 已提交
848
Config::GetDBConfigInsertBufferSize(int32_t& value) {
849
    std::string str = GetConfigStr(CONFIG_DB, CONFIG_DB_INSERT_BUFFER_SIZE, CONFIG_DB_INSERT_BUFFER_SIZE_DEFAULT);
Y
yudong.cai 已提交
850
    Status s = CheckDBConfigInsertBufferSize(str);
S
starlord 已提交
851 852 853 854
    if (!s.ok()) {
        return s;
    }

855 856 857 858
    value = std::stoi(str);
    return Status::OK();
}

S
starlord 已提交
859 860
Status
Config::GetDBConfigPreloadTable(std::string& value) {
S
starlord 已提交
861
    value = GetConfigStr(CONFIG_DB, CONFIG_DB_PRELOAD_TABLE);
S
starlord 已提交
862 863 864
    return Status::OK();
}

865
Status
S
starlord 已提交
866
Config::GetMetricConfigEnableMonitor(bool& value) {
867
    std::string str = GetConfigStr(CONFIG_METRIC, CONFIG_METRIC_ENABLE_MONITOR, CONFIG_METRIC_ENABLE_MONITOR_DEFAULT);
Y
yudong.cai 已提交
868
    Status s = CheckMetricConfigEnableMonitor(str);
S
starlord 已提交
869 870 871 872
    if (!s.ok()) {
        return s;
    }

873 874 875 876 877 878
    std::transform(str.begin(), str.end(), str.begin(), ::tolower);
    value = (str == "true" || str == "on" || str == "yes" || str == "1");
    return Status::OK();
}

Status
S
starlord 已提交
879
Config::GetMetricConfigCollector(std::string& value) {
S
starlord 已提交
880
    value = GetConfigStr(CONFIG_METRIC, CONFIG_METRIC_COLLECTOR, CONFIG_METRIC_COLLECTOR_DEFAULT);
Y
yudong.cai 已提交
881
    return Status::OK();
882 883 884
}

Status
S
starlord 已提交
885
Config::GetMetricConfigPrometheusPort(std::string& value) {
S
starlord 已提交
886
    value = GetConfigStr(CONFIG_METRIC, CONFIG_METRIC_PROMETHEUS_PORT, CONFIG_METRIC_PROMETHEUS_PORT_DEFAULT);
Y
yudong.cai 已提交
887
    return CheckMetricConfigPrometheusPort(value);
888 889 890
}

Status
W
wxyu 已提交
891
Config::GetCacheConfigCpuCacheCapacity(int64_t& value) {
S
starlord 已提交
892 893
    std::string str =
        GetConfigStr(CONFIG_CACHE, CONFIG_CACHE_CPU_CACHE_CAPACITY, CONFIG_CACHE_CPU_CACHE_CAPACITY_DEFAULT);
Y
yudong.cai 已提交
894
    Status s = CheckCacheConfigCpuCacheCapacity(str);
S
starlord 已提交
895 896 897 898
    if (!s.ok()) {
        return s;
    }

899 900 901 902 903
    value = std::stoi(str);
    return Status::OK();
}

Status
S
starlord 已提交
904
Config::GetCacheConfigCpuCacheThreshold(float& value) {
S
starlord 已提交
905 906
    std::string str =
        GetConfigStr(CONFIG_CACHE, CONFIG_CACHE_CPU_CACHE_THRESHOLD, CONFIG_CACHE_CPU_CACHE_THRESHOLD_DEFAULT);
Y
yudong.cai 已提交
907
    Status s = CheckCacheConfigCpuCacheThreshold(str);
S
starlord 已提交
908 909 910 911
    if (!s.ok()) {
        return s;
    }

912 913 914 915 916
    value = std::stof(str);
    return Status::OK();
}

Status
W
wxyu 已提交
917
Config::GetCacheConfigGpuCacheCapacity(int64_t& value) {
S
starlord 已提交
918 919
    std::string str =
        GetConfigStr(CONFIG_CACHE, CONFIG_CACHE_GPU_CACHE_CAPACITY, CONFIG_CACHE_GPU_CACHE_CAPACITY_DEFAULT);
Y
yudong.cai 已提交
920
    Status s = CheckCacheConfigGpuCacheCapacity(str);
S
starlord 已提交
921 922 923 924
    if (!s.ok()) {
        return s;
    }

925 926 927 928 929
    value = std::stoi(str);
    return Status::OK();
}

Status
S
starlord 已提交
930
Config::GetCacheConfigGpuCacheThreshold(float& value) {
S
starlord 已提交
931 932
    std::string str =
        GetConfigStr(CONFIG_CACHE, CONFIG_CACHE_GPU_CACHE_THRESHOLD, CONFIG_CACHE_GPU_CACHE_THRESHOLD_DEFAULT);
Y
yudong.cai 已提交
933
    Status s = CheckCacheConfigGpuCacheThreshold(str);
S
starlord 已提交
934 935 936 937
    if (!s.ok()) {
        return s;
    }

938 939 940 941 942
    value = std::stof(str);
    return Status::OK();
}

Status
S
starlord 已提交
943
Config::GetCacheConfigCacheInsertData(bool& value) {
S
starlord 已提交
944 945
    std::string str =
        GetConfigStr(CONFIG_CACHE, CONFIG_CACHE_CACHE_INSERT_DATA, CONFIG_CACHE_CACHE_INSERT_DATA_DEFAULT);
Y
yudong.cai 已提交
946
    Status s = CheckCacheConfigCacheInsertData(str);
S
starlord 已提交
947 948 949 950
    if (!s.ok()) {
        return s;
    }

951 952 953 954 955 956
    std::transform(str.begin(), str.end(), str.begin(), ::tolower);
    value = (str == "true" || str == "on" || str == "yes" || str == "1");
    return Status::OK();
}

Status
S
starlord 已提交
957
Config::GetEngineConfigUseBlasThreshold(int32_t& value) {
S
starlord 已提交
958 959
    std::string str =
        GetConfigStr(CONFIG_ENGINE, CONFIG_ENGINE_USE_BLAS_THRESHOLD, CONFIG_ENGINE_USE_BLAS_THRESHOLD_DEFAULT);
Y
yudong.cai 已提交
960
    Status s = CheckEngineConfigUseBlasThreshold(str);
S
starlord 已提交
961 962 963 964
    if (!s.ok()) {
        return s;
    }

965 966 967 968 969
    value = std::stoi(str);
    return Status::OK();
}

Status
S
starlord 已提交
970
Config::GetEngineConfigOmpThreadNum(int32_t& value) {
971
    std::string str = GetConfigStr(CONFIG_ENGINE, CONFIG_ENGINE_OMP_THREAD_NUM, CONFIG_ENGINE_OMP_THREAD_NUM_DEFAULT);
Y
yudong.cai 已提交
972
    Status s = CheckEngineConfigOmpThreadNum(str);
S
starlord 已提交
973 974 975 976
    if (!s.ok()) {
        return s;
    }

977 978 979 980
    value = std::stoi(str);
    return Status::OK();
}

W
wxyu 已提交
981
Status
982
Config::GetEngineConfigGpuSearchThreshold(int32_t& value) {
W
wxyu 已提交
983
    std::string str =
984 985
        GetConfigStr(CONFIG_ENGINE, CONFIG_ENGINE_GPU_SEARCH_THRESHOLD, CONFIG_ENGINE_GPU_SEARCH_THRESHOLD_DEFAULT);
    Status s = CheckEngineConfigGpuSearchThreshold(str);
W
wxyu 已提交
986 987 988 989 990 991 992 993
    if (!s.ok()) {
        return s;
    }

    value = std::stoi(str);
    return Status::OK();
}

994
Status
S
starlord 已提交
995
Config::GetResourceConfigMode(std::string& value) {
S
starlord 已提交
996
    value = GetConfigStr(CONFIG_RESOURCE, CONFIG_RESOURCE_MODE, CONFIG_RESOURCE_MODE_DEFAULT);
Y
yudong.cai 已提交
997
    return CheckResourceConfigMode(value);
998 999 1000
}

Status
1001
Config::GetResourceConfigSearchResources(std::vector<std::string>& value) {
1002
    ConfigNode resource_config = GetConfigNode(CONFIG_RESOURCE);
1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017
    value = resource_config.GetSequence(CONFIG_RESOURCE_SEARCH_RESOURCES);
    return CheckResourceConfigSearchResources(value);
}

Status
Config::GetResourceConfigIndexBuildDevice(int32_t& value) {
    std::string str =
        GetConfigStr(CONFIG_RESOURCE, CONFIG_RESOURCE_INDEX_BUILD_DEVICE, CONFIG_RESOURCE_INDEX_BUILD_DEVICE_DEFAULT);
    Status s = CheckResourceConfigIndexBuildDevice(str);
    if (!s.ok()) {
        return s;
    }

    value = std::stoi(str.substr(3));
    return Status::OK();
Y
yudong.cai 已提交
1018
}
G
groot 已提交
1019

Y
yudong.cai 已提交
1020 1021 1022
///////////////////////////////////////////////////////////////////////////////
/* server config */
Status
S
starlord 已提交
1023
Config::SetServerConfigAddress(const std::string& value) {
Y
yudong.cai 已提交
1024
    Status s = CheckServerConfigAddress(value);
S
starlord 已提交
1025 1026 1027 1028
    if (!s.ok()) {
        return s;
    }

Y
yudong.cai 已提交
1029 1030 1031 1032 1033
    SetConfigValueInMem(CONFIG_SERVER, CONFIG_SERVER_ADDRESS, value);
    return Status::OK();
}

Status
S
starlord 已提交
1034
Config::SetServerConfigPort(const std::string& value) {
Y
yudong.cai 已提交
1035
    Status s = CheckServerConfigPort(value);
S
starlord 已提交
1036 1037 1038 1039
    if (!s.ok()) {
        return s;
    }

Y
yudong.cai 已提交
1040 1041 1042 1043 1044
    SetConfigValueInMem(CONFIG_SERVER, CONFIG_SERVER_PORT, value);
    return Status::OK();
}

Status
S
starlord 已提交
1045
Config::SetServerConfigDeployMode(const std::string& value) {
Y
yudong.cai 已提交
1046
    Status s = CheckServerConfigDeployMode(value);
S
starlord 已提交
1047 1048 1049 1050
    if (!s.ok()) {
        return s;
    }

Y
yudong.cai 已提交
1051
    SetConfigValueInMem(CONFIG_SERVER, CONFIG_SERVER_DEPLOY_MODE, value);
Y
yudong.cai 已提交
1052 1053 1054 1055
    return Status::OK();
}

Status
S
starlord 已提交
1056
Config::SetServerConfigTimeZone(const std::string& value) {
Y
yudong.cai 已提交
1057
    Status s = CheckServerConfigTimeZone(value);
S
starlord 已提交
1058 1059 1060 1061
    if (!s.ok()) {
        return s;
    }

Y
yudong.cai 已提交
1062 1063 1064 1065 1066 1067
    SetConfigValueInMem(CONFIG_SERVER, CONFIG_SERVER_TIME_ZONE, value);
    return Status::OK();
}

/* db config */
Status
S
starlord 已提交
1068
Config::SetDBConfigPrimaryPath(const std::string& value) {
Y
yudong.cai 已提交
1069
    Status s = CheckDBConfigPrimaryPath(value);
S
starlord 已提交
1070 1071 1072 1073
    if (!s.ok()) {
        return s;
    }

Y
yudong.cai 已提交
1074
    SetConfigValueInMem(CONFIG_DB, CONFIG_DB_PRIMARY_PATH, value);
Y
yudong.cai 已提交
1075 1076 1077 1078
    return Status::OK();
}

Status
S
starlord 已提交
1079
Config::SetDBConfigSecondaryPath(const std::string& value) {
Y
yudong.cai 已提交
1080
    Status s = CheckDBConfigSecondaryPath(value);
S
starlord 已提交
1081 1082 1083 1084
    if (!s.ok()) {
        return s;
    }

Y
yudong.cai 已提交
1085
    SetConfigValueInMem(CONFIG_DB, CONFIG_DB_SECONDARY_PATH, value);
Y
yudong.cai 已提交
1086 1087 1088 1089
    return Status::OK();
}

Status
S
starlord 已提交
1090
Config::SetDBConfigBackendUrl(const std::string& value) {
Y
yudong.cai 已提交
1091
    Status s = CheckDBConfigBackendUrl(value);
S
starlord 已提交
1092 1093 1094 1095
    if (!s.ok()) {
        return s;
    }

Y
yudong.cai 已提交
1096 1097 1098 1099 1100
    SetConfigValueInMem(CONFIG_DB, CONFIG_DB_BACKEND_URL, value);
    return Status::OK();
}

Status
S
starlord 已提交
1101
Config::SetDBConfigArchiveDiskThreshold(const std::string& value) {
Y
yudong.cai 已提交
1102
    Status s = CheckDBConfigArchiveDiskThreshold(value);
S
starlord 已提交
1103 1104 1105 1106
    if (!s.ok()) {
        return s;
    }

Y
yudong.cai 已提交
1107 1108 1109 1110 1111
    SetConfigValueInMem(CONFIG_DB, CONFIG_DB_ARCHIVE_DISK_THRESHOLD, value);
    return Status::OK();
}

Status
S
starlord 已提交
1112
Config::SetDBConfigArchiveDaysThreshold(const std::string& value) {
Y
yudong.cai 已提交
1113
    Status s = CheckDBConfigArchiveDaysThreshold(value);
S
starlord 已提交
1114 1115 1116 1117
    if (!s.ok()) {
        return s;
    }

Y
yudong.cai 已提交
1118 1119 1120 1121 1122
    SetConfigValueInMem(CONFIG_DB, CONFIG_DB_ARCHIVE_DAYS_THRESHOLD, value);
    return Status::OK();
}

Status
S
starlord 已提交
1123
Config::SetDBConfigInsertBufferSize(const std::string& value) {
Y
yudong.cai 已提交
1124
    Status s = CheckDBConfigInsertBufferSize(value);
S
starlord 已提交
1125 1126 1127 1128
    if (!s.ok()) {
        return s;
    }

Y
yudong.cai 已提交
1129
    SetConfigValueInMem(CONFIG_DB, CONFIG_DB_INSERT_BUFFER_SIZE, value);
Y
yudong.cai 已提交
1130 1131 1132 1133 1134
    return Status::OK();
}

/* metric config */
Status
S
starlord 已提交
1135
Config::SetMetricConfigEnableMonitor(const std::string& value) {
Y
yudong.cai 已提交
1136
    Status s = CheckMetricConfigEnableMonitor(value);
S
starlord 已提交
1137 1138 1139 1140
    if (!s.ok()) {
        return s;
    }

Y
yudong.cai 已提交
1141
    SetConfigValueInMem(CONFIG_DB, CONFIG_METRIC_ENABLE_MONITOR, value);
Y
yudong.cai 已提交
1142 1143 1144 1145
    return Status::OK();
}

Status
S
starlord 已提交
1146
Config::SetMetricConfigCollector(const std::string& value) {
Y
yudong.cai 已提交
1147
    Status s = CheckMetricConfigCollector(value);
S
starlord 已提交
1148 1149 1150 1151
    if (!s.ok()) {
        return s;
    }

Y
yudong.cai 已提交
1152 1153 1154 1155 1156
    SetConfigValueInMem(CONFIG_DB, CONFIG_METRIC_COLLECTOR, value);
    return Status::OK();
}

Status
S
starlord 已提交
1157
Config::SetMetricConfigPrometheusPort(const std::string& value) {
Y
yudong.cai 已提交
1158
    Status s = CheckMetricConfigPrometheusPort(value);
S
starlord 已提交
1159 1160 1161 1162
    if (!s.ok()) {
        return s;
    }

Y
yudong.cai 已提交
1163 1164 1165 1166 1167 1168
    SetConfigValueInMem(CONFIG_DB, CONFIG_METRIC_PROMETHEUS_PORT, value);
    return Status::OK();
}

/* cache config */
Status
S
starlord 已提交
1169
Config::SetCacheConfigCpuCacheCapacity(const std::string& value) {
Y
yudong.cai 已提交
1170
    Status s = CheckCacheConfigCpuCacheCapacity(value);
S
starlord 已提交
1171 1172 1173 1174
    if (!s.ok()) {
        return s;
    }

Y
yudong.cai 已提交
1175
    SetConfigValueInMem(CONFIG_DB, CONFIG_CACHE_CPU_CACHE_CAPACITY, value);
Y
yudong.cai 已提交
1176 1177 1178 1179
    return Status::OK();
}

Status
S
starlord 已提交
1180
Config::SetCacheConfigCpuCacheThreshold(const std::string& value) {
Y
yudong.cai 已提交
1181
    Status s = CheckCacheConfigCpuCacheThreshold(value);
S
starlord 已提交
1182 1183 1184 1185
    if (!s.ok()) {
        return s;
    }

Y
yudong.cai 已提交
1186
    SetConfigValueInMem(CONFIG_DB, CONFIG_CACHE_CPU_CACHE_THRESHOLD, value);
Y
yudong.cai 已提交
1187 1188 1189 1190
    return Status::OK();
}

Status
S
starlord 已提交
1191
Config::SetCacheConfigGpuCacheCapacity(const std::string& value) {
Y
yudong.cai 已提交
1192
    Status s = CheckCacheConfigGpuCacheCapacity(value);
S
starlord 已提交
1193 1194 1195 1196
    if (!s.ok()) {
        return s;
    }

Y
yudong.cai 已提交
1197
    SetConfigValueInMem(CONFIG_DB, CONFIG_CACHE_GPU_CACHE_CAPACITY, value);
Y
yudong.cai 已提交
1198 1199 1200 1201
    return Status::OK();
}

Status
S
starlord 已提交
1202
Config::SetCacheConfigGpuCacheThreshold(const std::string& value) {
Y
yudong.cai 已提交
1203
    Status s = CheckCacheConfigGpuCacheThreshold(value);
S
starlord 已提交
1204 1205 1206 1207
    if (!s.ok()) {
        return s;
    }

Y
yudong.cai 已提交
1208
    SetConfigValueInMem(CONFIG_DB, CONFIG_CACHE_GPU_CACHE_THRESHOLD, value);
Y
yudong.cai 已提交
1209 1210 1211 1212
    return Status::OK();
}

Status
S
starlord 已提交
1213
Config::SetCacheConfigCacheInsertData(const std::string& value) {
Y
yudong.cai 已提交
1214
    Status s = CheckCacheConfigCacheInsertData(value);
S
starlord 已提交
1215 1216 1217 1218
    if (!s.ok()) {
        return s;
    }

Y
yudong.cai 已提交
1219 1220 1221 1222 1223 1224
    SetConfigValueInMem(CONFIG_DB, CONFIG_CACHE_CACHE_INSERT_DATA, value);
    return Status::OK();
}

/* engine config */
Status
S
starlord 已提交
1225
Config::SetEngineConfigUseBlasThreshold(const std::string& value) {
Y
yudong.cai 已提交
1226
    Status s = CheckEngineConfigUseBlasThreshold(value);
S
starlord 已提交
1227 1228 1229 1230
    if (!s.ok()) {
        return s;
    }

Y
yudong.cai 已提交
1231
    SetConfigValueInMem(CONFIG_DB, CONFIG_ENGINE_USE_BLAS_THRESHOLD, value);
Y
yudong.cai 已提交
1232 1233 1234 1235
    return Status::OK();
}

Status
S
starlord 已提交
1236
Config::SetEngineConfigOmpThreadNum(const std::string& value) {
Y
yudong.cai 已提交
1237
    Status s = CheckEngineConfigOmpThreadNum(value);
S
starlord 已提交
1238 1239 1240 1241
    if (!s.ok()) {
        return s;
    }

Y
yudong.cai 已提交
1242 1243 1244 1245
    SetConfigValueInMem(CONFIG_DB, CONFIG_ENGINE_OMP_THREAD_NUM, value);
    return Status::OK();
}

W
wxyu 已提交
1246
Status
1247 1248
Config::SetEngineConfigGpuSearchThreshold(const std::string& value) {
    Status s = CheckEngineConfigGpuSearchThreshold(value);
W
wxyu 已提交
1249 1250 1251 1252
    if (!s.ok()) {
        return s;
    }

1253
    SetConfigValueInMem(CONFIG_DB, CONFIG_ENGINE_GPU_SEARCH_THRESHOLD, value);
W
wxyu 已提交
1254 1255 1256
    return Status::OK();
}

Y
yudong.cai 已提交
1257 1258
/* resource config */
Status
S
starlord 已提交
1259
Config::SetResourceConfigMode(const std::string& value) {
Y
yudong.cai 已提交
1260
    Status s = CheckResourceConfigMode(value);
S
starlord 已提交
1261 1262 1263 1264
    if (!s.ok()) {
        return s;
    }

Y
yudong.cai 已提交
1265 1266 1267 1268
    SetConfigValueInMem(CONFIG_DB, CONFIG_RESOURCE_MODE, value);
    return Status::OK();
}

1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279
Status
Config::SetResourceConfigIndexBuildDevice(const std::string& value) {
    Status s = CheckResourceConfigIndexBuildDevice(value);
    if (!s.ok()) {
        return s;
    }

    SetConfigValueInMem(CONFIG_DB, CONFIG_RESOURCE_INDEX_BUILD_DEVICE, value);
    return Status::OK();
}

S
starlord 已提交
1280 1281
}  // namespace server
}  // namespace milvus