Config.cpp 96.2 KB
Newer Older
1
// Copyright (C) 2019-2020 Zilliz. All rights reserved.
J
jinhai 已提交
2
//
3 4
// Licensed 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
J
jinhai 已提交
5
//
6 7 8 9 10
// 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.
J
jinhai 已提交
11

G
groot 已提交
12
#include <sys/stat.h>
13
#include <unistd.h>
T
Tinkerrr 已提交
14

Y
yudong.cai 已提交
15
#include <algorithm>
16
#include <chrono>
17
#include <fstream>
S
starlord 已提交
18
#include <iostream>
19
#include <regex>
S
starlord 已提交
20
#include <string>
21
#include <thread>
22
#include <unordered_map>
B
BossZou 已提交
23
#include <unordered_set>
S
starlord 已提交
24
#include <vector>
G
groot 已提交
25

26 27
#include <fiu-local.h>

28
#include "config/Config.h"
29
#include "config/YamlConfigMgr.h"
30
#include "server/DBWrapper.h"
31
#include "thirdparty/nlohmann/json.hpp"
32
#include "utils/CommonUtil.h"
33
#include "utils/Log.h"
Z
Zhiru Zhu 已提交
34
#include "utils/StringHelpFunctions.h"
35
#include "utils/ValidationUtil.h"
G
groot 已提交
36

J
jinhai 已提交
37
namespace milvus {
G
groot 已提交
38 39
namespace server {

40 41 42 43 44 45 46 47 48 49 50 51 52
const char* CONFIG_NODE_DELIMITER = ".";
const char* CONFIG_VERSION = "version";

/* server config */
const char* CONFIG_SERVER = "server_config";
const char* CONFIG_SERVER_ADDRESS = "address";
const char* CONFIG_SERVER_ADDRESS_DEFAULT = "127.0.0.1";
const char* CONFIG_SERVER_PORT = "port";
const char* CONFIG_SERVER_PORT_DEFAULT = "19530";
const char* CONFIG_SERVER_DEPLOY_MODE = "deploy_mode";
const char* CONFIG_SERVER_DEPLOY_MODE_DEFAULT = "single";
const char* CONFIG_SERVER_TIME_ZONE = "time_zone";
const char* CONFIG_SERVER_TIME_ZONE_DEFAULT = "UTC+8";
53 54
const char* CONFIG_SERVER_WEB_ENABLE = "web_enable";
const char* CONFIG_SERVER_WEB_ENABLE_DEFAULT = "true";
55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108
const char* CONFIG_SERVER_WEB_PORT = "web_port";
const char* CONFIG_SERVER_WEB_PORT_DEFAULT = "19121";

/* db config */
const char* CONFIG_DB = "db_config";
const char* CONFIG_DB_BACKEND_URL = "backend_url";
const char* CONFIG_DB_BACKEND_URL_DEFAULT = "sqlite://:@:/";
const char* CONFIG_DB_ARCHIVE_DISK_THRESHOLD = "archive_disk_threshold";
const char* CONFIG_DB_ARCHIVE_DISK_THRESHOLD_DEFAULT = "0";
const char* CONFIG_DB_ARCHIVE_DAYS_THRESHOLD = "archive_days_threshold";
const char* CONFIG_DB_ARCHIVE_DAYS_THRESHOLD_DEFAULT = "0";
const char* CONFIG_DB_PRELOAD_COLLECTION = "preload_collection";
const char* CONFIG_DB_PRELOAD_COLLECTION_DEFAULT = "";
const char* CONFIG_DB_AUTO_FLUSH_INTERVAL = "auto_flush_interval";
const char* CONFIG_DB_AUTO_FLUSH_INTERVAL_DEFAULT = "1";

/* storage config */
const char* CONFIG_STORAGE = "storage_config";
const char* CONFIG_STORAGE_PRIMARY_PATH = "primary_path";
const char* CONFIG_STORAGE_PRIMARY_PATH_DEFAULT = "/tmp/milvus";
const char* CONFIG_STORAGE_SECONDARY_PATH = "secondary_path";
const char* CONFIG_STORAGE_SECONDARY_PATH_DEFAULT = "";
const char* CONFIG_STORAGE_S3_ENABLE = "s3_enable";
const char* CONFIG_STORAGE_S3_ENABLE_DEFAULT = "false";
const char* CONFIG_STORAGE_S3_ADDRESS = "s3_address";
const char* CONFIG_STORAGE_S3_ADDRESS_DEFAULT = "127.0.0.1";
const char* CONFIG_STORAGE_S3_PORT = "s3_port";
const char* CONFIG_STORAGE_S3_PORT_DEFAULT = "9000";
const char* CONFIG_STORAGE_S3_ACCESS_KEY = "s3_access_key";
const char* CONFIG_STORAGE_S3_ACCESS_KEY_DEFAULT = "minioadmin";
const char* CONFIG_STORAGE_S3_SECRET_KEY = "s3_secret_key";
const char* CONFIG_STORAGE_S3_SECRET_KEY_DEFAULT = "minioadmin";
const char* CONFIG_STORAGE_S3_BUCKET = "s3_bucket";
const char* CONFIG_STORAGE_S3_BUCKET_DEFAULT = "milvus-bucket";

/* cache config */
const char* CONFIG_CACHE = "cache_config";
const char* CONFIG_CACHE_CPU_CACHE_CAPACITY = "cpu_cache_capacity";
const char* CONFIG_CACHE_CPU_CACHE_CAPACITY_DEFAULT = "4";
const char* CONFIG_CACHE_CPU_CACHE_THRESHOLD = "cpu_cache_threshold";
const char* CONFIG_CACHE_CPU_CACHE_THRESHOLD_DEFAULT = "0.7";
const char* CONFIG_CACHE_INSERT_BUFFER_SIZE = "insert_buffer_size";
const char* CONFIG_CACHE_INSERT_BUFFER_SIZE_DEFAULT = "1";
const char* CONFIG_CACHE_CACHE_INSERT_DATA = "cache_insert_data";
const char* CONFIG_CACHE_CACHE_INSERT_DATA_DEFAULT = "false";

/* metric config */
const char* CONFIG_METRIC = "metric_config";
const char* CONFIG_METRIC_ENABLE_MONITOR = "enable_monitor";
const char* CONFIG_METRIC_ENABLE_MONITOR_DEFAULT = "false";
const char* CONFIG_METRIC_ADDRESS = "address";
const char* CONFIG_METRIC_ADDRESS_DEFAULT = "127.0.0.1";
const char* CONFIG_METRIC_PORT = "port";
const char* CONFIG_METRIC_PORT_DEFAULT = "9091";
109

110 111 112 113 114 115
/* engine config */
const char* CONFIG_ENGINE = "engine_config";
const char* CONFIG_ENGINE_USE_BLAS_THRESHOLD = "use_blas_threshold";
const char* CONFIG_ENGINE_USE_BLAS_THRESHOLD_DEFAULT = "1100";
const char* CONFIG_ENGINE_OMP_THREAD_NUM = "omp_thread_num";
const char* CONFIG_ENGINE_OMP_THREAD_NUM_DEFAULT = "0";
F
feisiyicl 已提交
116 117
const char* CONFIG_ENGINE_SIMD_TYPE = "simd_type";
const char* CONFIG_ENGINE_SIMD_TYPE_DEFAULT = "auto";
118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155
const char* CONFIG_ENGINE_GPU_SEARCH_THRESHOLD = "gpu_search_threshold";
const char* CONFIG_ENGINE_GPU_SEARCH_THRESHOLD_DEFAULT = "1000";

/* gpu resource config */
const char* CONFIG_GPU_RESOURCE = "gpu_resource_config";
const char* CONFIG_GPU_RESOURCE_ENABLE = "enable";
#ifdef MILVUS_GPU_VERSION
const char* CONFIG_GPU_RESOURCE_ENABLE_DEFAULT = "true";
#else
const char* CONFIG_GPU_RESOURCE_ENABLE_DEFAULT = "false";
#endif
const char* CONFIG_GPU_RESOURCE_CACHE_CAPACITY = "cache_capacity";
const char* CONFIG_GPU_RESOURCE_CACHE_CAPACITY_DEFAULT = "1";
const char* CONFIG_GPU_RESOURCE_CACHE_THRESHOLD = "cache_threshold";
const char* CONFIG_GPU_RESOURCE_CACHE_THRESHOLD_DEFAULT = "0.7";
const char* CONFIG_GPU_RESOURCE_DELIMITER = ",";
const char* CONFIG_GPU_RESOURCE_SEARCH_RESOURCES = "search_resources";
const char* CONFIG_GPU_RESOURCE_SEARCH_RESOURCES_DEFAULT = "gpu0";
const char* CONFIG_GPU_RESOURCE_BUILD_INDEX_RESOURCES = "build_index_resources";
const char* CONFIG_GPU_RESOURCE_BUILD_INDEX_RESOURCES_DEFAULT = "gpu0";

/* tracing config */
const char* CONFIG_TRACING = "tracing_config";
const char* CONFIG_TRACING_JSON_CONFIG_PATH = "json_config_path";

/* wal config */
const char* CONFIG_WAL = "wal_config";
const char* CONFIG_WAL_ENABLE = "enable";
const char* CONFIG_WAL_ENABLE_DEFAULT = "true";
const char* CONFIG_WAL_RECOVERY_ERROR_IGNORE = "recovery_error_ignore";
const char* CONFIG_WAL_RECOVERY_ERROR_IGNORE_DEFAULT = "true";
const char* CONFIG_WAL_BUFFER_SIZE = "buffer_size";
const char* CONFIG_WAL_BUFFER_SIZE_DEFAULT = "256";
const int64_t CONFIG_WAL_BUFFER_SIZE_MAX = 4096;
const int64_t CONFIG_WAL_BUFFER_SIZE_MIN = 64;
const char* CONFIG_WAL_WAL_PATH = "wal_path";
const char* CONFIG_WAL_WAL_PATH_DEFAULT = "/tmp/milvus/wal";

W
Wang XiangYu 已提交
156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171
/* logs config */
const char* CONFIG_LOGS = "logs";
const char* CONFIG_LOGS_TRACE_ENABLE = "trace.enable";
const char* CONFIG_LOGS_TRACE_ENABLE_DEFAULT = "true";
const char* CONFIG_LOGS_DEBUG_ENABLE = "debug.enable";
const char* CONFIG_LOGS_DEBUG_ENABLE_DEFAULT = "true";
const char* CONFIG_LOGS_INFO_ENABLE = "info.enable";
const char* CONFIG_LOGS_INFO_ENABLE_DEFAULT = "true";
const char* CONFIG_LOGS_WARNING_ENABLE = "warning.enable";
const char* CONFIG_LOGS_WARNING_ENABLE_DEFAULT = "true";
const char* CONFIG_LOGS_ERROR_ENABLE = "error.enable";
const char* CONFIG_LOGS_ERROR_ENABLE_DEFAULT = "true";
const char* CONFIG_LOGS_FATAL_ENABLE = "fatal.enable";
const char* CONFIG_LOGS_FATAL_ENABLE_DEFAULT = "true";
const char* CONFIG_LOGS_PATH = "path";
const char* CONFIG_LOGS_PATH_DEFAULT = "/tmp/milvus/logs";
W
Wang XiangYu 已提交
172 173 174 175 176 177 178 179
const char* CONFIG_LOGS_MAX_LOG_FILE_SIZE = "max_log_file_size";
const char* CONFIG_LOGS_MAX_LOG_FILE_SIZE_DEFAULT = "256";
const int64_t CONFIG_LOGS_MAX_LOG_FILE_SIZE_MAX = 512;
const int64_t CONFIG_LOGS_MAX_LOG_FILE_SIZE_MIN = 64;
const char* CONFIG_LOGS_DELETE_EXCEEDS = "delete_exceeds";
const char* CONFIG_LOGS_DELETE_EXCEEDS_DEFAULT = "10";
const int64_t CONFIG_LOGS_DELETE_EXCEEDS_MAX = 4096;
const int64_t CONFIG_LOGS_DELETE_EXCEEDS_MIN = 1;
W
Wang XiangYu 已提交
180

181
constexpr int64_t GB = 1UL << 30;
J
Jin Hai 已提交
182 183 184
constexpr int32_t PORT_NUMBER_MIN = 1024;
constexpr int32_t PORT_NUMBER_MAX = 65535;

185 186
static const std::unordered_map<std::string, std::string> milvus_config_version_map(
    {{"0.6.0", "0.1"}, {"0.7.0", "0.2"}, {"0.7.1", "0.2"}, {"0.8.0", "0.3"}});
187

188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222
/////////////////////////////////////////////////////////////
Config::Config() {
    auto empty_map = std::unordered_map<std::string, ConfigCallBackF>();

    // cache config
    std::string node_cpu_cache_capacity = std::string(CONFIG_CACHE) + "." + CONFIG_CACHE_CPU_CACHE_CAPACITY;
    config_callback_[node_cpu_cache_capacity] = empty_map;

    std::string node_insert_buffer_size = std::string(CONFIG_CACHE) + "." + CONFIG_CACHE_INSERT_BUFFER_SIZE;
    config_callback_[node_insert_buffer_size] = empty_map;

    std::string node_cache_insert_data = std::string(CONFIG_CACHE) + "." + CONFIG_CACHE_CACHE_INSERT_DATA;
    config_callback_[node_cache_insert_data] = empty_map;

    // engine config
    std::string node_blas_threshold = std::string(CONFIG_ENGINE) + "." + CONFIG_ENGINE_USE_BLAS_THRESHOLD;
    config_callback_[node_blas_threshold] = empty_map;

    // gpu resources config
    std::string node_gpu_search_threshold = std::string(CONFIG_ENGINE) + "." + CONFIG_ENGINE_GPU_SEARCH_THRESHOLD;
    config_callback_[node_gpu_search_threshold] = empty_map;

    std::string node_gpu_enable = std::string(CONFIG_GPU_RESOURCE) + "." + CONFIG_GPU_RESOURCE_ENABLE;
    config_callback_[node_gpu_enable] = empty_map;

    std::string node_gpu_cache_capacity = std::string(CONFIG_GPU_RESOURCE) + "." + CONFIG_GPU_RESOURCE_CACHE_CAPACITY;
    config_callback_[node_gpu_cache_capacity] = empty_map;

    std::string node_gpu_search_res = std::string(CONFIG_GPU_RESOURCE) + "." + CONFIG_GPU_RESOURCE_SEARCH_RESOURCES;
    config_callback_[node_gpu_search_res] = empty_map;

    std::string node_gpu_build_res = std::string(CONFIG_GPU_RESOURCE) + "." + CONFIG_GPU_RESOURCE_BUILD_INDEX_RESOURCES;
    config_callback_[node_gpu_build_res] = empty_map;
}

S
starlord 已提交
223
Config&
224 225 226
Config::GetInstance() {
    static Config config_inst;
    return config_inst;
G
groot 已提交
227 228
}

S
starlord 已提交
229
Status
S
starlord 已提交
230
Config::LoadConfigFile(const std::string& filename) {
231
    if (filename.empty()) {
232
        return Status(SERVER_UNEXPECTED_ERROR, "No specified config file");
G
groot 已提交
233
    }
234 235 236 237 238

    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 已提交
239 240
    }

S
shengjh 已提交
241 242 243 244
    ConfigMgr* mgr = YamlConfigMgr::GetInstance();
    Status s = mgr->LoadConfigFile(filename);
    if (!s.ok()) {
        return s;
G
groot 已提交
245 246
    }

247 248 249
    // store config file path
    config_file_ = filename;

S
starlord 已提交
250
    return Status::OK();
G
groot 已提交
251 252
}

Y
yudong.cai 已提交
253 254
Status
Config::ValidateConfig() {
255
    std::string config_version;
C
Cai Yudong 已提交
256
    CONFIG_CHECK(GetConfigVersion(config_version));
257

Y
yudong.cai 已提交
258 259
    /* server config */
    std::string server_addr;
C
Cai Yudong 已提交
260
    CONFIG_CHECK(GetServerConfigAddress(server_addr));
Y
yudong.cai 已提交
261 262

    std::string server_port;
C
Cai Yudong 已提交
263
    CONFIG_CHECK(GetServerConfigPort(server_port));
Y
yudong.cai 已提交
264 265

    std::string server_mode;
C
Cai Yudong 已提交
266
    CONFIG_CHECK(GetServerConfigDeployMode(server_mode));
Y
yudong.cai 已提交
267 268

    std::string server_time_zone;
C
Cai Yudong 已提交
269
    CONFIG_CHECK(GetServerConfigTimeZone(server_time_zone));
Y
yudong.cai 已提交
270

271 272 273
    bool server_web_enable;
    CONFIG_CHECK(GetServerConfigWebEnable(server_web_enable));

B
BossZou 已提交
274 275 276
    std::string server_web_port;
    CONFIG_CHECK(GetServerConfigWebPort(server_web_port));

Y
yudong.cai 已提交
277 278
    /* db config */
    std::string db_backend_url;
C
Cai Yudong 已提交
279
    CONFIG_CHECK(GetDBConfigBackendUrl(db_backend_url));
Y
yudong.cai 已提交
280

281 282
    std::string db_preload_collection;
    CONFIG_CHECK(GetDBConfigPreloadCollection(db_preload_collection));
283

Y
yudong.cai 已提交
284
    int64_t db_archive_disk_threshold;
C
Cai Yudong 已提交
285
    CONFIG_CHECK(GetDBConfigArchiveDiskThreshold(db_archive_disk_threshold));
Y
yudong.cai 已提交
286

Y
yudong.cai 已提交
287
    int64_t db_archive_days_threshold;
C
Cai Yudong 已提交
288
    CONFIG_CHECK(GetDBConfigArchiveDaysThreshold(db_archive_days_threshold));
Y
yudong.cai 已提交
289

C
Cai Yudong 已提交
290
    int64_t auto_flush_interval;
291 292
    CONFIG_CHECK(GetDBConfigAutoFlushInterval(auto_flush_interval));

C
Cai Yudong 已提交
293
    /* storage config */
294 295 296 297 298 299
    std::string storage_primary_path;
    CONFIG_CHECK(GetStorageConfigPrimaryPath(storage_primary_path));

    std::string storage_secondary_path;
    CONFIG_CHECK(GetStorageConfigSecondaryPath(storage_secondary_path));

300 301
    bool storage_s3_enable;
    CONFIG_CHECK(GetStorageConfigS3Enable(storage_s3_enable));
C
Cai Yudong 已提交
302
    // std::cout << "S3 " << (storage_s3_enable ? "ENABLED !" : "DISABLED !") << std::endl;
C
Cai Yudong 已提交
303

304 305
    std::string storage_s3_address;
    CONFIG_CHECK(GetStorageConfigS3Address(storage_s3_address));
C
Cai Yudong 已提交
306

307 308
    std::string storage_s3_port;
    CONFIG_CHECK(GetStorageConfigS3Port(storage_s3_port));
C
Cai Yudong 已提交
309

310 311
    std::string storage_s3_access_key;
    CONFIG_CHECK(GetStorageConfigS3AccessKey(storage_s3_access_key));
C
Cai Yudong 已提交
312

313 314
    std::string storage_s3_secret_key;
    CONFIG_CHECK(GetStorageConfigS3SecretKey(storage_s3_secret_key));
C
Cai Yudong 已提交
315

316 317
    std::string storage_s3_bucket;
    CONFIG_CHECK(GetStorageConfigS3Bucket(storage_s3_bucket));
Y
yudong.cai 已提交
318 319 320

    /* metric config */
    bool metric_enable_monitor;
C
Cai Yudong 已提交
321
    CONFIG_CHECK(GetMetricConfigEnableMonitor(metric_enable_monitor));
Y
yudong.cai 已提交
322

C
Cai Yudong 已提交
323 324
    std::string metric_address;
    CONFIG_CHECK(GetMetricConfigAddress(metric_address));
Y
yudong.cai 已提交
325

C
Cai Yudong 已提交
326 327
    std::string metric_port;
    CONFIG_CHECK(GetMetricConfigPort(metric_port));
Y
yudong.cai 已提交
328 329

    /* cache config */
W
wxyu 已提交
330
    int64_t cache_cpu_cache_capacity;
C
Cai Yudong 已提交
331
    CONFIG_CHECK(GetCacheConfigCpuCacheCapacity(cache_cpu_cache_capacity));
Y
yudong.cai 已提交
332

Y
yudong.cai 已提交
333
    float cache_cpu_cache_threshold;
C
Cai Yudong 已提交
334
    CONFIG_CHECK(GetCacheConfigCpuCacheThreshold(cache_cpu_cache_threshold));
Y
yudong.cai 已提交
335

336 337 338
    int64_t cache_insert_buffer_size;
    CONFIG_CHECK(GetCacheConfigInsertBufferSize(cache_insert_buffer_size));

Y
yudong.cai 已提交
339
    bool cache_insert_data;
C
Cai Yudong 已提交
340
    CONFIG_CHECK(GetCacheConfigCacheInsertData(cache_insert_data));
Y
yudong.cai 已提交
341 342

    /* engine config */
Y
yudong.cai 已提交
343
    int64_t engine_use_blas_threshold;
C
Cai Yudong 已提交
344
    CONFIG_CHECK(GetEngineConfigUseBlasThreshold(engine_use_blas_threshold));
Y
yudong.cai 已提交
345

Y
yudong.cai 已提交
346
    int64_t engine_omp_thread_num;
C
Cai Yudong 已提交
347
    CONFIG_CHECK(GetEngineConfigOmpThreadNum(engine_omp_thread_num));
Y
yudong.cai 已提交
348

F
feisiyicl 已提交
349 350
    std::string engine_simd_type;
    CONFIG_CHECK(GetEngineConfigSimdType(engine_simd_type));
C
Cai Yudong 已提交
351

G
groot 已提交
352
#ifdef MILVUS_GPU_VERSION
Y
yudong.cai 已提交
353
    int64_t engine_gpu_search_threshold;
C
Cai Yudong 已提交
354 355
    CONFIG_CHECK(GetEngineConfigGpuSearchThreshold(engine_gpu_search_threshold));
#endif
W
wxyu 已提交
356

Y
yudong.cai 已提交
357
    /* gpu resource config */
C
Cai Yudong 已提交
358
#ifdef MILVUS_GPU_VERSION
359
    bool gpu_resource_enable;
C
Cai Yudong 已提交
360
    CONFIG_CHECK(GetGpuResourceConfigEnable(gpu_resource_enable));
361
    std::cout << "GPU resources " << (gpu_resource_enable ? "ENABLED !" : "DISABLED !") << std::endl;
C
Cai Yudong 已提交
362

363 364
    if (gpu_resource_enable) {
        int64_t resource_cache_capacity;
C
Cai Yudong 已提交
365
        CONFIG_CHECK(GetGpuResourceConfigCacheCapacity(resource_cache_capacity));
Y
yudong.cai 已提交
366

367
        float resource_cache_threshold;
C
Cai Yudong 已提交
368
        CONFIG_CHECK(GetGpuResourceConfigCacheThreshold(resource_cache_threshold));
Y
yudong.cai 已提交
369

370
        std::vector<int64_t> search_resources;
C
Cai Yudong 已提交
371
        CONFIG_CHECK(GetGpuResourceConfigSearchResources(search_resources));
372

373
        std::vector<int64_t> index_build_resources;
C
Cai Yudong 已提交
374
        CONFIG_CHECK(GetGpuResourceConfigBuildIndexResources(index_build_resources));
S
starlord 已提交
375
    }
Y
yudong.cai 已提交
376
#endif
Y
yudong.cai 已提交
377

Z
Zhiru Zhu 已提交
378 379
    /* tracing config */
    std::string tracing_config_path;
C
Cai Yudong 已提交
380
    CONFIG_CHECK(GetTracingConfigJsonConfigPath(tracing_config_path));
Z
Zhiru Zhu 已提交
381

382 383 384 385 386 387 388
    /* wal config */
    bool enable;
    CONFIG_CHECK(GetWalConfigEnable(enable));

    bool recovery_error_ignore;
    CONFIG_CHECK(GetWalConfigRecoveryErrorIgnore(recovery_error_ignore));

C
Cai Yudong 已提交
389
    int64_t buffer_size;
390 391 392 393 394
    CONFIG_CHECK(GetWalConfigBufferSize(buffer_size));

    std::string wal_path;
    CONFIG_CHECK(GetWalConfigWalPath(wal_path));

W
Wang XiangYu 已提交
395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416
    /* logs config */
    bool trace_enable;
    CONFIG_CHECK(GetLogsTraceEnable(trace_enable));

    bool debug_enable;
    CONFIG_CHECK(GetLogsDebugEnable(trace_enable));

    bool info_enable;
    CONFIG_CHECK(GetLogsInfoEnable(trace_enable));

    bool warning_enable;
    CONFIG_CHECK(GetLogsWarningEnable(trace_enable));

    bool error_enable;
    CONFIG_CHECK(GetLogsErrorEnable(trace_enable));

    bool fatal_enable;
    CONFIG_CHECK(GetLogsFatalEnable(trace_enable));

    std::string logs_path;
    CONFIG_CHECK(GetLogsPath(logs_path));

W
Wang XiangYu 已提交
417 418 419 420 421 422
    int64_t logs_max_log_file_size;
    CONFIG_CHECK(GetLogsMaxLogFileSize(logs_max_log_file_size));

    int64_t delete_exceeds;
    CONFIG_CHECK(GetLogsDeleteExceeds(delete_exceeds));

Y
yudong.cai 已提交
423 424 425
    return Status::OK();
}

Y
yudong.cai 已提交
426 427 428
Status
Config::ResetDefaultConfig() {
    /* server config */
C
Cai Yudong 已提交
429 430 431 432
    CONFIG_CHECK(SetServerConfigAddress(CONFIG_SERVER_ADDRESS_DEFAULT));
    CONFIG_CHECK(SetServerConfigPort(CONFIG_SERVER_PORT_DEFAULT));
    CONFIG_CHECK(SetServerConfigDeployMode(CONFIG_SERVER_DEPLOY_MODE_DEFAULT));
    CONFIG_CHECK(SetServerConfigTimeZone(CONFIG_SERVER_TIME_ZONE_DEFAULT));
433
    CONFIG_CHECK(SetServerConfigWebEnable(CONFIG_SERVER_WEB_ENABLE_DEFAULT));
B
BossZou 已提交
434
    CONFIG_CHECK(SetServerConfigWebPort(CONFIG_SERVER_WEB_PORT_DEFAULT));
Y
yudong.cai 已提交
435 436

    /* db config */
C
Cai Yudong 已提交
437
    CONFIG_CHECK(SetDBConfigBackendUrl(CONFIG_DB_BACKEND_URL_DEFAULT));
G
groot 已提交
438
    CONFIG_CHECK(SetDBConfigPreloadCollection(CONFIG_DB_PRELOAD_COLLECTION_DEFAULT));
C
Cai Yudong 已提交
439 440
    CONFIG_CHECK(SetDBConfigArchiveDiskThreshold(CONFIG_DB_ARCHIVE_DISK_THRESHOLD_DEFAULT));
    CONFIG_CHECK(SetDBConfigArchiveDaysThreshold(CONFIG_DB_ARCHIVE_DAYS_THRESHOLD_DEFAULT));
441
    CONFIG_CHECK(SetDBConfigAutoFlushInterval(CONFIG_DB_AUTO_FLUSH_INTERVAL_DEFAULT));
C
Cai Yudong 已提交
442 443

    /* storage config */
444 445
    CONFIG_CHECK(SetStorageConfigPrimaryPath(CONFIG_STORAGE_PRIMARY_PATH_DEFAULT));
    CONFIG_CHECK(SetStorageConfigSecondaryPath(CONFIG_STORAGE_SECONDARY_PATH_DEFAULT));
446 447 448 449 450 451
    CONFIG_CHECK(SetStorageConfigS3Enable(CONFIG_STORAGE_S3_ENABLE_DEFAULT));
    CONFIG_CHECK(SetStorageConfigS3Address(CONFIG_STORAGE_S3_ADDRESS_DEFAULT));
    CONFIG_CHECK(SetStorageConfigS3Port(CONFIG_STORAGE_S3_PORT_DEFAULT));
    CONFIG_CHECK(SetStorageConfigS3AccessKey(CONFIG_STORAGE_S3_ACCESS_KEY_DEFAULT));
    CONFIG_CHECK(SetStorageConfigS3SecretKey(CONFIG_STORAGE_S3_SECRET_KEY_DEFAULT));
    CONFIG_CHECK(SetStorageConfigS3Bucket(CONFIG_STORAGE_S3_BUCKET_DEFAULT));
Y
yudong.cai 已提交
452 453

    /* metric config */
C
Cai Yudong 已提交
454
    CONFIG_CHECK(SetMetricConfigEnableMonitor(CONFIG_METRIC_ENABLE_MONITOR_DEFAULT));
C
Cai Yudong 已提交
455 456
    CONFIG_CHECK(SetMetricConfigAddress(CONFIG_METRIC_ADDRESS_DEFAULT));
    CONFIG_CHECK(SetMetricConfigPort(CONFIG_METRIC_PORT_DEFAULT));
Y
yudong.cai 已提交
457 458

    /* cache config */
C
Cai Yudong 已提交
459 460
    CONFIG_CHECK(SetCacheConfigCpuCacheCapacity(CONFIG_CACHE_CPU_CACHE_CAPACITY_DEFAULT));
    CONFIG_CHECK(SetCacheConfigCpuCacheThreshold(CONFIG_CACHE_CPU_CACHE_THRESHOLD_DEFAULT));
461
    CONFIG_CHECK(SetCacheConfigInsertBufferSize(CONFIG_CACHE_INSERT_BUFFER_SIZE_DEFAULT));
C
Cai Yudong 已提交
462
    CONFIG_CHECK(SetCacheConfigCacheInsertData(CONFIG_CACHE_CACHE_INSERT_DATA_DEFAULT));
Y
yudong.cai 已提交
463

Y
yudong.cai 已提交
464
    /* engine config */
C
Cai Yudong 已提交
465 466
    CONFIG_CHECK(SetEngineConfigUseBlasThreshold(CONFIG_ENGINE_USE_BLAS_THRESHOLD_DEFAULT));
    CONFIG_CHECK(SetEngineConfigOmpThreadNum(CONFIG_ENGINE_OMP_THREAD_NUM_DEFAULT));
F
feisiyicl 已提交
467
    CONFIG_CHECK(SetEngineConfigSimdType(CONFIG_ENGINE_SIMD_TYPE_DEFAULT));
J
Jin Hai 已提交
468 469 470 471 472 473

    /* wal config */
    CONFIG_CHECK(SetWalConfigEnable(CONFIG_WAL_ENABLE_DEFAULT));
    CONFIG_CHECK(SetWalConfigRecoveryErrorIgnore(CONFIG_WAL_RECOVERY_ERROR_IGNORE_DEFAULT));
    CONFIG_CHECK(SetWalConfigBufferSize(CONFIG_WAL_BUFFER_SIZE_DEFAULT));
    CONFIG_CHECK(SetWalConfigWalPath(CONFIG_WAL_WAL_PATH_DEFAULT));
W
Wang XiangYu 已提交
474 475 476 477 478 479 480 481 482

    /* logs config */
    CONFIG_CHECK(SetLogsTraceEnable(CONFIG_LOGS_TRACE_ENABLE_DEFAULT));
    CONFIG_CHECK(SetLogsDebugEnable(CONFIG_LOGS_DEBUG_ENABLE_DEFAULT));
    CONFIG_CHECK(SetLogsInfoEnable(CONFIG_LOGS_INFO_ENABLE_DEFAULT));
    CONFIG_CHECK(SetLogsWarningEnable(CONFIG_LOGS_WARNING_ENABLE_DEFAULT));
    CONFIG_CHECK(SetLogsErrorEnable(CONFIG_LOGS_ERROR_ENABLE_DEFAULT));
    CONFIG_CHECK(SetLogsFatalEnable(CONFIG_LOGS_FATAL_ENABLE_DEFAULT));
    CONFIG_CHECK(SetLogsPath(CONFIG_LOGS_PATH_DEFAULT));
W
Wang XiangYu 已提交
483 484
    CONFIG_CHECK(SetLogsMaxLogFileSize(CONFIG_LOGS_MAX_LOG_FILE_SIZE_DEFAULT));
    CONFIG_CHECK(SetLogsDeleteExceeds(CONFIG_LOGS_DELETE_EXCEEDS_DEFAULT));
W
Wang XiangYu 已提交
485

G
groot 已提交
486
#ifdef MILVUS_GPU_VERSION
C
Cai Yudong 已提交
487 488
    CONFIG_CHECK(SetEngineConfigGpuSearchThreshold(CONFIG_ENGINE_GPU_SEARCH_THRESHOLD_DEFAULT));
#endif
Z
Zhiru Zhu 已提交
489

C
Cai Yudong 已提交
490 491 492 493 494 495 496
    /* gpu resource config */
#ifdef MILVUS_GPU_VERSION
    CONFIG_CHECK(SetGpuResourceConfigEnable(CONFIG_GPU_RESOURCE_ENABLE_DEFAULT));
    CONFIG_CHECK(SetGpuResourceConfigCacheCapacity(CONFIG_GPU_RESOURCE_CACHE_CAPACITY_DEFAULT));
    CONFIG_CHECK(SetGpuResourceConfigCacheThreshold(CONFIG_GPU_RESOURCE_CACHE_THRESHOLD_DEFAULT));
    CONFIG_CHECK(SetGpuResourceConfigSearchResources(CONFIG_GPU_RESOURCE_SEARCH_RESOURCES_DEFAULT));
    CONFIG_CHECK(SetGpuResourceConfigBuildIndexResources(CONFIG_GPU_RESOURCE_BUILD_INDEX_RESOURCES_DEFAULT));
Y
yudong.cai 已提交
497
#endif
498

Y
yudong.cai 已提交
499 500 501
    return Status::OK();
}

Y
yudong.cai 已提交
502
void
503
Config::GetConfigJsonStr(std::string& result, int64_t indent) {
504
    nlohmann::json config_json(config_map_);
505
    result = config_json.dump(indent);
Y
yudong.cai 已提交
506 507
}

C
Cai Yudong 已提交
508
Status
509
Config::GetConfigCli(std::string& value, const std::string& parent_key, const std::string& child_key) {
C
Cai Yudong 已提交
510 511 512 513 514 515 516 517 518
    if (!ConfigNodeValid(parent_key, child_key)) {
        std::string str = "Config node invalid: " + parent_key + CONFIG_NODE_DELIMITER + child_key;
        return Status(SERVER_UNEXPECTED_ERROR, str);
    }
    return GetConfigValueInMem(parent_key, child_key, value);
}

Status
Config::SetConfigCli(const std::string& parent_key, const std::string& child_key, const std::string& value) {
519 520
    std::string invalid_node_str = "Config node invalid: " + parent_key + CONFIG_NODE_DELIMITER + child_key;

C
Cai Yudong 已提交
521
    if (!ConfigNodeValid(parent_key, child_key)) {
522
        return Status(SERVER_UNEXPECTED_ERROR, invalid_node_str);
C
Cai Yudong 已提交
523
    }
524
    auto status = Status::OK();
C
Cai Yudong 已提交
525
    if (parent_key == CONFIG_SERVER) {
526 527 528 529 530 531 532 533 534 535
        if (child_key == CONFIG_SERVER_ADDRESS) {
            status = SetServerConfigAddress(value);
        } else if (child_key == CONFIG_SERVER_DEPLOY_MODE) {
            status = SetServerConfigDeployMode(value);
        } else if (child_key == CONFIG_SERVER_PORT) {
            status = SetServerConfigPort(value);
        } else if (child_key == CONFIG_SERVER_TIME_ZONE) {
            status = SetServerConfigTimeZone(value);
        } else if (child_key == CONFIG_SERVER_WEB_PORT) {
            status = SetServerConfigWebPort(value);
536 537
        } else {
            status = Status(SERVER_UNEXPECTED_ERROR, invalid_node_str);
538
        }
C
Cai Yudong 已提交
539
    } else if (parent_key == CONFIG_DB) {
540 541
        if (child_key == CONFIG_DB_BACKEND_URL) {
            status = SetDBConfigBackendUrl(value);
G
groot 已提交
542
        } else if (child_key == CONFIG_DB_PRELOAD_COLLECTION) {
543
            status = SetDBConfigPreloadCollection(value);
544 545
        } else if (child_key == CONFIG_DB_AUTO_FLUSH_INTERVAL) {
            status = SetDBConfigAutoFlushInterval(value);
546 547
        } else {
            status = Status(SERVER_UNEXPECTED_ERROR, invalid_node_str);
548
        }
C
Cai Yudong 已提交
549
    } else if (parent_key == CONFIG_STORAGE) {
550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565
        if (child_key == CONFIG_STORAGE_PRIMARY_PATH) {
            status = SetStorageConfigPrimaryPath(value);
        } else if (child_key == CONFIG_STORAGE_SECONDARY_PATH) {
            status = SetStorageConfigSecondaryPath(value);
        } else if (child_key == CONFIG_STORAGE_S3_ENABLE) {
            status = SetStorageConfigS3Enable(value);
        } else if (child_key == CONFIG_STORAGE_S3_ADDRESS) {
            status = SetStorageConfigS3Address(value);
        } else if (child_key == CONFIG_STORAGE_S3_PORT) {
            status = SetStorageConfigS3Port(value);
        } else if (child_key == CONFIG_STORAGE_S3_ACCESS_KEY) {
            status = SetStorageConfigS3AccessKey(value);
        } else if (child_key == CONFIG_STORAGE_S3_SECRET_KEY) {
            status = SetStorageConfigS3SecretKey(value);
        } else if (child_key == CONFIG_STORAGE_S3_BUCKET) {
            status = SetStorageConfigS3Bucket(value);
566 567
        } else {
            status = Status(SERVER_UNEXPECTED_ERROR, invalid_node_str);
568
        }
C
Cai Yudong 已提交
569
    } else if (parent_key == CONFIG_METRIC) {
570 571 572 573 574 575
        if (child_key == CONFIG_METRIC_ENABLE_MONITOR) {
            status = SetMetricConfigEnableMonitor(value);
        } else if (child_key == CONFIG_METRIC_ADDRESS) {
            status = SetMetricConfigAddress(value);
        } else if (child_key == CONFIG_METRIC_PORT) {
            status = SetMetricConfigPort(value);
576 577
        } else {
            status = Status(SERVER_UNEXPECTED_ERROR, invalid_node_str);
578
        }
C
Cai Yudong 已提交
579 580
    } else if (parent_key == CONFIG_CACHE) {
        if (child_key == CONFIG_CACHE_CPU_CACHE_CAPACITY) {
581
            status = SetCacheConfigCpuCacheCapacity(value);
C
Cai Yudong 已提交
582
        } else if (child_key == CONFIG_CACHE_CPU_CACHE_THRESHOLD) {
583
            status = SetCacheConfigCpuCacheThreshold(value);
C
Cai Yudong 已提交
584
        } else if (child_key == CONFIG_CACHE_CACHE_INSERT_DATA) {
585
            status = SetCacheConfigCacheInsertData(value);
586
        } else if (child_key == CONFIG_CACHE_INSERT_BUFFER_SIZE) {
587
            status = SetCacheConfigInsertBufferSize(value);
588 589
        } else {
            status = Status(SERVER_UNEXPECTED_ERROR, invalid_node_str);
C
Cai Yudong 已提交
590 591 592
        }
    } else if (parent_key == CONFIG_ENGINE) {
        if (child_key == CONFIG_ENGINE_USE_BLAS_THRESHOLD) {
593
            status = SetEngineConfigUseBlasThreshold(value);
C
Cai Yudong 已提交
594
        } else if (child_key == CONFIG_ENGINE_OMP_THREAD_NUM) {
595
            status = SetEngineConfigOmpThreadNum(value);
F
feisiyicl 已提交
596 597
        } else if (child_key == CONFIG_ENGINE_SIMD_TYPE) {
            status = SetEngineConfigSimdType(value);
C
Cai Yudong 已提交
598 599
#ifdef MILVUS_GPU_VERSION
        } else if (child_key == CONFIG_ENGINE_GPU_SEARCH_THRESHOLD) {
600
            status = SetEngineConfigGpuSearchThreshold(value);
C
Cai Yudong 已提交
601
#endif
602 603
        } else {
            status = Status(SERVER_UNEXPECTED_ERROR, invalid_node_str);
C
Cai Yudong 已提交
604 605 606 607
        }
#ifdef MILVUS_GPU_VERSION
    } else if (parent_key == CONFIG_GPU_RESOURCE) {
        if (child_key == CONFIG_GPU_RESOURCE_ENABLE) {
608
            status = SetGpuResourceConfigEnable(value);
C
Cai Yudong 已提交
609
        } else if (child_key == CONFIG_GPU_RESOURCE_CACHE_CAPACITY) {
610
            status = SetGpuResourceConfigCacheCapacity(value);
C
Cai Yudong 已提交
611
        } else if (child_key == CONFIG_GPU_RESOURCE_CACHE_THRESHOLD) {
612
            status = SetGpuResourceConfigCacheThreshold(value);
C
Cai Yudong 已提交
613
        } else if (child_key == CONFIG_GPU_RESOURCE_SEARCH_RESOURCES) {
614
            status = SetGpuResourceConfigSearchResources(value);
C
Cai Yudong 已提交
615
        } else if (child_key == CONFIG_GPU_RESOURCE_BUILD_INDEX_RESOURCES) {
616
            status = SetGpuResourceConfigBuildIndexResources(value);
617 618
        } else {
            status = Status(SERVER_UNEXPECTED_ERROR, invalid_node_str);
C
Cai Yudong 已提交
619 620 621
        }
#endif
    } else if (parent_key == CONFIG_TRACING) {
622 623 624 625 626
        if (child_key == CONFIG_TRACING_JSON_CONFIG_PATH) {
            status = SetTracingConfigJsonConfigPath(value);
        } else {
            status = Status(SERVER_UNEXPECTED_ERROR, invalid_node_str);
        }
J
Jin Hai 已提交
627 628 629 630 631 632 633 634 635
    } else if (parent_key == CONFIG_WAL) {
        if (child_key == CONFIG_WAL_ENABLE) {
            status = SetWalConfigEnable(value);
        } else if (child_key == CONFIG_WAL_RECOVERY_ERROR_IGNORE) {
            status = SetWalConfigRecoveryErrorIgnore(value);
        } else if (child_key == CONFIG_WAL_BUFFER_SIZE) {
            status = SetWalConfigBufferSize(value);
        } else if (child_key == CONFIG_WAL_WAL_PATH) {
            status = SetWalConfigWalPath(value);
636 637
        } else {
            status = Status(SERVER_UNEXPECTED_ERROR, invalid_node_str);
J
Jin Hai 已提交
638
        }
639 640 641 642
    }

    if (status.ok()) {
        status = UpdateFileConfigFromMem(parent_key, child_key);
643 644
        if (status.ok() &&
            !(parent_key == CONFIG_CACHE || parent_key == CONFIG_ENGINE || parent_key == CONFIG_GPU_RESOURCE)) {
645 646
            restart_required_ = true;
        }
C
Cai Yudong 已提交
647
    }
648 649

    return status;
C
Cai Yudong 已提交
650 651
}

652
//////////////////////////////////////////////////////////////
C
Cai Yudong 已提交
653
Status
654
Config::ProcessConfigCli(std::string& result, const std::string& cmd) {
C
Cai Yudong 已提交
655 656 657
    std::vector<std::string> tokens;
    std::vector<std::string> nodes;
    server::StringHelpFunctions::SplitStringByDelimeter(cmd, " ", tokens);
658
    if (tokens[0] == "get_config") {
C
Cai Yudong 已提交
659 660 661
        if (tokens.size() != 2) {
            return Status(SERVER_UNEXPECTED_ERROR, "Invalid command: " + cmd);
        }
662 663 664 665 666 667 668 669 670
        if (tokens[1] == "*") {
            GetConfigJsonStr(result);
            return Status::OK();
        } else {
            server::StringHelpFunctions::SplitStringByDelimeter(tokens[1], CONFIG_NODE_DELIMITER, nodes);
            if (nodes.size() != 2) {
                return Status(SERVER_UNEXPECTED_ERROR, "Invalid command: " + cmd);
            }
            return GetConfigCli(result, nodes[0], nodes[1]);
C
Cai Yudong 已提交
671
        }
672
    } else if (tokens[0] == "set_config") {
C
Cai Yudong 已提交
673 674 675 676 677 678 679 680 681 682 683 684 685
        if (tokens.size() != 3) {
            return Status(SERVER_UNEXPECTED_ERROR, "Invalid command: " + cmd);
        }
        server::StringHelpFunctions::SplitStringByDelimeter(tokens[1], CONFIG_NODE_DELIMITER, nodes);
        if (nodes.size() != 2) {
            return Status(SERVER_UNEXPECTED_ERROR, "Invalid command: " + cmd);
        }
        return SetConfigCli(nodes[0], nodes[1], tokens[2]);
    } else {
        return Status(SERVER_UNEXPECTED_ERROR, "Invalid command: " + cmd);
    }
}

686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701
Status
Config::GenUniqueIdentityID(const std::string& identity, std::string& uid) {
    std::vector<std::string> elements;
    elements.push_back(identity);

    // get current process id
    int64_t pid = getpid();
    elements.push_back(std::to_string(pid));

    // get current thread id
    std::stringstream ss;
    ss << std::this_thread::get_id();
    elements.push_back(ss.str());

    // get current timestamp
    auto time_now = std::chrono::system_clock::now();
702
    auto duration_in_ms = std::chrono::duration_cast<std::chrono::nanoseconds>(time_now.time_since_epoch());
703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739
    elements.push_back(std::to_string(duration_in_ms.count()));

    StringHelpFunctions::MergeStringWithDelimeter(elements, "-", uid);

    return Status::OK();
}

Status
Config::UpdateFileConfigFromMem(const std::string& parent_key, const std::string& child_key) {
    if (access(config_file_.c_str(), F_OK | R_OK) != 0) {
        return Status(SERVER_UNEXPECTED_ERROR, "Cannot find configure file: " + config_file_);
    }

    // Store original configure file
    std::string ori_file = config_file_ + ".ori";
    if (access(ori_file.c_str(), F_OK) != 0) {
        std::fstream fin(config_file_, std::ios::in);
        std::ofstream fout(ori_file);

        if (!fin.is_open() || !fout.is_open()) {
            return Status(SERVER_UNEXPECTED_ERROR, "Cannot open conf file. Store original conf file failed");
        }
        fout << fin.rdbuf();
        fout.flush();
        fout.close();
        fin.close();
    }

    std::string value;
    auto status = GetConfigValueInMem(parent_key, child_key, value);
    if (!status.ok()) {
        return status;
    }

    // convert value string to standard string stored in yaml file
    std::string value_str;
    if (child_key == CONFIG_CACHE_CACHE_INSERT_DATA || child_key == CONFIG_STORAGE_S3_ENABLE ||
740 741 742 743 744 745 746 747
        child_key == CONFIG_METRIC_ENABLE_MONITOR || child_key == CONFIG_GPU_RESOURCE_ENABLE ||
        child_key == CONFIG_WAL_ENABLE || child_key == CONFIG_WAL_RECOVERY_ERROR_IGNORE) {
        bool ok = false;
        status = StringHelpFunctions::ConvertToBoolean(value, ok);
        if (!status.ok()) {
            return status;
        }
        value_str = ok ? "true" : "false";
748 749 750 751 752
    } else if (child_key == CONFIG_GPU_RESOURCE_SEARCH_RESOURCES ||
               child_key == CONFIG_GPU_RESOURCE_BUILD_INDEX_RESOURCES) {
        std::vector<std::string> vec;
        StringHelpFunctions::SplitStringByDelimeter(value, ",", vec);
        for (auto& s : vec) {
753
            std::transform(s.begin(), s.end(), s.begin(), ::tolower);
754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848
            value_str += "\n    - " + s;
        }
    } else {
        value_str = value;
    }

    std::fstream conf_fin(config_file_, std::ios::in);
    if (!conf_fin.is_open()) {
        return Status(SERVER_UNEXPECTED_ERROR, "Cannot open conf file: " + config_file_);
    }

    bool parent_key_read = false;
    std::string conf_str, line;
    while (getline(conf_fin, line)) {
        if (!parent_key_read) {
            conf_str += line + "\n";
            if (!(line.empty() || line.find_first_of('#') == 0 || line.find(parent_key) == std::string::npos))
                parent_key_read = true;
            continue;
        }

        if (line.find_first_of('#') == 0) {
            status = Status(SERVER_UNEXPECTED_ERROR, "Cannot find child key: " + child_key);
            break;
        }

        if (line.find(child_key) != std::string::npos) {
            // may loss comments here, need to extract comments from line
            conf_str += "  " + child_key + ": " + value_str + "\n";
            break;
        }

        conf_str += line + "\n";
    }

    // values of gpu resources are sequences, need to remove old here
    if (child_key == CONFIG_GPU_RESOURCE_SEARCH_RESOURCES || child_key == CONFIG_GPU_RESOURCE_BUILD_INDEX_RESOURCES) {
        while (getline(conf_fin, line)) {
            if (line.find("- gpu") != std::string::npos)
                continue;

            conf_str += line + "\n";
            if (!line.empty() && line.size() > 2 && isalnum(line.at(2))) {
                break;
            }
        }
    }

    if (status.ok()) {
        while (getline(conf_fin, line)) {
            conf_str += line + "\n";
        }
        conf_fin.close();

        std::fstream fout(config_file_, std::ios::out | std::ios::trunc);
        fout << conf_str;
        fout.flush();
        fout.close();
    }

    return status;
}

Status
Config::RegisterCallBack(const std::string& node, const std::string& sub_node, const std::string& key,
                         ConfigCallBackF& cb) {
    std::string cb_node = node + "." + sub_node;
    if (config_callback_.find(cb_node) == config_callback_.end()) {
        return Status(SERVER_UNEXPECTED_ERROR, cb_node + " is not supported changed in mem");
    }

    auto& callback_map = config_callback_.at(cb_node);

    callback_map[key] = cb;

    return Status::OK();
}

Status
Config::CancelCallBack(const std::string& node, const std::string& sub_node, const std::string& key) {
    if (config_callback_.empty() || key.empty()) {
        return Status::OK();
    }

    std::string cb_node = node + "." + sub_node;
    if (config_callback_.find(cb_node) == config_callback_.end()) {
        return Status(SERVER_UNEXPECTED_ERROR, cb_node + " cannot found in callback map");
    }

    auto& cb_map = config_callback_.at(cb_node);
    cb_map.erase(key);

    return Status::OK();
}

Y
yudong.cai 已提交
849
////////////////////////////////////////////////////////////////////////////////
850 851
Status
Config::CheckConfigVersion(const std::string& value) {
852 853 854 855 856 857
    if (milvus_config_version_map.find(MILVUS_VERSION) != milvus_config_version_map.end()) {
        bool exist_error = milvus_config_version_map.at(MILVUS_VERSION) != value;
        fiu_do_on("check_config_version_fail", exist_error = true);
        if (exist_error) {
            std::string msg = "Invalid config version: " + value +
                              ". Expected config version: " + milvus_config_version_map.at(MILVUS_VERSION);
858
            LOG_SERVER_ERROR_ << msg;
Y
yudong.cai 已提交
859
            return Status(SERVER_INVALID_ARGUMENT, msg);
860
        }
861 862 863 864
    }
    return Status::OK();
}

C
Cai Yudong 已提交
865
/* server config */
S
starlord 已提交
866
Status
S
starlord 已提交
867
Config::CheckServerConfigAddress(const std::string& value) {
S
shengjh 已提交
868 869 870 871
    auto exist_error = !ValidationUtil::ValidateIpAddress(value).ok();
    fiu_do_on("check_config_address_fail", exist_error = true);

    if (exist_error) {
S
starlord 已提交
872 873
        std::string msg =
            "Invalid server IP address: " + value + ". Possible reason: server_config.address is invalid.";
874
        return Status(SERVER_INVALID_ARGUMENT, msg);
Z
zhiru 已提交
875
    }
Y
yudong.cai 已提交
876 877
    return Status::OK();
}
Z
zhiru 已提交
878

Y
yudong.cai 已提交
879
Status
S
starlord 已提交
880
Config::CheckServerConfigPort(const std::string& value) {
S
shengjh 已提交
881 882 883 884
    auto exist_error = !ValidationUtil::ValidateStringIsNumber(value).ok();
    fiu_do_on("check_config_port_fail", exist_error = true);

    if (exist_error) {
S
starlord 已提交
885
        std::string msg = "Invalid server port: " + value + ". Possible reason: server_config.port is not a number.";
886
        return Status(SERVER_INVALID_ARGUMENT, msg);
887
    } else {
J
Jin Hai 已提交
888 889 890 891 892 893 894 895 896
        try {
            int32_t port = std::stoi(value);
            if (!(port > PORT_NUMBER_MIN && port < PORT_NUMBER_MAX)) {
                std::string msg = "Invalid server port: " + value +
                                  ". Possible reason: server_config.port is not in range (1024, 65535).";
                return Status(SERVER_INVALID_ARGUMENT, msg);
            }
        } catch (...) {
            return Status(SERVER_INVALID_ARGUMENT, "Invalid server_config.port: " + value);
Z
zhiru 已提交
897 898
        }
    }
Y
yudong.cai 已提交
899 900
    return Status::OK();
}
Z
zhiru 已提交
901

Y
yudong.cai 已提交
902
Status
S
starlord 已提交
903
Config::CheckServerConfigDeployMode(const std::string& value) {
S
shengjh 已提交
904 905 906 907
    fiu_return_on("check_config_deploy_mode_fail",
                  Status(SERVER_INVALID_ARGUMENT,
                         "server_config.deploy_mode is not one of single, cluster_readonly, and cluster_writable."));

S
starlord 已提交
908
    if (value != "single" && value != "cluster_readonly" && value != "cluster_writable") {
Y
yudong.cai 已提交
909
        return Status(SERVER_INVALID_ARGUMENT,
Z
Zhiru Zhu 已提交
910
                      "server_config.deploy_mode is not one of single, cluster_readonly, and cluster_writable.");
911
    }
Y
yudong.cai 已提交
912 913
    return Status::OK();
}
914

Y
yudong.cai 已提交
915
Status
S
starlord 已提交
916
Config::CheckServerConfigTimeZone(const std::string& value) {
S
shengjh 已提交
917 918 919
    fiu_return_on("check_config_time_zone_fail",
                  Status(SERVER_INVALID_ARGUMENT, "Invalid server_config.time_zone: " + value));

Y
yudong.cai 已提交
920
    if (value.length() <= 3) {
S
starlord 已提交
921
        return Status(SERVER_INVALID_ARGUMENT, "Invalid server_config.time_zone: " + value);
922
    } else {
Y
yudong.cai 已提交
923
        if (value.substr(0, 3) != "UTC") {
S
starlord 已提交
924
            return Status(SERVER_INVALID_ARGUMENT, "Invalid server_config.time_zone: " + value);
925
        } else {
J
Jin Hai 已提交
926
            if (!ValidationUtil::IsNumber(value.substr(4))) {
S
starlord 已提交
927
                return Status(SERVER_INVALID_ARGUMENT, "Invalid server_config.time_zone: " + value);
928
            }
929 930
        }
    }
Y
yudong.cai 已提交
931
    return Status::OK();
Z
zhiru 已提交
932 933
}

934 935 936 937 938
Status
Config::CheckServerConfigWebEnable(const std::string& value) {
    return ValidationUtil::ValidateStringIsBool(value);
}

B
BossZou 已提交
939 940 941 942 943 944 945
Status
Config::CheckServerConfigWebPort(const std::string& value) {
    if (!ValidationUtil::ValidateStringIsNumber(value).ok()) {
        std::string msg =
            "Invalid web server port: " + value + ". Possible reason: server_config.web_port is not a number.";
        return Status(SERVER_INVALID_ARGUMENT, msg);
    } else {
J
Jin Hai 已提交
946 947 948 949 950 951 952 953 954
        try {
            int32_t port = std::stoi(value);
            if (!(port > PORT_NUMBER_MIN && port < PORT_NUMBER_MAX)) {
                std::string msg = "Invalid web server port: " + value +
                                  ". Possible reason: server_config.web_port is not in range (1024, 65535).";
                return Status(SERVER_INVALID_ARGUMENT, msg);
            }
        } catch (...) {
            return Status(SERVER_INVALID_ARGUMENT, "Invalid server_config.web_port: " + value);
B
BossZou 已提交
955 956 957 958 959
        }
    }
    return Status::OK();
}

C
Cai Yudong 已提交
960
/* DB config */
Y
yudong.cai 已提交
961
Status
S
starlord 已提交
962
Config::CheckDBConfigBackendUrl(const std::string& value) {
S
shengjh 已提交
963 964 965 966
    auto exist_error = !ValidationUtil::ValidateDbURI(value).ok();
    fiu_do_on("check_config_backend_url_fail", exist_error = true);

    if (exist_error) {
967
        std::string msg =
S
starlord 已提交
968
            "Invalid backend url: " + value + ". Possible reason: db_config.db_backend_url is invalid. " +
969
            "The correct format should be like sqlite://:@:/ or mysql://root:123456@127.0.0.1:3306/milvus.";
970
        return Status(SERVER_INVALID_ARGUMENT, msg);
Z
zhiru 已提交
971
    }
Y
yudong.cai 已提交
972 973
    return Status::OK();
}
Z
zhiru 已提交
974

975
Status
976
Config::CheckDBConfigPreloadCollection(const std::string& value) {
977
    fiu_return_on("check_config_preload_collection_fail", Status(SERVER_INVALID_ARGUMENT, ""));
978

979 980 981 982 983 984
    if (value.empty() || value == "*") {
        return Status::OK();
    }

    std::vector<std::string> tables;
    StringHelpFunctions::SplitStringByDelimeter(value, ",", tables);
985 986 987

    std::unordered_set<std::string> table_set;

J
Jin Hai 已提交
988 989 990
    for (auto& collection : tables) {
        if (!ValidationUtil::ValidateCollectionName(collection).ok()) {
            return Status(SERVER_INVALID_ARGUMENT, "Invalid collection name: " + collection);
991 992
        }
        bool exist = false;
993
        auto status = DBWrapper::DB()->HasNativeCollection(collection, exist);
994
        if (!(status.ok() && exist)) {
G
groot 已提交
995
            return Status(SERVER_COLLECTION_NOT_EXIST, "Collection " + collection + " not exist");
996
        }
J
Jin Hai 已提交
997
        table_set.insert(collection);
998 999 1000 1001 1002
    }

    if (table_set.size() != tables.size()) {
        std::string msg =
            "Invalid preload tables. "
1003
            "Possible reason: db_config.preload_collection contains duplicate collection.";
1004
        return Status(SERVER_INVALID_ARGUMENT, msg);
1005 1006 1007 1008 1009
    }

    return Status::OK();
}

Y
yudong.cai 已提交
1010
Status
S
starlord 已提交
1011
Config::CheckDBConfigArchiveDiskThreshold(const std::string& value) {
S
shengjh 已提交
1012 1013 1014 1015
    auto exist_error = !ValidationUtil::ValidateStringIsNumber(value).ok();
    fiu_do_on("check_config_archive_disk_threshold_fail", exist_error = true);

    if (exist_error) {
1016
        std::string msg = "Invalid archive disk threshold: " + value +
S
starlord 已提交
1017
                          ". Possible reason: db_config.archive_disk_threshold is invalid.";
1018
        return Status(SERVER_INVALID_ARGUMENT, msg);
Z
zhiru 已提交
1019
    }
Y
yudong.cai 已提交
1020 1021
    return Status::OK();
}
Z
zhiru 已提交
1022

Y
yudong.cai 已提交
1023
Status
S
starlord 已提交
1024
Config::CheckDBConfigArchiveDaysThreshold(const std::string& value) {
S
shengjh 已提交
1025 1026 1027 1028
    auto exist_error = !ValidationUtil::ValidateStringIsNumber(value).ok();
    fiu_do_on("check_config_archive_days_threshold_fail", exist_error = true);

    if (exist_error) {
1029
        std::string msg = "Invalid archive days threshold: " + value +
1030
                          ". Possible reason: db_config.archive_days_threshold is invalid.";
1031
        return Status(SERVER_INVALID_ARGUMENT, msg);
Z
zhiru 已提交
1032
    }
Y
yudong.cai 已提交
1033 1034
    return Status::OK();
}
Z
zhiru 已提交
1035

1036 1037
Status
Config::CheckDBConfigAutoFlushInterval(const std::string& value) {
1038 1039 1040 1041
    auto exist_error = !ValidationUtil::ValidateStringIsNumber(value).ok();
    fiu_do_on("check_config_auto_flush_interval_fail", exist_error = true);

    if (exist_error) {
1042
        std::string msg = "Invalid db configuration auto_flush_interval: " + value +
1043
                          ". Possible reason: db.auto_flush_interval is not a natural number.";
1044 1045 1046 1047 1048 1049
        return Status(SERVER_INVALID_ARGUMENT, msg);
    }

    return Status::OK();
}

C
Cai Yudong 已提交
1050
/* storage config */
1051 1052
Status
Config::CheckStorageConfigPrimaryPath(const std::string& value) {
S
shengjh 已提交
1053
    fiu_return_on("check_config_primary_path_fail", Status(SERVER_INVALID_ARGUMENT, ""));
1054 1055 1056
    if (value.empty()) {
        return Status(SERVER_INVALID_ARGUMENT, "storage_config.db_path is empty.");
    }
1057 1058

    return ValidationUtil::ValidateStoragePath(value);
1059 1060 1061 1062
}

Status
Config::CheckStorageConfigSecondaryPath(const std::string& value) {
S
shengjh 已提交
1063
    fiu_return_on("check_config_secondary_path_fail", Status(SERVER_INVALID_ARGUMENT, ""));
1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087

    auto status = Status::OK();

    if (value.empty()) {
        return status;
    }

    std::vector<std::string> vec;
    StringHelpFunctions::SplitStringByDelimeter(value, ",", vec);
    std::unordered_set<std::string> path_set;
    for (auto& path : vec) {
        StringHelpFunctions::TrimStringBlank(path);
        status = ValidationUtil::ValidateStoragePath(path);
        if (!status.ok()) {
            return status;
        }

        path_set.insert(path);
    }

    if (path_set.size() != vec.size()) {
        return Status(SERVER_INVALID_ARGUMENT, "Path value is duplicated");
    }

1088 1089 1090
    return Status::OK();
}

C
Cai Yudong 已提交
1091
Status
1092
Config::CheckStorageConfigS3Enable(const std::string& value) {
C
Cai Yudong 已提交
1093 1094
    if (!ValidationUtil::ValidateStringIsBool(value).ok()) {
        std::string msg =
1095
            "Invalid storage config: " + value + ". Possible reason: storage_config.s3_enable is not a boolean.";
C
Cai Yudong 已提交
1096 1097 1098 1099 1100 1101
        return Status(SERVER_INVALID_ARGUMENT, msg);
    }
    return Status::OK();
}

Status
1102
Config::CheckStorageConfigS3Address(const std::string& value) {
C
Cai Yudong 已提交
1103
    if (!ValidationUtil::ValidateIpAddress(value).ok()) {
1104
        std::string msg = "Invalid s3 address: " + value + ". Possible reason: storage_config.s3_address is invalid.";
C
Cai Yudong 已提交
1105 1106 1107 1108 1109 1110
        return Status(SERVER_INVALID_ARGUMENT, msg);
    }
    return Status::OK();
}

Status
1111
Config::CheckStorageConfigS3Port(const std::string& value) {
C
Cai Yudong 已提交
1112
    if (!ValidationUtil::ValidateStringIsNumber(value).ok()) {
1113
        std::string msg = "Invalid s3 port: " + value + ". Possible reason: storage_config.s3_port is not a number.";
C
Cai Yudong 已提交
1114 1115
        return Status(SERVER_INVALID_ARGUMENT, msg);
    } else {
J
Jin Hai 已提交
1116 1117 1118 1119 1120 1121 1122 1123 1124
        try {
            int32_t port = std::stoi(value);
            if (!(port > PORT_NUMBER_MIN && port < PORT_NUMBER_MAX)) {
                std::string msg = "Invalid s3 port: " + value +
                                  ". Possible reason: storage_config.s3_port is not in range (1024, 65535).";
                return Status(SERVER_INVALID_ARGUMENT, msg);
            }
        } catch (...) {
            return Status(SERVER_INVALID_ARGUMENT, "Invalid storage_config.s3_port: " + value);
C
Cai Yudong 已提交
1125 1126 1127 1128 1129 1130
        }
    }
    return Status::OK();
}

Status
1131
Config::CheckStorageConfigS3AccessKey(const std::string& value) {
C
Cai Yudong 已提交
1132
    if (value.empty()) {
1133
        return Status(SERVER_INVALID_ARGUMENT, "storage_config.s3_access_key is empty.");
C
Cai Yudong 已提交
1134 1135 1136 1137 1138
    }
    return Status::OK();
}

Status
1139
Config::CheckStorageConfigS3SecretKey(const std::string& value) {
C
Cai Yudong 已提交
1140
    if (value.empty()) {
1141
        return Status(SERVER_INVALID_ARGUMENT, "storage_config.s3_secret_key is empty.");
C
Cai Yudong 已提交
1142 1143 1144 1145 1146
    }
    return Status::OK();
}

Status
1147
Config::CheckStorageConfigS3Bucket(const std::string& value) {
C
Cai Yudong 已提交
1148
    if (value.empty()) {
1149
        return Status(SERVER_INVALID_ARGUMENT, "storage_config.s3_bucket is empty.");
C
Cai Yudong 已提交
1150 1151 1152 1153 1154
    }
    return Status::OK();
}

/* metric config */
S
starlord 已提交
1155
Status
S
starlord 已提交
1156
Config::CheckMetricConfigEnableMonitor(const std::string& value) {
S
shengjh 已提交
1157 1158 1159 1160
    auto exist_error = !ValidationUtil::ValidateStringIsBool(value).ok();
    fiu_do_on("check_config_enable_monitor_fail", exist_error = true);

    if (exist_error) {
1161
        std::string msg =
S
starlord 已提交
1162
            "Invalid metric config: " + value + ". Possible reason: metric_config.enable_monitor is not a boolean.";
1163
        return Status(SERVER_INVALID_ARGUMENT, msg);
Z
zhiru 已提交
1164
    }
Y
yudong.cai 已提交
1165 1166
    return Status::OK();
}
Z
zhiru 已提交
1167

Y
yudong.cai 已提交
1168
Status
C
Cai Yudong 已提交
1169
Config::CheckMetricConfigAddress(const std::string& value) {
1170
    if (!ValidationUtil::ValidateIpAddress(value).ok()) {
C
Cai Yudong 已提交
1171
        std::string msg = "Invalid metric ip: " + value + ". Possible reason: metric_config.ip is invalid.";
1172
        return Status(SERVER_INVALID_ARGUMENT, msg);
1173 1174 1175 1176
    }
    return Status::OK();
}

Y
yudong.cai 已提交
1177
Status
C
Cai Yudong 已提交
1178
Config::CheckMetricConfigPort(const std::string& value) {
Y
yudong.cai 已提交
1179
    if (!ValidationUtil::ValidateStringIsNumber(value).ok()) {
C
Cai Yudong 已提交
1180
        std::string msg = "Invalid metric port: " + value + ". Possible reason: metric_config.port is not a number.";
C
Cai Yudong 已提交
1181 1182
        return Status(SERVER_INVALID_ARGUMENT, msg);
    } else {
J
Jin Hai 已提交
1183 1184 1185 1186 1187 1188 1189 1190 1191
        try {
            int32_t port = std::stoi(value);
            if (!(port > PORT_NUMBER_MIN && port < PORT_NUMBER_MAX)) {
                std::string msg = "Invalid metric port: " + value +
                                  ". Possible reason: metric_config.port is not in range (1024, 65535).";
                return Status(SERVER_INVALID_ARGUMENT, msg);
            }
        } catch (...) {
            return Status(SERVER_INVALID_ARGUMENT, "Invalid metric_config.port: " + value);
C
Cai Yudong 已提交
1192
        }
Z
zhiru 已提交
1193
    }
Y
yudong.cai 已提交
1194
    return Status::OK();
Z
zhiru 已提交
1195 1196
}

C
Cai Yudong 已提交
1197
/* cache config */
S
starlord 已提交
1198
Status
S
starlord 已提交
1199
Config::CheckCacheConfigCpuCacheCapacity(const std::string& value) {
S
shengjh 已提交
1200 1201
    fiu_return_on("check_config_cpu_cache_capacity_fail", Status(SERVER_INVALID_ARGUMENT, ""));

Y
yudong.cai 已提交
1202
    if (!ValidationUtil::ValidateStringIsNumber(value).ok()) {
1203
        std::string msg = "Invalid cpu cache capacity: " + value +
S
starlord 已提交
1204
                          ". Possible reason: cache_config.cpu_cache_capacity is not a positive integer.";
1205
        return Status(SERVER_INVALID_ARGUMENT, msg);
1206
    } else {
Y
yudong.cai 已提交
1207
        int64_t cpu_cache_capacity = std::stoll(value) * GB;
1208 1209
        if (cpu_cache_capacity <= 0) {
            std::string msg = "Invalid cpu cache capacity: " + value +
S
starlord 已提交
1210
                              ". Possible reason: cache_config.cpu_cache_capacity is not a positive integer.";
1211 1212 1213
            return Status(SERVER_INVALID_ARGUMENT, msg);
        }

S
starlord 已提交
1214
        uint64_t total_mem = 0, free_mem = 0;
Z
zhiru 已提交
1215
        CommonUtil::GetSystemMemInfo(total_mem, free_mem);
1216 1217
        if (static_cast<uint64_t>(cpu_cache_capacity) >= total_mem) {
            std::string msg = "Invalid cpu cache capacity: " + value +
S
starlord 已提交
1218
                              ". Possible reason: cache_config.cpu_cache_capacity exceeds system memory.";
1219
            return Status(SERVER_INVALID_ARGUMENT, msg);
1220
        } else if (static_cast<double>(cpu_cache_capacity) > static_cast<double>(total_mem * 0.9)) {
1221
            std::cerr << "WARNING: cpu cache capacity value is too big" << std::endl;
Z
zhiru 已提交
1222
        }
1223

1224
        std::string str = GetConfigStr(CONFIG_CACHE, CONFIG_CACHE_INSERT_BUFFER_SIZE, "0");
T
Tinkerrr 已提交
1225
        int64_t buffer_value = std::stoll(str);
S
starlord 已提交
1226

Y
yudong.cai 已提交
1227
        int64_t insert_buffer_size = buffer_value * GB;
S
shengjh 已提交
1228
        fiu_do_on("Config.CheckCacheConfigCpuCacheCapacity.large_insert_buffer", insert_buffer_size = total_mem + 1);
Y
yudong.cai 已提交
1229
        if (insert_buffer_size + cpu_cache_capacity >= total_mem) {
1230
            std::string msg = "Invalid cpu cache capacity: " + value +
S
starlord 已提交
1231
                              ". Possible reason: sum of cache_config.cpu_cache_capacity and "
1232
                              "cache_config.insert_buffer_size exceeds system memory.";
1233
            return Status(SERVER_INVALID_ARGUMENT, msg);
Z
zhiru 已提交
1234 1235
        }
    }
Y
yudong.cai 已提交
1236 1237
    return Status::OK();
}
Z
zhiru 已提交
1238

Y
yudong.cai 已提交
1239
Status
S
starlord 已提交
1240
Config::CheckCacheConfigCpuCacheThreshold(const std::string& value) {
S
shengjh 已提交
1241 1242
    fiu_return_on("check_config_cpu_cache_threshold_fail", Status(SERVER_INVALID_ARGUMENT, ""));

Y
yudong.cai 已提交
1243
    if (!ValidationUtil::ValidateStringIsFloat(value).ok()) {
1244
        std::string msg = "Invalid cpu cache threshold: " + value +
S
starlord 已提交
1245
                          ". Possible reason: cache_config.cpu_cache_threshold is not in range (0.0, 1.0].";
1246
        return Status(SERVER_INVALID_ARGUMENT, msg);
Y
yudong.cai 已提交
1247
    } else {
Y
yudong.cai 已提交
1248 1249
        float cpu_cache_threshold = std::stof(value);
        if (cpu_cache_threshold <= 0.0 || cpu_cache_threshold >= 1.0) {
1250
            std::string msg = "Invalid cpu cache threshold: " + value +
S
starlord 已提交
1251
                              ". Possible reason: cache_config.cpu_cache_threshold is not in range (0.0, 1.0].";
1252
            return Status(SERVER_INVALID_ARGUMENT, msg);
Y
yudong.cai 已提交
1253
        }
1254
    }
Y
yudong.cai 已提交
1255 1256
    return Status::OK();
}
1257

1258 1259
Status
Config::CheckCacheConfigInsertBufferSize(const std::string& value) {
S
shengjh 已提交
1260
    fiu_return_on("check_config_insert_buffer_size_fail", Status(SERVER_INVALID_ARGUMENT, ""));
1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272
    if (!ValidationUtil::ValidateStringIsNumber(value).ok()) {
        std::string msg = "Invalid insert buffer size: " + value +
                          ". Possible reason: cache_config.insert_buffer_size is not a positive integer.";
        return Status(SERVER_INVALID_ARGUMENT, msg);
    } else {
        int64_t buffer_size = std::stoll(value) * GB;
        if (buffer_size <= 0) {
            std::string msg = "Invalid insert buffer size: " + value +
                              ". Possible reason: cache_config.insert_buffer_size is not a positive integer.";
            return Status(SERVER_INVALID_ARGUMENT, msg);
        }

1273 1274
        std::string str = GetConfigStr(CONFIG_CACHE, CONFIG_CACHE_CPU_CACHE_CAPACITY, "0");
        int64_t cache_size = std::stoll(str) * GB;
T
Tinkerrr 已提交
1275

1276 1277
        uint64_t total_mem = 0, free_mem = 0;
        CommonUtil::GetSystemMemInfo(total_mem, free_mem);
T
Tinkerrr 已提交
1278
        if (buffer_size + cache_size >= total_mem) {
1279 1280 1281 1282 1283 1284 1285 1286
            std::string msg = "Invalid insert buffer size: " + value +
                              ". Possible reason: cache_config.insert_buffer_size exceeds system memory.";
            return Status(SERVER_INVALID_ARGUMENT, msg);
        }
    }
    return Status::OK();
}

Y
yudong.cai 已提交
1287
Status
S
starlord 已提交
1288
Config::CheckCacheConfigCacheInsertData(const std::string& value) {
S
shengjh 已提交
1289 1290
    fiu_return_on("check_config_cache_insert_data_fail", Status(SERVER_INVALID_ARGUMENT, ""));

Y
yudong.cai 已提交
1291
    if (!ValidationUtil::ValidateStringIsBool(value).ok()) {
1292
        std::string msg = "Invalid cache insert data option: " + value +
S
starlord 已提交
1293
                          ". Possible reason: cache_config.cache_insert_data is not a boolean.";
1294
        return Status(SERVER_INVALID_ARGUMENT, msg);
Y
yudong.cai 已提交
1295 1296
    }
    return Status::OK();
Z
zhiru 已提交
1297 1298
}

C
Cai Yudong 已提交
1299
/* engine config */
S
starlord 已提交
1300
Status
S
starlord 已提交
1301
Config::CheckEngineConfigUseBlasThreshold(const std::string& value) {
S
shengjh 已提交
1302 1303
    fiu_return_on("check_config_use_blas_threshold_fail", Status(SERVER_INVALID_ARGUMENT, ""));

Y
yudong.cai 已提交
1304
    if (!ValidationUtil::ValidateStringIsNumber(value).ok()) {
1305
        std::string msg = "Invalid use blas threshold: " + value +
S
starlord 已提交
1306
                          ". Possible reason: engine_config.use_blas_threshold is not a positive integer.";
1307
        return Status(SERVER_INVALID_ARGUMENT, msg);
Z
zhiru 已提交
1308
    }
Y
yudong.cai 已提交
1309 1310
    return Status::OK();
}
Z
zhiru 已提交
1311

Y
yudong.cai 已提交
1312
Status
S
starlord 已提交
1313
Config::CheckEngineConfigOmpThreadNum(const std::string& value) {
S
shengjh 已提交
1314 1315
    fiu_return_on("check_config_omp_thread_num_fail", Status(SERVER_INVALID_ARGUMENT, ""));

Y
yudong.cai 已提交
1316
    if (!ValidationUtil::ValidateStringIsNumber(value).ok()) {
1317
        std::string msg = "Invalid omp thread num: " + value +
S
starlord 已提交
1318
                          ". Possible reason: engine_config.omp_thread_num is not a positive integer.";
1319
        return Status(SERVER_INVALID_ARGUMENT, msg);
S
starlord 已提交
1320 1321
    }

Y
yudong.cai 已提交
1322 1323
    int64_t omp_thread = std::stoll(value);
    int64_t sys_thread_cnt = 8;
S
starlord 已提交
1324
    CommonUtil::GetSystemAvailableThreads(sys_thread_cnt);
Y
yudong.cai 已提交
1325
    if (omp_thread > sys_thread_cnt) {
1326
        std::string msg = "Invalid omp thread num: " + value +
S
starlord 已提交
1327
                          ". Possible reason: engine_config.omp_thread_num exceeds system cpu cores.";
1328
        return Status(SERVER_INVALID_ARGUMENT, msg);
Z
zhiru 已提交
1329
    }
Y
yudong.cai 已提交
1330
    return Status::OK();
Z
zhiru 已提交
1331 1332
}

C
Cai Yudong 已提交
1333
Status
F
feisiyicl 已提交
1334 1335 1336 1337 1338 1339
Config::CheckEngineConfigSimdType(const std::string& value) {
    fiu_return_on("check_config_simd_type_fail",
                  Status(SERVER_INVALID_ARGUMENT, "engine_config.simd_type is not one of avx512, avx2, sse and auto."));

    if (value != "avx512" && value != "avx2" && value != "sse" && value != "auto") {
        return Status(SERVER_INVALID_ARGUMENT, "engine_config.simd_type is not one of avx512, avx2, sse and auto.");
C
Cai Yudong 已提交
1340 1341 1342 1343
    }
    return Status::OK();
}

G
groot 已提交
1344
#ifdef MILVUS_GPU_VERSION
B
BossZou 已提交
1345

W
wxyu 已提交
1346
Status
1347
Config::CheckEngineConfigGpuSearchThreshold(const std::string& value) {
S
shengjh 已提交
1348 1349
    fiu_return_on("check_config_gpu_search_threshold_fail", Status(SERVER_INVALID_ARGUMENT, ""));

W
wxyu 已提交
1350
    if (!ValidationUtil::ValidateStringIsNumber(value).ok()) {
1351 1352
        std::string msg = "Invalid gpu search threshold: " + value +
                          ". Possible reason: engine_config.gpu_search_threshold is not a positive integer.";
W
wxyu 已提交
1353 1354 1355 1356 1357
        return Status(SERVER_INVALID_ARGUMENT, msg);
    }
    return Status::OK();
}

C
Cai Yudong 已提交
1358
/* gpu resource config */
S
starlord 已提交
1359
Status
1360
Config::CheckGpuResourceConfigEnable(const std::string& value) {
S
shengjh 已提交
1361 1362
    fiu_return_on("check_config_gpu_resource_enable_fail", Status(SERVER_INVALID_ARGUMENT, ""));

Y
yudong.cai 已提交
1363
    if (!ValidationUtil::ValidateStringIsBool(value).ok()) {
1364 1365
        std::string msg =
            "Invalid gpu resource config: " + value + ". Possible reason: gpu_resource_config.enable is not a boolean.";
1366
        return Status(SERVER_INVALID_ARGUMENT, msg);
W
wxyu 已提交
1367
    }
Y
yudong.cai 已提交
1368 1369
    return Status::OK();
}
1370

Y
yudong.cai 已提交
1371
Status
Y
yudong.cai 已提交
1372
Config::CheckGpuResourceConfigCacheCapacity(const std::string& value) {
S
shengjh 已提交
1373 1374
    fiu_return_on("check_gpu_resource_config_cache_capacity_fail", Status(SERVER_INVALID_ARGUMENT, ""));

Y
yudong.cai 已提交
1375 1376 1377
    if (!ValidationUtil::ValidateStringIsNumber(value).ok()) {
        std::string msg = "Invalid gpu cache capacity: " + value +
                          ". Possible reason: gpu_resource_config.cache_capacity is not a positive integer.";
1378
        return Status(SERVER_INVALID_ARGUMENT, msg);
Y
yudong.cai 已提交
1379
    } else {
Y
yudong.cai 已提交
1380 1381
        int64_t gpu_cache_capacity = std::stoll(value) * GB;
        std::vector<int64_t> gpu_ids;
C
Cai Yudong 已提交
1382
        CONFIG_CHECK(GetGpuResourceConfigBuildIndexResources(gpu_ids));
Y
yudong.cai 已提交
1383

Y
yudong.cai 已提交
1384
        for (int64_t gpu_id : gpu_ids) {
Y
yudong.cai 已提交
1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396
            size_t gpu_memory;
            if (!ValidationUtil::GetGpuMemory(gpu_id, gpu_memory).ok()) {
                std::string msg = "Fail to get GPU memory for GPU device: " + std::to_string(gpu_id);
                return Status(SERVER_UNEXPECTED_ERROR, msg);
            } else if (gpu_cache_capacity >= gpu_memory) {
                std::string msg = "Invalid gpu cache capacity: " + value +
                                  ". Possible reason: gpu_resource_config.cache_capacity exceeds GPU memory.";
                return Status(SERVER_INVALID_ARGUMENT, msg);
            } else if (gpu_cache_capacity > (double)gpu_memory * 0.9) {
                std::cerr << "Warning: gpu cache capacity value is too big" << std::endl;
            }
        }
W
wxyu 已提交
1397
    }
Y
yudong.cai 已提交
1398 1399
    return Status::OK();
}
1400

Y
yudong.cai 已提交
1401
Status
Y
yudong.cai 已提交
1402
Config::CheckGpuResourceConfigCacheThreshold(const std::string& value) {
S
shengjh 已提交
1403 1404
    fiu_return_on("check_config_gpu_resource_cache_threshold_fail", Status(SERVER_INVALID_ARGUMENT, ""));

Y
yudong.cai 已提交
1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421
    if (!ValidationUtil::ValidateStringIsFloat(value).ok()) {
        std::string msg = "Invalid gpu cache threshold: " + value +
                          ". Possible reason: gpu_resource_config.cache_threshold is not in range (0.0, 1.0].";
        return Status(SERVER_INVALID_ARGUMENT, msg);
    } else {
        float gpu_cache_threshold = std::stof(value);
        if (gpu_cache_threshold <= 0.0 || gpu_cache_threshold >= 1.0) {
            std::string msg = "Invalid gpu cache threshold: " + value +
                              ". Possible reason: gpu_resource_config.cache_threshold is not in range (0.0, 1.0].";
            return Status(SERVER_INVALID_ARGUMENT, msg);
        }
    }
    return Status::OK();
}

Status
CheckGpuResource(const std::string& value) {
Y
youny626 已提交
1422 1423
    std::string s = value;
    std::transform(s.begin(), s.end(), s.begin(), ::tolower);
Z
Zhiru Zhu 已提交
1424

Y
yudong.cai 已提交
1425
    const std::regex pat("gpu(\\d+)");
Z
Zhiru Zhu 已提交
1426 1427
    std::smatch m;
    if (!std::regex_match(s, m, pat)) {
Y
yudong.cai 已提交
1428 1429
        std::string msg = "Invalid gpu resource: " + value +
                          ". Possible reason: gpu_resource_config is not in the format of cpux or gpux";
1430
        return Status(SERVER_INVALID_ARGUMENT, msg);
1431 1432
    }

Z
Zhiru Zhu 已提交
1433
    if (s.compare(0, 3, "gpu") == 0) {
J
Jin Hai 已提交
1434 1435 1436 1437 1438 1439 1440 1441 1442
        try {
            int32_t gpu_index = std::stoi(s.substr(3));
            if (!ValidationUtil::ValidateGpuIndex(gpu_index).ok()) {
                std::string msg = "Invalid gpu resource: " + value +
                                  ". Possible reason: gpu_resource_config does not match with the hardware.";
                return Status(SERVER_INVALID_ARGUMENT, msg);
            }
        } catch (...) {
            return Status(SERVER_INVALID_ARGUMENT, "Invalid gpu_resource_config: " + value);
Z
Zhiru Zhu 已提交
1443
        }
1444
    }
Z
Zhiru Zhu 已提交
1445

1446 1447 1448 1449
    return Status::OK();
}

Status
Y
yudong.cai 已提交
1450
Config::CheckGpuResourceConfigSearchResources(const std::vector<std::string>& value) {
S
shengjh 已提交
1451 1452
    fiu_return_on("check_gpu_resource_config_search_fail", Status(SERVER_INVALID_ARGUMENT, ""));

Y
yudong.cai 已提交
1453
    if (value.empty()) {
1454
        std::string msg =
Y
yudong.cai 已提交
1455 1456
            "Invalid gpu search resource. "
            "Possible reason: gpu_resource_config.search_resources is empty.";
1457
        return Status(SERVER_INVALID_ARGUMENT, msg);
1458 1459
    }

B
BossZou 已提交
1460
    std::unordered_set<std::string> value_set;
Z
Zhiru Zhu 已提交
1461
    for (auto& resource : value) {
C
Cai Yudong 已提交
1462
        CONFIG_CHECK(CheckGpuResource(resource));
B
BossZou 已提交
1463
        value_set.insert(resource);
1464
    }
B
BossZou 已提交
1465 1466 1467 1468 1469 1470 1471 1472

    if (value_set.size() != value.size()) {
        std::string msg =
            "Invalid gpu build search resource. "
            "Possible reason: gpu_resource_config.gpu_search_resources contains duplicate resources.";
        return Status(SERVER_INVALID_ARGUMENT, msg);
    }

1473 1474 1475 1476
    return Status::OK();
}

Status
Y
yudong.cai 已提交
1477
Config::CheckGpuResourceConfigBuildIndexResources(const std::vector<std::string>& value) {
S
shengjh 已提交
1478 1479
    fiu_return_on("check_gpu_resource_config_build_index_fail", Status(SERVER_INVALID_ARGUMENT, ""));

1480 1481
    if (value.empty()) {
        std::string msg =
Y
yudong.cai 已提交
1482 1483
            "Invalid gpu build index resource. "
            "Possible reason: gpu_resource_config.build_index_resources is empty.";
1484 1485 1486
        return Status(SERVER_INVALID_ARGUMENT, msg);
    }

B
BossZou 已提交
1487
    std::unordered_set<std::string> value_set;
1488
    for (auto& resource : value) {
C
Cai Yudong 已提交
1489
        CONFIG_CHECK(CheckGpuResource(resource));
B
BossZou 已提交
1490 1491 1492 1493 1494 1495 1496 1497
        value_set.insert(resource);
    }

    if (value_set.size() != value.size()) {
        std::string msg =
            "Invalid gpu build index resource. "
            "Possible reason: gpu_resource_config.build_index_resources contains duplicate resources.";
        return Status(SERVER_INVALID_ARGUMENT, msg);
G
groot 已提交
1498
    }
1499

Y
yudong.cai 已提交
1500
    return Status::OK();
G
groot 已提交
1501
}
B
BossZou 已提交
1502

G
groot 已提交
1503
#endif
1504 1505 1506 1507 1508 1509 1510
/* tracing config */
Status
Config::CheckTracingConfigJsonConfigPath(const std::string& value) {
    std::string msg = "Invalid wal config: " + value +
                      ". Possible reason: tracing_config.json_config_path is not supported to configure.";
    return Status(SERVER_INVALID_ARGUMENT, msg);
}
G
groot 已提交
1511

C
Cai Yudong 已提交
1512 1513 1514
/* wal config */
Status
Config::CheckWalConfigEnable(const std::string& value) {
J
Jin Hai 已提交
1515 1516 1517 1518
    auto exist_error = !ValidationUtil::ValidateStringIsBool(value).ok();
    fiu_do_on("check_config_wal_enable_fail", exist_error = true);

    if (exist_error) {
C
Cai Yudong 已提交
1519 1520 1521 1522 1523 1524 1525 1526
        std::string msg = "Invalid wal config: " + value + ". Possible reason: wal_config.enable is not a boolean.";
        return Status(SERVER_INVALID_ARGUMENT, msg);
    }
    return Status::OK();
}

Status
Config::CheckWalConfigRecoveryErrorIgnore(const std::string& value) {
J
Jin Hai 已提交
1527 1528 1529 1530
    auto exist_error = !ValidationUtil::ValidateStringIsBool(value).ok();
    fiu_do_on("check_config_wal_recovery_error_ignore_fail", exist_error = true);

    if (exist_error) {
C
Cai Yudong 已提交
1531 1532 1533 1534 1535 1536 1537 1538 1539
        std::string msg =
            "Invalid wal config: " + value + ". Possible reason: wal_config.recovery_error_ignore is not a boolean.";
        return Status(SERVER_INVALID_ARGUMENT, msg);
    }
    return Status::OK();
}

Status
Config::CheckWalConfigBufferSize(const std::string& value) {
J
Jin Hai 已提交
1540 1541 1542 1543
    auto exist_error = !ValidationUtil::ValidateStringIsNumber(value).ok();
    fiu_do_on("check_config_wal_buffer_size_fail", exist_error = true);

    if (exist_error) {
C
Cai Yudong 已提交
1544 1545 1546 1547 1548 1549 1550
        std::string msg = "Invalid wal buffer size: " + value +
                          ". Possible reason: wal_config.buffer_size is not a positive integer.";
        return Status(SERVER_INVALID_ARGUMENT, msg);
    }
    return Status::OK();
}

J
Jin Hai 已提交
1551 1552 1553 1554 1555 1556 1557 1558 1559 1560
Status
Config::CheckWalConfigWalPath(const std::string& value) {
    fiu_return_on("check_wal_path_fail", Status(SERVER_INVALID_ARGUMENT, ""));
    if (value.empty()) {
        return Status(SERVER_INVALID_ARGUMENT, "wal_config.wal_path is empty!");
    }

    return ValidationUtil::ValidateStoragePath(value);
}

W
Wang XiangYu 已提交
1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643
/* logs config */
Status
Config::CheckLogsTraceEnable(const std::string& value) {
    auto exist_error = !ValidationUtil::ValidateStringIsBool(value).ok();
    fiu_do_on("check_logs_trace_enable_fail", exist_error = true);

    if (exist_error) {
        std::string msg = "Invalid logs config: " + value + ". Possible reason: logs.trace.enable is not a boolean.";
        return Status(SERVER_INVALID_ARGUMENT, msg);
    }
    return Status::OK();
}

Status
Config::CheckLogsDebugEnable(const std::string& value) {
    auto exist_error = !ValidationUtil::ValidateStringIsBool(value).ok();
    fiu_do_on("check_logs_debug_enable_fail", exist_error = true);

    if (exist_error) {
        std::string msg = "Invalid logs config: " + value + ". Possible reason: logs.debug.enable is not a boolean.";
        return Status(SERVER_INVALID_ARGUMENT, msg);
    }
    return Status::OK();
}

Status
Config::CheckLogsInfoEnable(const std::string& value) {
    auto exist_error = !ValidationUtil::ValidateStringIsBool(value).ok();
    fiu_do_on("check_logs_info_enable_fail", exist_error = true);

    if (exist_error) {
        std::string msg = "Invalid logs config: " + value + ". Possible reason: logs.info.enable is not a boolean.";
        return Status(SERVER_INVALID_ARGUMENT, msg);
    }
    return Status::OK();
}

Status
Config::CheckLogsWarningEnable(const std::string& value) {
    auto exist_error = !ValidationUtil::ValidateStringIsBool(value).ok();
    fiu_do_on("check_logs_warning_enable_fail", exist_error = true);

    if (exist_error) {
        std::string msg = "Invalid logs config: " + value + ". Possible reason: logs.warning.enable is not a boolean.";
        return Status(SERVER_INVALID_ARGUMENT, msg);
    }
    return Status::OK();
}

Status
Config::CheckLogsErrorEnable(const std::string& value) {
    auto exist_error = !ValidationUtil::ValidateStringIsBool(value).ok();
    fiu_do_on("check_logs_error_enable_fail", exist_error = true);

    if (exist_error) {
        std::string msg = "Invalid logs config: " + value + ". Possible reason: logs.error.enable is not a boolean.";
        return Status(SERVER_INVALID_ARGUMENT, msg);
    }
    return Status::OK();
}

Status
Config::CheckLogsFatalEnable(const std::string& value) {
    auto exist_error = !ValidationUtil::ValidateStringIsBool(value).ok();
    fiu_do_on("check_logs_fatal_enable_fail", exist_error = true);

    if (exist_error) {
        std::string msg = "Invalid logs config: " + value + ". Possible reason: logs.fatal.enable is not a boolean.";
        return Status(SERVER_INVALID_ARGUMENT, msg);
    }
    return Status::OK();
}

Status
Config::CheckLogsPath(const std::string& value) {
    fiu_return_on("check_logs_path_fail", Status(SERVER_INVALID_ARGUMENT, ""));
    if (value.empty()) {
        return Status(SERVER_INVALID_ARGUMENT, "logs.path is empty!");
    }

    return ValidationUtil::ValidateStoragePath(value);
}

W
Wang XiangYu 已提交
1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669
Status
Config::CheckLogsMaxLogFileSize(const std::string& value) {
    auto exist_error = !ValidationUtil::ValidateStringIsNumber(value).ok();
    fiu_do_on("check_logs_max_log_file_size_fail", exist_error = true);

    if (exist_error) {
        std::string msg = "Invalid max_log_file_size: " + value +
                          ". Possible reason: logs.max_log_file_size is not a positive integer.";
        return Status(SERVER_INVALID_ARGUMENT, msg);
    }
    return Status::OK();
}

Status
Config::CheckLogsDeleteExceeds(const std::string& value) {
    auto exist_error = !ValidationUtil::ValidateStringIsNumber(value).ok();
    fiu_do_on("check_logs_delete_exceeds_fail", exist_error = true);

    if (exist_error) {
        std::string msg = "Invalid max_log_file_size: " + value +
                          ". Possible reason: logs.max_log_file_size is not a positive integer.";
        return Status(SERVER_INVALID_ARGUMENT, msg);
    }
    return Status::OK();
}

Y
yudong.cai 已提交
1670
////////////////////////////////////////////////////////////////////////////////
S
starlord 已提交
1671
ConfigNode&
1672
Config::GetConfigRoot() {
1673
    ConfigMgr* mgr = YamlConfigMgr::GetInstance();
1674 1675 1676 1677 1678 1679
    return mgr->GetRootNode();
}

ConfigNode&
Config::GetConfigNode(const std::string& name) {
    return GetConfigRoot().GetChild(name);
G
groot 已提交
1680 1681
}

C
Cai Yudong 已提交
1682 1683 1684 1685 1686
bool
Config::ConfigNodeValid(const std::string& parent_key, const std::string& child_key) {
    if (config_map_.find(parent_key) == config_map_.end()) {
        return false;
    }
S
shengjh 已提交
1687
    return config_map_[parent_key].count(child_key) != 0;
C
Cai Yudong 已提交
1688 1689
}

Y
yudong.cai 已提交
1690
Status
S
starlord 已提交
1691
Config::GetConfigValueInMem(const std::string& parent_key, const std::string& child_key, std::string& value) {
Y
yudong.cai 已提交
1692
    std::lock_guard<std::mutex> lock(mutex_);
Y
yudong.cai 已提交
1693 1694 1695 1696 1697
    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 已提交
1698
    return Status(SERVER_UNEXPECTED_ERROR, "key not exist");
Y
yudong.cai 已提交
1699 1700
}

C
Cai Yudong 已提交
1701
Status
S
starlord 已提交
1702
Config::SetConfigValueInMem(const std::string& parent_key, const std::string& child_key, const std::string& value) {
Y
yudong.cai 已提交
1703 1704
    std::lock_guard<std::mutex> lock(mutex_);
    config_map_[parent_key][child_key] = value;
C
Cai Yudong 已提交
1705
    return Status::OK();
Y
yudong.cai 已提交
1706 1707 1708
}

////////////////////////////////////////////////////////////////////////////////
Y
yudong.cai 已提交
1709
std::string
S
starlord 已提交
1710
Config::GetConfigStr(const std::string& parent_key, const std::string& child_key, const std::string& default_value) {
Y
yudong.cai 已提交
1711
    std::string value;
S
starlord 已提交
1712 1713 1714
    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 已提交
1715
    }
Y
yudong.cai 已提交
1716
    return value;
Y
yudong.cai 已提交
1717 1718
}

Z
Zhiru Zhu 已提交
1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734
std::string
Config::GetConfigSequenceStr(const std::string& parent_key, const std::string& child_key, const std::string& delim,
                             const std::string& default_value) {
    std::string value;
    if (!GetConfigValueInMem(parent_key, child_key, value).ok()) {
        std::vector<std::string> sequence = GetConfigNode(parent_key).GetSequence(child_key);
        if (sequence.empty()) {
            value = default_value;
        } else {
            server::StringHelpFunctions::MergeStringWithDelimeter(sequence, delim, value);
        }
        SetConfigValueInMem(parent_key, child_key, value);
    }
    return value;
}

1735 1736 1737 1738 1739 1740
Status
Config::GetConfigVersion(std::string& value) {
    value = GetConfigRoot().GetValue(CONFIG_VERSION);
    return CheckConfigVersion(value);
}

1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766
Status
Config::ExecCallBacks(const std::string& node, const std::string& sub_node, const std::string& value) {
    auto status = Status::OK();

    if (config_callback_.empty()) {
        return Status(SERVER_UNEXPECTED_ERROR, "Callback map is empty. Cannot take effect in-service");
    }

    std::string cb_node = node + "." + sub_node;
    if (config_callback_.find(cb_node) == config_callback_.end()) {
        return Status(SERVER_UNEXPECTED_ERROR,
                      "Cannot find " + cb_node + " in callback map, cannot take effect in-service");
    }

    auto& cb_map = config_callback_.at(cb_node);
    for (auto& cb_kv : cb_map) {
        auto& cd = cb_kv.second;
        status = cd(value);
        if (!status.ok()) {
            break;
        }
    }

    return status;
}

C
Cai Yudong 已提交
1767
/* server config */
1768
Status
S
starlord 已提交
1769
Config::GetServerConfigAddress(std::string& value) {
S
starlord 已提交
1770
    value = GetConfigStr(CONFIG_SERVER, CONFIG_SERVER_ADDRESS, CONFIG_SERVER_ADDRESS_DEFAULT);
Y
yudong.cai 已提交
1771
    return CheckServerConfigAddress(value);
1772 1773 1774
}

Status
S
starlord 已提交
1775
Config::GetServerConfigPort(std::string& value) {
S
starlord 已提交
1776
    value = GetConfigStr(CONFIG_SERVER, CONFIG_SERVER_PORT, CONFIG_SERVER_PORT_DEFAULT);
Y
yudong.cai 已提交
1777
    return CheckServerConfigPort(value);
1778 1779 1780
}

Status
S
starlord 已提交
1781
Config::GetServerConfigDeployMode(std::string& value) {
S
starlord 已提交
1782
    value = GetConfigStr(CONFIG_SERVER, CONFIG_SERVER_DEPLOY_MODE, CONFIG_SERVER_DEPLOY_MODE_DEFAULT);
Y
yudong.cai 已提交
1783
    return CheckServerConfigDeployMode(value);
1784 1785 1786
}

Status
S
starlord 已提交
1787
Config::GetServerConfigTimeZone(std::string& value) {
S
starlord 已提交
1788
    value = GetConfigStr(CONFIG_SERVER, CONFIG_SERVER_TIME_ZONE, CONFIG_SERVER_TIME_ZONE_DEFAULT);
Y
yudong.cai 已提交
1789
    return CheckServerConfigTimeZone(value);
1790 1791
}

1792 1793 1794 1795 1796 1797 1798
Status
Config::GetServerConfigWebEnable(bool& value) {
    std::string str = GetConfigStr(CONFIG_SERVER, CONFIG_SERVER_WEB_ENABLE, CONFIG_SERVER_WEB_ENABLE_DEFAULT);
    CONFIG_CHECK(CheckServerConfigWebEnable(str));
    return StringHelpFunctions::ConvertToBoolean(str, value);
}

B
BossZou 已提交
1799 1800 1801 1802 1803 1804
Status
Config::GetServerConfigWebPort(std::string& value) {
    value = GetConfigStr(CONFIG_SERVER, CONFIG_SERVER_WEB_PORT, CONFIG_SERVER_WEB_PORT_DEFAULT);
    return CheckServerConfigWebPort(value);
}

C
Cai Yudong 已提交
1805
/* DB config */
1806
Status
S
starlord 已提交
1807
Config::GetDBConfigBackendUrl(std::string& value) {
S
starlord 已提交
1808
    value = GetConfigStr(CONFIG_DB, CONFIG_DB_BACKEND_URL, CONFIG_DB_BACKEND_URL_DEFAULT);
Y
yudong.cai 已提交
1809
    return CheckDBConfigBackendUrl(value);
1810 1811 1812
}

Status
Y
yudong.cai 已提交
1813
Config::GetDBConfigArchiveDiskThreshold(int64_t& value) {
S
starlord 已提交
1814 1815
    std::string str =
        GetConfigStr(CONFIG_DB, CONFIG_DB_ARCHIVE_DISK_THRESHOLD, CONFIG_DB_ARCHIVE_DISK_THRESHOLD_DEFAULT);
C
Cai Yudong 已提交
1816
    CONFIG_CHECK(CheckDBConfigArchiveDiskThreshold(str));
Y
yudong.cai 已提交
1817
    value = std::stoll(str);
1818 1819 1820 1821
    return Status::OK();
}

Status
Y
yudong.cai 已提交
1822
Config::GetDBConfigArchiveDaysThreshold(int64_t& value) {
S
starlord 已提交
1823 1824
    std::string str =
        GetConfigStr(CONFIG_DB, CONFIG_DB_ARCHIVE_DAYS_THRESHOLD, CONFIG_DB_ARCHIVE_DAYS_THRESHOLD_DEFAULT);
C
Cai Yudong 已提交
1825
    CONFIG_CHECK(CheckDBConfigArchiveDaysThreshold(str));
Y
yudong.cai 已提交
1826
    value = std::stoll(str);
1827 1828 1829
    return Status::OK();
}

S
starlord 已提交
1830
Status
1831
Config::GetDBConfigPreloadCollection(std::string& value) {
G
groot 已提交
1832
    value = GetConfigStr(CONFIG_DB, CONFIG_DB_PRELOAD_COLLECTION);
S
starlord 已提交
1833 1834 1835
    return Status::OK();
}

1836
Status
C
Cai Yudong 已提交
1837
Config::GetDBConfigAutoFlushInterval(int64_t& value) {
1838
    std::string str = GetConfigStr(CONFIG_DB, CONFIG_DB_AUTO_FLUSH_INTERVAL, CONFIG_DB_AUTO_FLUSH_INTERVAL_DEFAULT);
C
Cai Yudong 已提交
1839 1840
    CONFIG_CHECK(CheckDBConfigAutoFlushInterval(str));
    value = std::stoll(str);
1841 1842 1843
    return Status::OK();
}

C
Cai Yudong 已提交
1844
/* storage config */
1845 1846
Status
Config::GetStorageConfigPrimaryPath(std::string& value) {
C
Cai Yudong 已提交
1847
    value = GetConfigStr(CONFIG_STORAGE, CONFIG_STORAGE_PRIMARY_PATH, CONFIG_STORAGE_PRIMARY_PATH_DEFAULT);
1848 1849 1850 1851 1852
    return CheckStorageConfigPrimaryPath(value);
}

Status
Config::GetStorageConfigSecondaryPath(std::string& value) {
C
Cai Yudong 已提交
1853
    value = GetConfigStr(CONFIG_STORAGE, CONFIG_STORAGE_SECONDARY_PATH, CONFIG_STORAGE_SECONDARY_PATH_DEFAULT);
1854 1855 1856
    return CheckStorageConfigSecondaryPath(value);
}

C
Cai Yudong 已提交
1857
Status
1858 1859 1860
Config::GetStorageConfigS3Enable(bool& value) {
    std::string str = GetConfigStr(CONFIG_STORAGE, CONFIG_STORAGE_S3_ENABLE, CONFIG_STORAGE_S3_ENABLE_DEFAULT);
    CONFIG_CHECK(CheckStorageConfigS3Enable(str));
Y
Yhz 已提交
1861
    CONFIG_CHECK(StringHelpFunctions::ConvertToBoolean(str, value));
C
Cai Yudong 已提交
1862 1863 1864 1865
    return Status::OK();
}

Status
1866 1867 1868
Config::GetStorageConfigS3Address(std::string& value) {
    value = GetConfigStr(CONFIG_STORAGE, CONFIG_STORAGE_S3_ADDRESS, CONFIG_STORAGE_S3_ADDRESS_DEFAULT);
    return CheckStorageConfigS3Address(value);
C
Cai Yudong 已提交
1869 1870 1871
}

Status
1872 1873 1874
Config::GetStorageConfigS3Port(std::string& value) {
    value = GetConfigStr(CONFIG_STORAGE, CONFIG_STORAGE_S3_PORT, CONFIG_STORAGE_S3_PORT_DEFAULT);
    return CheckStorageConfigS3Port(value);
C
Cai Yudong 已提交
1875 1876 1877
}

Status
1878 1879
Config::GetStorageConfigS3AccessKey(std::string& value) {
    value = GetConfigStr(CONFIG_STORAGE, CONFIG_STORAGE_S3_ACCESS_KEY, CONFIG_STORAGE_S3_ACCESS_KEY_DEFAULT);
C
Cai Yudong 已提交
1880 1881 1882 1883
    return Status::OK();
}

Status
1884 1885
Config::GetStorageConfigS3SecretKey(std::string& value) {
    value = GetConfigStr(CONFIG_STORAGE, CONFIG_STORAGE_S3_SECRET_KEY, CONFIG_STORAGE_S3_SECRET_KEY_DEFAULT);
C
Cai Yudong 已提交
1886 1887 1888 1889
    return Status::OK();
}

Status
1890 1891
Config::GetStorageConfigS3Bucket(std::string& value) {
    value = GetConfigStr(CONFIG_STORAGE, CONFIG_STORAGE_S3_BUCKET, CONFIG_STORAGE_S3_BUCKET_DEFAULT);
C
Cai Yudong 已提交
1892 1893 1894 1895
    return Status::OK();
}

/* metric config */
1896
Status
S
starlord 已提交
1897
Config::GetMetricConfigEnableMonitor(bool& value) {
1898
    std::string str = GetConfigStr(CONFIG_METRIC, CONFIG_METRIC_ENABLE_MONITOR, CONFIG_METRIC_ENABLE_MONITOR_DEFAULT);
C
Cai Yudong 已提交
1899
    CONFIG_CHECK(CheckMetricConfigEnableMonitor(str));
Y
Yhz 已提交
1900
    CONFIG_CHECK(StringHelpFunctions::ConvertToBoolean(str, value));
1901 1902 1903 1904
    return Status::OK();
}

Status
C
Cai Yudong 已提交
1905 1906
Config::GetMetricConfigAddress(std::string& value) {
    value = GetConfigStr(CONFIG_METRIC, CONFIG_METRIC_ADDRESS, CONFIG_METRIC_ADDRESS_DEFAULT);
Y
yudong.cai 已提交
1907
    return Status::OK();
1908 1909
}

1910
Status
C
Cai Yudong 已提交
1911 1912 1913
Config::GetMetricConfigPort(std::string& value) {
    value = GetConfigStr(CONFIG_METRIC, CONFIG_METRIC_PORT, CONFIG_METRIC_PORT_DEFAULT);
    return CheckMetricConfigPort(value);
1914 1915
}

C
Cai Yudong 已提交
1916
/* cache config */
1917
Status
W
wxyu 已提交
1918
Config::GetCacheConfigCpuCacheCapacity(int64_t& value) {
S
starlord 已提交
1919 1920
    std::string str =
        GetConfigStr(CONFIG_CACHE, CONFIG_CACHE_CPU_CACHE_CAPACITY, CONFIG_CACHE_CPU_CACHE_CAPACITY_DEFAULT);
C
Cai Yudong 已提交
1921
    CONFIG_CHECK(CheckCacheConfigCpuCacheCapacity(str));
Y
yudong.cai 已提交
1922
    value = std::stoll(str);
1923 1924 1925 1926
    return Status::OK();
}

Status
S
starlord 已提交
1927
Config::GetCacheConfigCpuCacheThreshold(float& value) {
S
starlord 已提交
1928 1929
    std::string str =
        GetConfigStr(CONFIG_CACHE, CONFIG_CACHE_CPU_CACHE_THRESHOLD, CONFIG_CACHE_CPU_CACHE_THRESHOLD_DEFAULT);
C
Cai Yudong 已提交
1930
    CONFIG_CHECK(CheckCacheConfigCpuCacheThreshold(str));
1931 1932 1933 1934
    value = std::stof(str);
    return Status::OK();
}

1935 1936 1937 1938 1939 1940 1941 1942 1943
Status
Config::GetCacheConfigInsertBufferSize(int64_t& value) {
    std::string str =
        GetConfigStr(CONFIG_CACHE, CONFIG_CACHE_INSERT_BUFFER_SIZE, CONFIG_CACHE_INSERT_BUFFER_SIZE_DEFAULT);
    CONFIG_CHECK(CheckCacheConfigInsertBufferSize(str));
    value = std::stoll(str);
    return Status::OK();
}

1944
Status
S
starlord 已提交
1945
Config::GetCacheConfigCacheInsertData(bool& value) {
S
starlord 已提交
1946 1947
    std::string str =
        GetConfigStr(CONFIG_CACHE, CONFIG_CACHE_CACHE_INSERT_DATA, CONFIG_CACHE_CACHE_INSERT_DATA_DEFAULT);
C
Cai Yudong 已提交
1948
    CONFIG_CHECK(CheckCacheConfigCacheInsertData(str));
1949 1950 1951 1952 1953
    std::transform(str.begin(), str.end(), str.begin(), ::tolower);
    value = (str == "true" || str == "on" || str == "yes" || str == "1");
    return Status::OK();
}

C
Cai Yudong 已提交
1954
/* engine config */
1955
Status
Y
yudong.cai 已提交
1956
Config::GetEngineConfigUseBlasThreshold(int64_t& value) {
S
starlord 已提交
1957 1958
    std::string str =
        GetConfigStr(CONFIG_ENGINE, CONFIG_ENGINE_USE_BLAS_THRESHOLD, CONFIG_ENGINE_USE_BLAS_THRESHOLD_DEFAULT);
C
Cai Yudong 已提交
1959
    CONFIG_CHECK(CheckEngineConfigUseBlasThreshold(str));
Y
yudong.cai 已提交
1960
    value = std::stoll(str);
1961 1962 1963 1964
    return Status::OK();
}

Status
Y
yudong.cai 已提交
1965
Config::GetEngineConfigOmpThreadNum(int64_t& value) {
1966
    std::string str = GetConfigStr(CONFIG_ENGINE, CONFIG_ENGINE_OMP_THREAD_NUM, CONFIG_ENGINE_OMP_THREAD_NUM_DEFAULT);
C
Cai Yudong 已提交
1967
    CONFIG_CHECK(CheckEngineConfigOmpThreadNum(str));
Y
yudong.cai 已提交
1968
    value = std::stoll(str);
1969 1970 1971
    return Status::OK();
}

C
Cai Yudong 已提交
1972
Status
F
feisiyicl 已提交
1973 1974 1975
Config::GetEngineConfigSimdType(std::string& value) {
    value = GetConfigStr(CONFIG_ENGINE, CONFIG_ENGINE_SIMD_TYPE, CONFIG_ENGINE_SIMD_TYPE_DEFAULT);
    return CheckEngineConfigSimdType(value);
C
Cai Yudong 已提交
1976 1977
}

G
groot 已提交
1978
#ifdef MILVUS_GPU_VERSION
B
BossZou 已提交
1979

W
wxyu 已提交
1980
Status
Y
yudong.cai 已提交
1981
Config::GetEngineConfigGpuSearchThreshold(int64_t& value) {
W
wxyu 已提交
1982
    std::string str =
1983
        GetConfigStr(CONFIG_ENGINE, CONFIG_ENGINE_GPU_SEARCH_THRESHOLD, CONFIG_ENGINE_GPU_SEARCH_THRESHOLD_DEFAULT);
C
Cai Yudong 已提交
1984
    CONFIG_CHECK(CheckEngineConfigGpuSearchThreshold(str));
Y
yudong.cai 已提交
1985
    value = std::stoll(str);
W
wxyu 已提交
1986 1987
    return Status::OK();
}
S
shengjh 已提交
1988

C
Cai Yudong 已提交
1989
#endif
W
wxyu 已提交
1990

C
Cai Yudong 已提交
1991 1992
/* gpu resource config */
#ifdef MILVUS_GPU_VERSION
S
shengjh 已提交
1993

1994
Status
1995 1996
Config::GetGpuResourceConfigEnable(bool& value) {
    std::string str = GetConfigStr(CONFIG_GPU_RESOURCE, CONFIG_GPU_RESOURCE_ENABLE, CONFIG_GPU_RESOURCE_ENABLE_DEFAULT);
C
Cai Yudong 已提交
1997
    CONFIG_CHECK(CheckGpuResourceConfigEnable(str));
Y
Yhz 已提交
1998
    CONFIG_CHECK(StringHelpFunctions::ConvertToBoolean(str, value));
Y
yudong.cai 已提交
1999
    return Status::OK();
2000 2001 2002
}

Status
Y
yudong.cai 已提交
2003
Config::GetGpuResourceConfigCacheCapacity(int64_t& value) {
2004
    bool gpu_resource_enable = false;
C
Cai Yudong 已提交
2005
    CONFIG_CHECK(GetGpuResourceConfigEnable(gpu_resource_enable));
S
shengjh 已提交
2006
    fiu_do_on("Config.GetGpuResourceConfigCacheCapacity.diable_gpu_resource", gpu_resource_enable = false);
2007 2008
    if (!gpu_resource_enable) {
        std::string msg = "GPU not supported. Possible reason: gpu_resource_config.enable is set to false.";
Y
yudong.cai 已提交
2009 2010 2011 2012
        return Status(SERVER_UNSUPPORTED_ERROR, msg);
    }
    std::string str = GetConfigStr(CONFIG_GPU_RESOURCE, CONFIG_GPU_RESOURCE_CACHE_CAPACITY,
                                   CONFIG_GPU_RESOURCE_CACHE_CAPACITY_DEFAULT);
C
Cai Yudong 已提交
2013
    CONFIG_CHECK(CheckGpuResourceConfigCacheCapacity(str));
Y
yudong.cai 已提交
2014
    value = std::stoll(str);
W
wxyu 已提交
2015 2016 2017
    return Status::OK();
}

2018
Status
Y
yudong.cai 已提交
2019
Config::GetGpuResourceConfigCacheThreshold(float& value) {
2020
    bool gpu_resource_enable = false;
C
Cai Yudong 已提交
2021
    CONFIG_CHECK(GetGpuResourceConfigEnable(gpu_resource_enable));
S
shengjh 已提交
2022
    fiu_do_on("Config.GetGpuResourceConfigCacheThreshold.diable_gpu_resource", gpu_resource_enable = false);
2023 2024
    if (!gpu_resource_enable) {
        std::string msg = "GPU not supported. Possible reason: gpu_resource_config.enable is set to false.";
Y
yudong.cai 已提交
2025 2026 2027 2028
        return Status(SERVER_UNSUPPORTED_ERROR, msg);
    }
    std::string str = GetConfigStr(CONFIG_GPU_RESOURCE, CONFIG_GPU_RESOURCE_CACHE_THRESHOLD,
                                   CONFIG_GPU_RESOURCE_CACHE_THRESHOLD_DEFAULT);
C
Cai Yudong 已提交
2029
    CONFIG_CHECK(CheckGpuResourceConfigCacheThreshold(str));
Y
yudong.cai 已提交
2030 2031
    value = std::stof(str);
    return Status::OK();
2032 2033 2034
}

Status
Y
yudong.cai 已提交
2035
Config::GetGpuResourceConfigSearchResources(std::vector<int64_t>& value) {
2036
    bool gpu_resource_enable = false;
C
Cai Yudong 已提交
2037
    CONFIG_CHECK(GetGpuResourceConfigEnable(gpu_resource_enable));
S
shengjh 已提交
2038
    fiu_do_on("get_gpu_config_search_resources.disable_gpu_resource_fail", gpu_resource_enable = false);
2039 2040
    if (!gpu_resource_enable) {
        std::string msg = "GPU not supported. Possible reason: gpu_resource_config.enable is set to false.";
Y
yudong.cai 已提交
2041 2042 2043 2044 2045 2046
        return Status(SERVER_UNSUPPORTED_ERROR, msg);
    }
    std::string str = GetConfigSequenceStr(CONFIG_GPU_RESOURCE, CONFIG_GPU_RESOURCE_SEARCH_RESOURCES,
                                           CONFIG_GPU_RESOURCE_DELIMITER, CONFIG_GPU_RESOURCE_SEARCH_RESOURCES_DEFAULT);
    std::vector<std::string> res_vec;
    server::StringHelpFunctions::SplitStringByDelimeter(str, CONFIG_GPU_RESOURCE_DELIMITER, res_vec);
C
Cai Yudong 已提交
2047
    CONFIG_CHECK(CheckGpuResourceConfigSearchResources(res_vec));
2048
    value.clear();
Y
yudong.cai 已提交
2049
    for (std::string& res : res_vec) {
Y
yudong.cai 已提交
2050
        value.push_back(std::stoll(res.substr(3)));
Y
yudong.cai 已提交
2051 2052
    }
    return Status::OK();
2053 2054 2055
}

Status
Y
yudong.cai 已提交
2056
Config::GetGpuResourceConfigBuildIndexResources(std::vector<int64_t>& value) {
2057
    bool gpu_resource_enable = false;
C
Cai Yudong 已提交
2058
    CONFIG_CHECK(GetGpuResourceConfigEnable(gpu_resource_enable));
S
shengjh 已提交
2059
    fiu_do_on("get_gpu_config_build_index_resources.disable_gpu_resource_fail", gpu_resource_enable = false);
2060 2061
    if (!gpu_resource_enable) {
        std::string msg = "GPU not supported. Possible reason: gpu_resource_config.enable is set to false.";
Y
yudong.cai 已提交
2062 2063
        return Status(SERVER_UNSUPPORTED_ERROR, msg);
    }
2064
    std::string str =
Y
yudong.cai 已提交
2065 2066 2067 2068
        GetConfigSequenceStr(CONFIG_GPU_RESOURCE, CONFIG_GPU_RESOURCE_BUILD_INDEX_RESOURCES,
                             CONFIG_GPU_RESOURCE_DELIMITER, CONFIG_GPU_RESOURCE_BUILD_INDEX_RESOURCES_DEFAULT);
    std::vector<std::string> res_vec;
    server::StringHelpFunctions::SplitStringByDelimeter(str, CONFIG_GPU_RESOURCE_DELIMITER, res_vec);
C
Cai Yudong 已提交
2069
    CONFIG_CHECK(CheckGpuResourceConfigBuildIndexResources(res_vec));
2070
    value.clear();
Y
yudong.cai 已提交
2071
    for (std::string& res : res_vec) {
Y
yudong.cai 已提交
2072
        value.push_back(std::stoll(res.substr(3)));
Y
yudong.cai 已提交
2073
    }
2074
    return Status::OK();
Y
yudong.cai 已提交
2075
}
B
BossZou 已提交
2076

G
groot 已提交
2077
#endif
G
groot 已提交
2078

Z
Zhiru Zhu 已提交
2079 2080 2081 2082
/* tracing config */
Status
Config::GetTracingConfigJsonConfigPath(std::string& value) {
    value = GetConfigStr(CONFIG_TRACING, CONFIG_TRACING_JSON_CONFIG_PATH, "");
S
shengjh 已提交
2083
    fiu_do_on("get_config_json_config_path_fail", value = "error_config_json_path");
Z
Zhiru Zhu 已提交
2084 2085 2086 2087 2088 2089 2090 2091 2092 2093 2094
    if (!value.empty()) {
        std::ifstream tracer_config(value);
        Status s = tracer_config.good() ? Status::OK()
                                        : Status(SERVER_INVALID_ARGUMENT, "Failed to open tracer config file " + value +
                                                                              ": " + std::strerror(errno));
        tracer_config.close();
        return s;
    }
    return Status::OK();
}

2095 2096 2097 2098
/* wal config */
Status
Config::GetWalConfigEnable(bool& wal_enable) {
    std::string str = GetConfigStr(CONFIG_WAL, CONFIG_WAL_ENABLE, CONFIG_WAL_ENABLE_DEFAULT);
C
Cai Yudong 已提交
2099
    CONFIG_CHECK(CheckWalConfigEnable(str));
Y
Yhz 已提交
2100
    CONFIG_CHECK(StringHelpFunctions::ConvertToBoolean(str, wal_enable));
2101 2102 2103 2104 2105 2106 2107
    return Status::OK();
}

Status
Config::GetWalConfigRecoveryErrorIgnore(bool& recovery_error_ignore) {
    std::string str =
        GetConfigStr(CONFIG_WAL, CONFIG_WAL_RECOVERY_ERROR_IGNORE, CONFIG_WAL_RECOVERY_ERROR_IGNORE_DEFAULT);
C
Cai Yudong 已提交
2108
    CONFIG_CHECK(CheckWalConfigRecoveryErrorIgnore(str));
Y
Yhz 已提交
2109
    CONFIG_CHECK(StringHelpFunctions::ConvertToBoolean(str, recovery_error_ignore));
2110 2111 2112 2113
    return Status::OK();
}

Status
C
Cai Yudong 已提交
2114
Config::GetWalConfigBufferSize(int64_t& buffer_size) {
2115
    std::string str = GetConfigStr(CONFIG_WAL, CONFIG_WAL_BUFFER_SIZE, CONFIG_WAL_BUFFER_SIZE_DEFAULT);
C
Cai Yudong 已提交
2116 2117
    CONFIG_CHECK(CheckWalConfigBufferSize(str));
    buffer_size = std::stoll(str);
2118 2119 2120 2121 2122
    if (buffer_size > CONFIG_WAL_BUFFER_SIZE_MAX) {
        buffer_size = CONFIG_WAL_BUFFER_SIZE_MAX;
    } else if (buffer_size < CONFIG_WAL_BUFFER_SIZE_MIN) {
        buffer_size = CONFIG_WAL_BUFFER_SIZE_MIN;
    }
2123 2124 2125 2126 2127
    return Status::OK();
}

Status
Config::GetWalConfigWalPath(std::string& wal_path) {
C
Cai Yudong 已提交
2128
    wal_path = GetConfigStr(CONFIG_WAL, CONFIG_WAL_WAL_PATH, CONFIG_WAL_WAL_PATH_DEFAULT);
J
Jin Hai 已提交
2129
    CONFIG_CHECK(CheckWalConfigWalPath(wal_path));
2130 2131 2132
    return Status::OK();
}

W
Wang XiangYu 已提交
2133 2134 2135 2136 2137 2138 2139 2140 2141 2142 2143 2144 2145 2146 2147 2148 2149 2150 2151 2152 2153 2154 2155 2156 2157 2158 2159 2160 2161 2162 2163 2164 2165 2166 2167 2168 2169 2170 2171 2172 2173 2174 2175 2176 2177 2178 2179 2180 2181 2182 2183 2184
/* logs config */
Status
Config::GetLogsTraceEnable(bool& value) {
    std::string str = GetConfigStr(CONFIG_LOGS, CONFIG_LOGS_TRACE_ENABLE, CONFIG_LOGS_TRACE_ENABLE_DEFAULT);
    CONFIG_CHECK(CheckLogsTraceEnable(str));
    CONFIG_CHECK(StringHelpFunctions::ConvertToBoolean(str, value));
    return Status::OK();
}

Status
Config::GetLogsDebugEnable(bool& value) {
    std::string str = GetConfigStr(CONFIG_LOGS, CONFIG_LOGS_DEBUG_ENABLE, CONFIG_LOGS_DEBUG_ENABLE_DEFAULT);
    CONFIG_CHECK(CheckLogsDebugEnable(str));
    CONFIG_CHECK(StringHelpFunctions::ConvertToBoolean(str, value));
    return Status::OK();
}

Status
Config::GetLogsInfoEnable(bool& value) {
    std::string str = GetConfigStr(CONFIG_LOGS, CONFIG_LOGS_INFO_ENABLE, CONFIG_LOGS_INFO_ENABLE_DEFAULT);
    CONFIG_CHECK(CheckLogsInfoEnable(str));
    CONFIG_CHECK(StringHelpFunctions::ConvertToBoolean(str, value));
    return Status::OK();
}

Status
Config::GetLogsWarningEnable(bool& value) {
    std::string str = GetConfigStr(CONFIG_LOGS, CONFIG_LOGS_WARNING_ENABLE, CONFIG_LOGS_WARNING_ENABLE_DEFAULT);
    CONFIG_CHECK(CheckLogsWarningEnable(str));
    CONFIG_CHECK(StringHelpFunctions::ConvertToBoolean(str, value));
    return Status::OK();
}

Status
Config::GetLogsErrorEnable(bool& value) {
    std::string str = GetConfigStr(CONFIG_LOGS, CONFIG_LOGS_ERROR_ENABLE, CONFIG_LOGS_ERROR_ENABLE_DEFAULT);
    CONFIG_CHECK(CheckLogsErrorEnable(str));
    CONFIG_CHECK(StringHelpFunctions::ConvertToBoolean(str, value));
    return Status::OK();
}

Status
Config::GetLogsFatalEnable(bool& value) {
    std::string str = GetConfigStr(CONFIG_LOGS, CONFIG_LOGS_FATAL_ENABLE, CONFIG_LOGS_FATAL_ENABLE_DEFAULT);
    CONFIG_CHECK(CheckLogsFatalEnable(str));
    CONFIG_CHECK(StringHelpFunctions::ConvertToBoolean(str, value));
    return Status::OK();
}

Status
Config::GetLogsPath(std::string& value) {
    value = GetConfigStr(CONFIG_LOGS, CONFIG_LOGS_PATH, CONFIG_LOGS_PATH_DEFAULT);
W
Wang XiangYu 已提交
2185 2186 2187 2188 2189 2190 2191 2192 2193 2194 2195 2196 2197 2198 2199 2200 2201 2202 2203 2204 2205 2206 2207 2208 2209 2210 2211 2212 2213 2214 2215 2216 2217
    CONFIG_CHECK(CheckLogsPath(value));
    return Status::OK();
}

Status
Config::GetLogsMaxLogFileSize(int64_t& value) {
    std::string str = GetConfigStr(CONFIG_LOGS, CONFIG_LOGS_MAX_LOG_FILE_SIZE, CONFIG_LOGS_MAX_LOG_FILE_SIZE_DEFAULT);
    CONFIG_CHECK(CheckLogsMaxLogFileSize(str));
    value = std::stoll(str);
    if (value == 0) {
        // OFF
    } else if (value > CONFIG_LOGS_MAX_LOG_FILE_SIZE_MAX) {
        value = CONFIG_LOGS_MAX_LOG_FILE_SIZE_MAX;
    } else if (value < CONFIG_LOGS_MAX_LOG_FILE_SIZE_MIN) {
        value = CONFIG_LOGS_MAX_LOG_FILE_SIZE_MIN;
    }

    return Status::OK();
}

Status
Config::GetLogsDeleteExceeds(int64_t& value) {
    std::string str = GetConfigStr(CONFIG_LOGS, CONFIG_LOGS_DELETE_EXCEEDS, CONFIG_LOGS_DELETE_EXCEEDS_DEFAULT);
    CONFIG_CHECK(CheckLogsDeleteExceeds(str));
    value = std::stoll(str);
    if (value == 0) {
        // OFF
    } else if (value > CONFIG_LOGS_DELETE_EXCEEDS_MAX) {
        value = CONFIG_LOGS_DELETE_EXCEEDS_MAX;
    } else if (value < CONFIG_LOGS_DELETE_EXCEEDS_MIN) {
        value = CONFIG_LOGS_DELETE_EXCEEDS_MIN;
    }

W
Wang XiangYu 已提交
2218 2219 2220
    return Status::OK();
}

2221 2222 2223 2224 2225 2226
Status
Config::GetServerRestartRequired(bool& required) {
    required = restart_required_;
    return Status::OK();
}

Y
yudong.cai 已提交
2227 2228 2229
///////////////////////////////////////////////////////////////////////////////
/* server config */
Status
S
starlord 已提交
2230
Config::SetServerConfigAddress(const std::string& value) {
C
Cai Yudong 已提交
2231 2232
    CONFIG_CHECK(CheckServerConfigAddress(value));
    return SetConfigValueInMem(CONFIG_SERVER, CONFIG_SERVER_ADDRESS, value);
Y
yudong.cai 已提交
2233 2234 2235
}

Status
S
starlord 已提交
2236
Config::SetServerConfigPort(const std::string& value) {
C
Cai Yudong 已提交
2237 2238
    CONFIG_CHECK(CheckServerConfigPort(value));
    return SetConfigValueInMem(CONFIG_SERVER, CONFIG_SERVER_PORT, value);
Y
yudong.cai 已提交
2239 2240 2241
}

Status
S
starlord 已提交
2242
Config::SetServerConfigDeployMode(const std::string& value) {
C
Cai Yudong 已提交
2243 2244
    CONFIG_CHECK(CheckServerConfigDeployMode(value));
    return SetConfigValueInMem(CONFIG_SERVER, CONFIG_SERVER_DEPLOY_MODE, value);
Y
yudong.cai 已提交
2245 2246 2247
}

Status
S
starlord 已提交
2248
Config::SetServerConfigTimeZone(const std::string& value) {
C
Cai Yudong 已提交
2249 2250
    CONFIG_CHECK(CheckServerConfigTimeZone(value));
    return SetConfigValueInMem(CONFIG_SERVER, CONFIG_SERVER_TIME_ZONE, value);
Y
yudong.cai 已提交
2251 2252
}

2253 2254 2255 2256 2257 2258
Status
Config::SetServerConfigWebEnable(const std::string& value) {
    CONFIG_CHECK(CheckServerConfigWebEnable(value));
    return SetConfigValueInMem(CONFIG_SERVER, CONFIG_SERVER_WEB_ENABLE, value);
}

B
BossZou 已提交
2259 2260 2261 2262 2263 2264
Status
Config::SetServerConfigWebPort(const std::string& value) {
    CONFIG_CHECK(CheckServerConfigWebPort(value));
    return SetConfigValueInMem(CONFIG_SERVER, CONFIG_SERVER_WEB_PORT, value);
}

Y
yudong.cai 已提交
2265 2266
/* db config */
Status
S
starlord 已提交
2267
Config::SetDBConfigBackendUrl(const std::string& value) {
C
Cai Yudong 已提交
2268 2269
    CONFIG_CHECK(CheckDBConfigBackendUrl(value));
    return SetConfigValueInMem(CONFIG_DB, CONFIG_DB_BACKEND_URL, value);
Y
yudong.cai 已提交
2270 2271
}

2272
Status
2273 2274
Config::SetDBConfigPreloadCollection(const std::string& value) {
    CONFIG_CHECK(CheckDBConfigPreloadCollection(value));
2275
    std::string cor_value = value == "*" ? "\'*\'" : value;
G
groot 已提交
2276
    return SetConfigValueInMem(CONFIG_DB, CONFIG_DB_PRELOAD_COLLECTION, cor_value);
2277 2278
}

Y
yudong.cai 已提交
2279
Status
S
starlord 已提交
2280
Config::SetDBConfigArchiveDiskThreshold(const std::string& value) {
C
Cai Yudong 已提交
2281 2282
    CONFIG_CHECK(CheckDBConfigArchiveDiskThreshold(value));
    return SetConfigValueInMem(CONFIG_DB, CONFIG_DB_ARCHIVE_DISK_THRESHOLD, value);
Y
yudong.cai 已提交
2283 2284 2285
}

Status
S
starlord 已提交
2286
Config::SetDBConfigArchiveDaysThreshold(const std::string& value) {
C
Cai Yudong 已提交
2287 2288
    CONFIG_CHECK(CheckDBConfigArchiveDaysThreshold(value));
    return SetConfigValueInMem(CONFIG_DB, CONFIG_DB_ARCHIVE_DAYS_THRESHOLD, value);
Y
yudong.cai 已提交
2289 2290
}

2291 2292 2293 2294 2295 2296
Status
Config::SetDBConfigAutoFlushInterval(const std::string& value) {
    CONFIG_CHECK(CheckDBConfigAutoFlushInterval(value));
    return SetConfigValueInMem(CONFIG_DB, CONFIG_DB_AUTO_FLUSH_INTERVAL, value);
}

C
Cai Yudong 已提交
2297
/* storage config */
2298 2299 2300
Status
Config::SetStorageConfigPrimaryPath(const std::string& value) {
    CONFIG_CHECK(CheckStorageConfigPrimaryPath(value));
C
Cai Yudong 已提交
2301
    return SetConfigValueInMem(CONFIG_STORAGE, CONFIG_STORAGE_PRIMARY_PATH, value);
2302 2303 2304 2305 2306
}

Status
Config::SetStorageConfigSecondaryPath(const std::string& value) {
    CONFIG_CHECK(CheckStorageConfigSecondaryPath(value));
C
Cai Yudong 已提交
2307
    return SetConfigValueInMem(CONFIG_STORAGE, CONFIG_STORAGE_SECONDARY_PATH, value);
2308 2309
}

C
Cai Yudong 已提交
2310
Status
2311 2312 2313
Config::SetStorageConfigS3Enable(const std::string& value) {
    CONFIG_CHECK(CheckStorageConfigS3Enable(value));
    return SetConfigValueInMem(CONFIG_STORAGE, CONFIG_STORAGE_S3_ENABLE, value);
C
Cai Yudong 已提交
2314 2315 2316
}

Status
2317 2318 2319
Config::SetStorageConfigS3Address(const std::string& value) {
    CONFIG_CHECK(CheckStorageConfigS3Address(value));
    return SetConfigValueInMem(CONFIG_STORAGE, CONFIG_STORAGE_S3_ADDRESS, value);
C
Cai Yudong 已提交
2320 2321 2322
}

Status
2323 2324 2325
Config::SetStorageConfigS3Port(const std::string& value) {
    CONFIG_CHECK(CheckStorageConfigS3Port(value));
    return SetConfigValueInMem(CONFIG_STORAGE, CONFIG_STORAGE_S3_PORT, value);
C
Cai Yudong 已提交
2326 2327 2328
}

Status
2329 2330 2331
Config::SetStorageConfigS3AccessKey(const std::string& value) {
    CONFIG_CHECK(CheckStorageConfigS3AccessKey(value));
    return SetConfigValueInMem(CONFIG_STORAGE, CONFIG_STORAGE_S3_ACCESS_KEY, value);
C
Cai Yudong 已提交
2332 2333 2334
}

Status
2335 2336 2337
Config::SetStorageConfigS3SecretKey(const std::string& value) {
    CONFIG_CHECK(CheckStorageConfigS3SecretKey(value));
    return SetConfigValueInMem(CONFIG_STORAGE, CONFIG_STORAGE_S3_SECRET_KEY, value);
C
Cai Yudong 已提交
2338 2339 2340
}

Status
2341 2342 2343
Config::SetStorageConfigS3Bucket(const std::string& value) {
    CONFIG_CHECK(CheckStorageConfigS3Bucket(value));
    return SetConfigValueInMem(CONFIG_STORAGE, CONFIG_STORAGE_S3_BUCKET, value);
Y
yudong.cai 已提交
2344 2345 2346 2347
}

/* metric config */
Status
S
starlord 已提交
2348
Config::SetMetricConfigEnableMonitor(const std::string& value) {
C
Cai Yudong 已提交
2349 2350
    CONFIG_CHECK(CheckMetricConfigEnableMonitor(value));
    return SetConfigValueInMem(CONFIG_METRIC, CONFIG_METRIC_ENABLE_MONITOR, value);
Y
yudong.cai 已提交
2351 2352 2353
}

Status
C
Cai Yudong 已提交
2354 2355 2356
Config::SetMetricConfigAddress(const std::string& value) {
    CONFIG_CHECK(CheckMetricConfigAddress(value));
    return SetConfigValueInMem(CONFIG_METRIC, CONFIG_METRIC_ADDRESS, value);
2357 2358
}

Y
yudong.cai 已提交
2359
Status
C
Cai Yudong 已提交
2360 2361 2362
Config::SetMetricConfigPort(const std::string& value) {
    CONFIG_CHECK(CheckMetricConfigPort(value));
    return SetConfigValueInMem(CONFIG_METRIC, CONFIG_METRIC_PORT, value);
Y
yudong.cai 已提交
2363 2364 2365 2366
}

/* cache config */
Status
S
starlord 已提交
2367
Config::SetCacheConfigCpuCacheCapacity(const std::string& value) {
C
Cai Yudong 已提交
2368
    CONFIG_CHECK(CheckCacheConfigCpuCacheCapacity(value));
C
Cai Yudong 已提交
2369
    CONFIG_CHECK(SetConfigValueInMem(CONFIG_CACHE, CONFIG_CACHE_CPU_CACHE_CAPACITY, value));
2370
    return ExecCallBacks(CONFIG_CACHE, CONFIG_CACHE_CPU_CACHE_CAPACITY, value);
Y
yudong.cai 已提交
2371 2372 2373
}

Status
S
starlord 已提交
2374
Config::SetCacheConfigCpuCacheThreshold(const std::string& value) {
C
Cai Yudong 已提交
2375 2376
    CONFIG_CHECK(CheckCacheConfigCpuCacheThreshold(value));
    return SetConfigValueInMem(CONFIG_CACHE, CONFIG_CACHE_CPU_CACHE_THRESHOLD, value);
Y
yudong.cai 已提交
2377 2378
}

2379 2380 2381
Status
Config::SetCacheConfigInsertBufferSize(const std::string& value) {
    CONFIG_CHECK(CheckCacheConfigInsertBufferSize(value));
C
Cai Yudong 已提交
2382
    CONFIG_CHECK(SetConfigValueInMem(CONFIG_CACHE, CONFIG_CACHE_INSERT_BUFFER_SIZE, value));
2383
    return ExecCallBacks(CONFIG_CACHE, CONFIG_CACHE_INSERT_BUFFER_SIZE, value);
2384 2385
}

Y
yudong.cai 已提交
2386
Status
S
starlord 已提交
2387
Config::SetCacheConfigCacheInsertData(const std::string& value) {
C
Cai Yudong 已提交
2388
    CONFIG_CHECK(CheckCacheConfigCacheInsertData(value));
C
Cai Yudong 已提交
2389
    CONFIG_CHECK(SetConfigValueInMem(CONFIG_CACHE, CONFIG_CACHE_CACHE_INSERT_DATA, value));
2390
    return ExecCallBacks(CONFIG_CACHE, CONFIG_CACHE_CACHE_INSERT_DATA, value);
Y
yudong.cai 已提交
2391 2392 2393 2394
}

/* engine config */
Status
S
starlord 已提交
2395
Config::SetEngineConfigUseBlasThreshold(const std::string& value) {
C
Cai Yudong 已提交
2396
    CONFIG_CHECK(CheckEngineConfigUseBlasThreshold(value));
C
Cai Yudong 已提交
2397
    CONFIG_CHECK(SetConfigValueInMem(CONFIG_ENGINE, CONFIG_ENGINE_USE_BLAS_THRESHOLD, value));
2398
    return ExecCallBacks(CONFIG_ENGINE, CONFIG_ENGINE_USE_BLAS_THRESHOLD, value);
Y
yudong.cai 已提交
2399 2400 2401
}

Status
S
starlord 已提交
2402
Config::SetEngineConfigOmpThreadNum(const std::string& value) {
C
Cai Yudong 已提交
2403 2404
    CONFIG_CHECK(CheckEngineConfigOmpThreadNum(value));
    return SetConfigValueInMem(CONFIG_ENGINE, CONFIG_ENGINE_OMP_THREAD_NUM, value);
Y
yudong.cai 已提交
2405 2406
}

C
Cai Yudong 已提交
2407
Status
F
feisiyicl 已提交
2408 2409 2410
Config::SetEngineConfigSimdType(const std::string& value) {
    CONFIG_CHECK(CheckEngineConfigSimdType(value));
    return SetConfigValueInMem(CONFIG_ENGINE, CONFIG_ENGINE_SIMD_TYPE, value);
C
Cai Yudong 已提交
2411 2412
}

2413 2414 2415 2416 2417 2418 2419
/* tracing config */
Status
Config::SetTracingConfigJsonConfigPath(const std::string& value) {
    CONFIG_CHECK(CheckTracingConfigJsonConfigPath(value));
    return SetConfigValueInMem(CONFIG_TRACING, CONFIG_TRACING_JSON_CONFIG_PATH, value);
}

J
Jin Hai 已提交
2420 2421 2422 2423 2424 2425 2426 2427 2428 2429
/* wal config */
Status
Config::SetWalConfigEnable(const std::string& value) {
    CONFIG_CHECK(CheckWalConfigEnable(value));
    return SetConfigValueInMem(CONFIG_WAL, CONFIG_WAL_ENABLE, value);
}

Status
Config::SetWalConfigRecoveryErrorIgnore(const std::string& value) {
    CONFIG_CHECK(CheckWalConfigRecoveryErrorIgnore(value));
2430
    return SetConfigValueInMem(CONFIG_WAL, CONFIG_WAL_RECOVERY_ERROR_IGNORE, value);
J
Jin Hai 已提交
2431 2432 2433 2434 2435 2436 2437 2438 2439 2440 2441 2442 2443 2444
}

Status
Config::SetWalConfigBufferSize(const std::string& value) {
    CONFIG_CHECK(CheckWalConfigBufferSize(value));
    return SetConfigValueInMem(CONFIG_WAL, CONFIG_WAL_BUFFER_SIZE, value);
}

Status
Config::SetWalConfigWalPath(const std::string& value) {
    CONFIG_CHECK(CheckWalConfigWalPath(value));
    return SetConfigValueInMem(CONFIG_WAL, CONFIG_WAL_WAL_PATH, value);
}

W
Wang XiangYu 已提交
2445 2446 2447 2448 2449 2450 2451 2452 2453 2454 2455 2456 2457 2458 2459 2460 2461 2462 2463 2464 2465 2466 2467 2468 2469 2470 2471 2472 2473 2474 2475 2476 2477 2478 2479 2480 2481 2482 2483 2484 2485 2486 2487
/* logs config */
Status
Config::SetLogsTraceEnable(const std::string& value) {
    CONFIG_CHECK(CheckLogsTraceEnable(value));
    return SetConfigValueInMem(CONFIG_LOGS, CONFIG_LOGS_TRACE_ENABLE, value);
}

Status
Config::SetLogsDebugEnable(const std::string& value) {
    CONFIG_CHECK(CheckLogsDebugEnable(value));
    return SetConfigValueInMem(CONFIG_LOGS, CONFIG_LOGS_DEBUG_ENABLE, value);
}

Status
Config::SetLogsInfoEnable(const std::string& value) {
    CONFIG_CHECK(CheckLogsInfoEnable(value));
    return SetConfigValueInMem(CONFIG_LOGS, CONFIG_LOGS_INFO_ENABLE, value);
}

Status
Config::SetLogsWarningEnable(const std::string& value) {
    CONFIG_CHECK(CheckLogsWarningEnable(value));
    return SetConfigValueInMem(CONFIG_LOGS, CONFIG_LOGS_WARNING_ENABLE, value);
}

Status
Config::SetLogsErrorEnable(const std::string& value) {
    CONFIG_CHECK(CheckLogsErrorEnable(value));
    return SetConfigValueInMem(CONFIG_LOGS, CONFIG_LOGS_ERROR_ENABLE, value);
}

Status
Config::SetLogsFatalEnable(const std::string& value) {
    CONFIG_CHECK(CheckLogsFatalEnable(value));
    return SetConfigValueInMem(CONFIG_LOGS, CONFIG_LOGS_FATAL_ENABLE, value);
}

Status
Config::SetLogsPath(const std::string& value) {
    CONFIG_CHECK(CheckLogsPath(value));
    return SetConfigValueInMem(CONFIG_LOGS, CONFIG_LOGS_PATH, value);
}

W
Wang XiangYu 已提交
2488 2489 2490 2491 2492 2493 2494 2495 2496 2497 2498 2499
Status
Config::SetLogsMaxLogFileSize(const std::string& value) {
    CONFIG_CHECK(CheckLogsMaxLogFileSize(value));
    return SetConfigValueInMem(CONFIG_LOGS, CONFIG_LOGS_MAX_LOG_FILE_SIZE, value);
}

Status
Config::SetLogsDeleteExceeds(const std::string& value) {
    CONFIG_CHECK(CheckLogsDeleteExceeds(value));
    return SetConfigValueInMem(CONFIG_LOGS, CONFIG_LOGS_DELETE_EXCEEDS, value);
}

G
groot 已提交
2500
#ifdef MILVUS_GPU_VERSION
W
wxyu 已提交
2501
Status
2502
Config::SetEngineConfigGpuSearchThreshold(const std::string& value) {
C
Cai Yudong 已提交
2503
    CONFIG_CHECK(CheckEngineConfigGpuSearchThreshold(value));
C
Cai Yudong 已提交
2504
    CONFIG_CHECK(SetConfigValueInMem(CONFIG_ENGINE, CONFIG_ENGINE_GPU_SEARCH_THRESHOLD, value));
2505
    return ExecCallBacks(CONFIG_ENGINE, CONFIG_ENGINE_GPU_SEARCH_THRESHOLD, value);
W
wxyu 已提交
2506
}
C
Cai Yudong 已提交
2507
#endif
W
wxyu 已提交
2508

C
Cai Yudong 已提交
2509 2510
/* gpu resource config */
#ifdef MILVUS_GPU_VERSION
S
shengjh 已提交
2511

Y
yudong.cai 已提交
2512
Status
2513
Config::SetGpuResourceConfigEnable(const std::string& value) {
C
Cai Yudong 已提交
2514
    CONFIG_CHECK(CheckGpuResourceConfigEnable(value));
C
Cai Yudong 已提交
2515
    CONFIG_CHECK(SetConfigValueInMem(CONFIG_GPU_RESOURCE, CONFIG_GPU_RESOURCE_ENABLE, value));
2516
    return ExecCallBacks(CONFIG_GPU_RESOURCE, CONFIG_GPU_RESOURCE_ENABLE, value);
Z
Zhiru Zhu 已提交
2517 2518 2519
}

Status
Y
yudong.cai 已提交
2520
Config::SetGpuResourceConfigCacheCapacity(const std::string& value) {
C
Cai Yudong 已提交
2521
    CONFIG_CHECK(CheckGpuResourceConfigCacheCapacity(value));
C
Cai Yudong 已提交
2522
    CONFIG_CHECK(SetConfigValueInMem(CONFIG_GPU_RESOURCE, CONFIG_GPU_RESOURCE_CACHE_CAPACITY, value));
2523
    return ExecCallBacks(CONFIG_GPU_RESOURCE, CONFIG_GPU_RESOURCE_CACHE_CAPACITY, value);
Y
yudong.cai 已提交
2524
}
Z
Zhiru Zhu 已提交
2525

Y
yudong.cai 已提交
2526 2527
Status
Config::SetGpuResourceConfigCacheThreshold(const std::string& value) {
C
Cai Yudong 已提交
2528 2529
    CONFIG_CHECK(CheckGpuResourceConfigCacheThreshold(value));
    return SetConfigValueInMem(CONFIG_GPU_RESOURCE, CONFIG_GPU_RESOURCE_CACHE_THRESHOLD, value);
Y
yudong.cai 已提交
2530 2531
}

2532
Status
Y
yudong.cai 已提交
2533
Config::SetGpuResourceConfigSearchResources(const std::string& value) {
2534
    std::vector<std::string> res_vec;
Y
yudong.cai 已提交
2535
    server::StringHelpFunctions::SplitStringByDelimeter(value, CONFIG_GPU_RESOURCE_DELIMITER, res_vec);
C
Cai Yudong 已提交
2536
    CONFIG_CHECK(CheckGpuResourceConfigSearchResources(res_vec));
C
Cai Yudong 已提交
2537
    CONFIG_CHECK(SetConfigValueInMem(CONFIG_GPU_RESOURCE, CONFIG_GPU_RESOURCE_SEARCH_RESOURCES, value));
2538
    return ExecCallBacks(CONFIG_GPU_RESOURCE, CONFIG_GPU_RESOURCE_SEARCH_RESOURCES, value);
2539 2540
}

Y
yudong.cai 已提交
2541 2542 2543 2544
Status
Config::SetGpuResourceConfigBuildIndexResources(const std::string& value) {
    std::vector<std::string> res_vec;
    server::StringHelpFunctions::SplitStringByDelimeter(value, CONFIG_GPU_RESOURCE_DELIMITER, res_vec);
C
Cai Yudong 已提交
2545
    CONFIG_CHECK(CheckGpuResourceConfigBuildIndexResources(res_vec));
C
Cai Yudong 已提交
2546
    CONFIG_CHECK(SetConfigValueInMem(CONFIG_GPU_RESOURCE, CONFIG_GPU_RESOURCE_BUILD_INDEX_RESOURCES, value));
2547
    return ExecCallBacks(CONFIG_GPU_RESOURCE, CONFIG_GPU_RESOURCE_BUILD_INDEX_RESOURCES, value);
C
Cai Yudong 已提交
2548
}
S
shengjh 已提交
2549

G
groot 已提交
2550
#endif
2551

S
starlord 已提交
2552 2553
}  // namespace server
}  // namespace milvus