Config.cpp 100.3 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
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 = "";
G
groot 已提交
77 78
const char* CONFIG_STORAGE_FILE_CLEANUP_TIMEOUT = "file_cleanup_timeout";
const char* CONFIG_STORAGE_FILE_CLEANUP_TIMEOUT_DEFAULT = "10";
C
Cai Yudong 已提交
79 80
const int64_t CONFIG_STORAGE_FILE_CLEANUP_TIMEOUT_MIN = 0;
const int64_t CONFIG_STORAGE_FILE_CLEANUP_TIMEOUT_MAX = 3600;
C
Cai Yudong 已提交
81 82 83 84 85 86 87 88 89 90 91 92
// 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";
93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112

/* 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";
113

114 115 116 117 118 119
/* 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 已提交
120 121
const char* CONFIG_ENGINE_SIMD_TYPE = "simd_type";
const char* CONFIG_ENGINE_SIMD_TYPE_DEFAULT = "auto";
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_MIN = 64;
C
Cai Yudong 已提交
156
const int64_t CONFIG_WAL_BUFFER_SIZE_MAX = 4096;
157 158 159
const char* CONFIG_WAL_WAL_PATH = "wal_path";
const char* CONFIG_WAL_WAL_PATH_DEFAULT = "/tmp/milvus/wal";

W
Wang XiangYu 已提交
160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175
/* 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 已提交
176
const char* CONFIG_LOGS_MAX_LOG_FILE_SIZE = "max_log_file_size";
C
Cai Yudong 已提交
177 178 179 180 181 182 183
const char* CONFIG_LOGS_MAX_LOG_FILE_SIZE_DEFAULT = "1024";
const int64_t CONFIG_LOGS_MAX_LOG_FILE_SIZE_MIN = 512;
const int64_t CONFIG_LOGS_MAX_LOG_FILE_SIZE_MAX = 4096;
const char* CONFIG_LOGS_LOG_ROTATE_NUM = "log_rotate_num";
const char* CONFIG_LOGS_LOG_ROTATE_NUM_DEFAULT = "0";
const int64_t CONFIG_LOGS_LOG_ROTATE_NUM_MIN = 0;
const int64_t CONFIG_LOGS_LOG_ROTATE_NUM_MAX = 1024;
W
Wang XiangYu 已提交
184

185
constexpr int64_t GB = 1UL << 30;
J
Jin Hai 已提交
186 187 188
constexpr int32_t PORT_NUMBER_MIN = 1024;
constexpr int32_t PORT_NUMBER_MAX = 65535;

189
static const std::unordered_map<std::string, std::string> milvus_config_version_map(
W
Wang XiangYu 已提交
190
    {{"0.6.0", "0.1"}, {"0.7.0", "0.2"}, {"0.7.1", "0.2"}, {"0.8.0", "0.3"}, {"0.9.0", "0.4"}});
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 223 224 225 226
/////////////////////////////////////////////////////////////
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 已提交
227
Config&
228 229 230
Config::GetInstance() {
    static Config config_inst;
    return config_inst;
G
groot 已提交
231 232
}

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

    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 已提交
243 244
    }

S
shengjh 已提交
245
    ConfigMgr* mgr = YamlConfigMgr::GetInstance();
C
Cai Yudong 已提交
246
    STATUS_CHECK(mgr->LoadConfigFile(filename));
G
groot 已提交
247

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

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

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

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

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

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

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

272
    bool server_web_enable;
C
Cai Yudong 已提交
273
    STATUS_CHECK(GetServerConfigWebEnable(server_web_enable));
274

B
BossZou 已提交
275
    std::string server_web_port;
C
Cai Yudong 已提交
276
    STATUS_CHECK(GetServerConfigWebPort(server_web_port));
B
BossZou 已提交
277

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

282
    std::string db_preload_collection;
C
Cai Yudong 已提交
283
    STATUS_CHECK(GetDBConfigPreloadCollection(db_preload_collection));
284

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

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

C
Cai Yudong 已提交
291
    int64_t auto_flush_interval;
C
Cai Yudong 已提交
292
    STATUS_CHECK(GetDBConfigAutoFlushInterval(auto_flush_interval));
293

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

    std::string storage_secondary_path;
C
Cai Yudong 已提交
299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318
    STATUS_CHECK(GetStorageConfigSecondaryPath(storage_secondary_path));

    // bool storage_s3_enable;
    // STATUS_CHECK(GetStorageConfigS3Enable(storage_s3_enable));
    // // std::cout << "S3 " << (storage_s3_enable ? "ENABLED !" : "DISABLED !") << std::endl;
    //
    // std::string storage_s3_address;
    // STATUS_CHECK(GetStorageConfigS3Address(storage_s3_address));
    //
    // std::string storage_s3_port;
    // STATUS_CHECK(GetStorageConfigS3Port(storage_s3_port));
    //
    // std::string storage_s3_access_key;
    // STATUS_CHECK(GetStorageConfigS3AccessKey(storage_s3_access_key));
    //
    // std::string storage_s3_secret_key;
    // STATUS_CHECK(GetStorageConfigS3SecretKey(storage_s3_secret_key));
    //
    // std::string storage_s3_bucket;
    // STATUS_CHECK(GetStorageConfigS3Bucket(storage_s3_bucket));
Y
yudong.cai 已提交
319 320 321

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

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

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

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

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

337
    int64_t cache_insert_buffer_size;
C
Cai Yudong 已提交
338
    STATUS_CHECK(GetCacheConfigInsertBufferSize(cache_insert_buffer_size));
339

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

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

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

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

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

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

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

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

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

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

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

383 384
    /* wal config */
    bool enable;
C
Cai Yudong 已提交
385
    STATUS_CHECK(GetWalConfigEnable(enable));
386 387

    bool recovery_error_ignore;
C
Cai Yudong 已提交
388
    STATUS_CHECK(GetWalConfigRecoveryErrorIgnore(recovery_error_ignore));
389

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

    std::string wal_path;
C
Cai Yudong 已提交
394
    STATUS_CHECK(GetWalConfigWalPath(wal_path));
395

W
Wang XiangYu 已提交
396 397
    /* logs config */
    bool trace_enable;
C
Cai Yudong 已提交
398
    STATUS_CHECK(GetLogsTraceEnable(trace_enable));
W
Wang XiangYu 已提交
399 400

    bool debug_enable;
C
Cai Yudong 已提交
401
    STATUS_CHECK(GetLogsDebugEnable(trace_enable));
W
Wang XiangYu 已提交
402 403

    bool info_enable;
C
Cai Yudong 已提交
404
    STATUS_CHECK(GetLogsInfoEnable(trace_enable));
W
Wang XiangYu 已提交
405 406

    bool warning_enable;
C
Cai Yudong 已提交
407
    STATUS_CHECK(GetLogsWarningEnable(trace_enable));
W
Wang XiangYu 已提交
408 409

    bool error_enable;
C
Cai Yudong 已提交
410
    STATUS_CHECK(GetLogsErrorEnable(trace_enable));
W
Wang XiangYu 已提交
411 412

    bool fatal_enable;
C
Cai Yudong 已提交
413
    STATUS_CHECK(GetLogsFatalEnable(trace_enable));
W
Wang XiangYu 已提交
414 415

    std::string logs_path;
C
Cai Yudong 已提交
416
    STATUS_CHECK(GetLogsPath(logs_path));
W
Wang XiangYu 已提交
417

W
Wang XiangYu 已提交
418
    int64_t logs_max_log_file_size;
C
Cai Yudong 已提交
419
    STATUS_CHECK(GetLogsMaxLogFileSize(logs_max_log_file_size));
W
Wang XiangYu 已提交
420

C
Cai Yudong 已提交
421 422
    int64_t logs_log_rotate_num;
    STATUS_CHECK(GetLogsLogRotateNum(logs_log_rotate_num));
W
Wang XiangYu 已提交
423

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

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

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

    /* storage config */
C
Cai Yudong 已提交
445 446 447 448 449 450 451 452 453
    STATUS_CHECK(SetStorageConfigPrimaryPath(CONFIG_STORAGE_PRIMARY_PATH_DEFAULT));
    STATUS_CHECK(SetStorageConfigSecondaryPath(CONFIG_STORAGE_SECONDARY_PATH_DEFAULT));
    STATUS_CHECK(SetStorageConfigFileCleanupTimeout(CONFIG_STORAGE_FILE_CLEANUP_TIMEOUT_DEFAULT));
    // STATUS_CHECK(SetStorageConfigS3Enable(CONFIG_STORAGE_S3_ENABLE_DEFAULT));
    // STATUS_CHECK(SetStorageConfigS3Address(CONFIG_STORAGE_S3_ADDRESS_DEFAULT));
    // STATUS_CHECK(SetStorageConfigS3Port(CONFIG_STORAGE_S3_PORT_DEFAULT));
    // STATUS_CHECK(SetStorageConfigS3AccessKey(CONFIG_STORAGE_S3_ACCESS_KEY_DEFAULT));
    // STATUS_CHECK(SetStorageConfigS3SecretKey(CONFIG_STORAGE_S3_SECRET_KEY_DEFAULT));
    // STATUS_CHECK(SetStorageConfigS3Bucket(CONFIG_STORAGE_S3_BUCKET_DEFAULT));
Y
yudong.cai 已提交
454 455

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

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

Y
yudong.cai 已提交
466
    /* engine config */
C
Cai Yudong 已提交
467 468 469
    STATUS_CHECK(SetEngineConfigUseBlasThreshold(CONFIG_ENGINE_USE_BLAS_THRESHOLD_DEFAULT));
    STATUS_CHECK(SetEngineConfigOmpThreadNum(CONFIG_ENGINE_OMP_THREAD_NUM_DEFAULT));
    STATUS_CHECK(SetEngineConfigSimdType(CONFIG_ENGINE_SIMD_TYPE_DEFAULT));
G
groot 已提交
470
#ifdef MILVUS_GPU_VERSION
C
Cai Yudong 已提交
471
    STATUS_CHECK(SetEngineConfigGpuSearchThreshold(CONFIG_ENGINE_GPU_SEARCH_THRESHOLD_DEFAULT));
C
Cai Yudong 已提交
472
#endif
Z
Zhiru Zhu 已提交
473

C
Cai Yudong 已提交
474 475
    /* gpu resource config */
#ifdef MILVUS_GPU_VERSION
C
Cai Yudong 已提交
476 477 478 479 480
    STATUS_CHECK(SetGpuResourceConfigEnable(CONFIG_GPU_RESOURCE_ENABLE_DEFAULT));
    STATUS_CHECK(SetGpuResourceConfigCacheCapacity(CONFIG_GPU_RESOURCE_CACHE_CAPACITY_DEFAULT));
    STATUS_CHECK(SetGpuResourceConfigCacheThreshold(CONFIG_GPU_RESOURCE_CACHE_THRESHOLD_DEFAULT));
    STATUS_CHECK(SetGpuResourceConfigSearchResources(CONFIG_GPU_RESOURCE_SEARCH_RESOURCES_DEFAULT));
    STATUS_CHECK(SetGpuResourceConfigBuildIndexResources(CONFIG_GPU_RESOURCE_BUILD_INDEX_RESOURCES_DEFAULT));
Y
yudong.cai 已提交
481
#endif
482

C
Cai Yudong 已提交
483 484 485 486 487 488 489 490 491 492 493 494 495 496 497
    /* wal config */
    STATUS_CHECK(SetWalConfigEnable(CONFIG_WAL_ENABLE_DEFAULT));
    STATUS_CHECK(SetWalConfigRecoveryErrorIgnore(CONFIG_WAL_RECOVERY_ERROR_IGNORE_DEFAULT));
    STATUS_CHECK(SetWalConfigBufferSize(CONFIG_WAL_BUFFER_SIZE_DEFAULT));
    STATUS_CHECK(SetWalConfigWalPath(CONFIG_WAL_WAL_PATH_DEFAULT));

    /* logs config */
    STATUS_CHECK(SetLogsTraceEnable(CONFIG_LOGS_TRACE_ENABLE_DEFAULT));
    STATUS_CHECK(SetLogsDebugEnable(CONFIG_LOGS_DEBUG_ENABLE_DEFAULT));
    STATUS_CHECK(SetLogsInfoEnable(CONFIG_LOGS_INFO_ENABLE_DEFAULT));
    STATUS_CHECK(SetLogsWarningEnable(CONFIG_LOGS_WARNING_ENABLE_DEFAULT));
    STATUS_CHECK(SetLogsErrorEnable(CONFIG_LOGS_ERROR_ENABLE_DEFAULT));
    STATUS_CHECK(SetLogsFatalEnable(CONFIG_LOGS_FATAL_ENABLE_DEFAULT));
    STATUS_CHECK(SetLogsPath(CONFIG_LOGS_PATH_DEFAULT));
    STATUS_CHECK(SetLogsMaxLogFileSize(CONFIG_LOGS_MAX_LOG_FILE_SIZE_DEFAULT));
C
Cai Yudong 已提交
498
    STATUS_CHECK(SetLogsLogRotateNum(CONFIG_LOGS_LOG_ROTATE_NUM_DEFAULT));
C
Cai Yudong 已提交
499

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

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

C
Cai Yudong 已提交
509
Status
510
Config::GetConfigCli(std::string& value, const std::string& parent_key, const std::string& child_key) {
C
Cai Yudong 已提交
511 512 513 514 515 516 517 518 519
    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) {
520 521
    std::string invalid_node_str = "Config node invalid: " + parent_key + CONFIG_NODE_DELIMITER + child_key;

C
Cai Yudong 已提交
522
    if (!ConfigNodeValid(parent_key, child_key)) {
523
        return Status(SERVER_UNEXPECTED_ERROR, invalid_node_str);
C
Cai Yudong 已提交
524
    }
525
    auto status = Status::OK();
C
Cai Yudong 已提交
526
    if (parent_key == CONFIG_SERVER) {
527 528 529 530 531 532 533 534 535 536
        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);
537 538
        } else {
            status = Status(SERVER_UNEXPECTED_ERROR, invalid_node_str);
539
        }
C
Cai Yudong 已提交
540
    } else if (parent_key == CONFIG_DB) {
541 542
        if (child_key == CONFIG_DB_BACKEND_URL) {
            status = SetDBConfigBackendUrl(value);
G
groot 已提交
543
        } else if (child_key == CONFIG_DB_PRELOAD_COLLECTION) {
544
            status = SetDBConfigPreloadCollection(value);
545 546
        } else if (child_key == CONFIG_DB_AUTO_FLUSH_INTERVAL) {
            status = SetDBConfigAutoFlushInterval(value);
547 548
        } else {
            status = Status(SERVER_UNEXPECTED_ERROR, invalid_node_str);
549
        }
C
Cai Yudong 已提交
550
    } else if (parent_key == CONFIG_STORAGE) {
551 552 553 554
        if (child_key == CONFIG_STORAGE_PRIMARY_PATH) {
            status = SetStorageConfigPrimaryPath(value);
        } else if (child_key == CONFIG_STORAGE_SECONDARY_PATH) {
            status = SetStorageConfigSecondaryPath(value);
C
Cai Yudong 已提交
555 556 557 558 559 560 561 562 563 564 565 566
            // } 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);
567 568
        } else {
            status = Status(SERVER_UNEXPECTED_ERROR, invalid_node_str);
569
        }
C
Cai Yudong 已提交
570
    } else if (parent_key == CONFIG_METRIC) {
571 572 573 574 575 576
        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);
577 578
        } else {
            status = Status(SERVER_UNEXPECTED_ERROR, invalid_node_str);
579
        }
C
Cai Yudong 已提交
580 581
    } else if (parent_key == CONFIG_CACHE) {
        if (child_key == CONFIG_CACHE_CPU_CACHE_CAPACITY) {
582
            status = SetCacheConfigCpuCacheCapacity(value);
C
Cai Yudong 已提交
583
        } else if (child_key == CONFIG_CACHE_CPU_CACHE_THRESHOLD) {
584
            status = SetCacheConfigCpuCacheThreshold(value);
C
Cai Yudong 已提交
585
        } else if (child_key == CONFIG_CACHE_CACHE_INSERT_DATA) {
586
            status = SetCacheConfigCacheInsertData(value);
587
        } else if (child_key == CONFIG_CACHE_INSERT_BUFFER_SIZE) {
588
            status = SetCacheConfigInsertBufferSize(value);
589 590
        } else {
            status = Status(SERVER_UNEXPECTED_ERROR, invalid_node_str);
C
Cai Yudong 已提交
591 592 593
        }
    } else if (parent_key == CONFIG_ENGINE) {
        if (child_key == CONFIG_ENGINE_USE_BLAS_THRESHOLD) {
594
            status = SetEngineConfigUseBlasThreshold(value);
C
Cai Yudong 已提交
595
        } else if (child_key == CONFIG_ENGINE_OMP_THREAD_NUM) {
596
            status = SetEngineConfigOmpThreadNum(value);
F
feisiyicl 已提交
597 598
        } else if (child_key == CONFIG_ENGINE_SIMD_TYPE) {
            status = SetEngineConfigSimdType(value);
C
Cai Yudong 已提交
599 600
#ifdef MILVUS_GPU_VERSION
        } else if (child_key == CONFIG_ENGINE_GPU_SEARCH_THRESHOLD) {
601
            status = SetEngineConfigGpuSearchThreshold(value);
C
Cai Yudong 已提交
602
#endif
603 604
        } else {
            status = Status(SERVER_UNEXPECTED_ERROR, invalid_node_str);
C
Cai Yudong 已提交
605 606 607 608
        }
#ifdef MILVUS_GPU_VERSION
    } else if (parent_key == CONFIG_GPU_RESOURCE) {
        if (child_key == CONFIG_GPU_RESOURCE_ENABLE) {
609
            status = SetGpuResourceConfigEnable(value);
C
Cai Yudong 已提交
610
        } else if (child_key == CONFIG_GPU_RESOURCE_CACHE_CAPACITY) {
611
            status = SetGpuResourceConfigCacheCapacity(value);
C
Cai Yudong 已提交
612
        } else if (child_key == CONFIG_GPU_RESOURCE_CACHE_THRESHOLD) {
613
            status = SetGpuResourceConfigCacheThreshold(value);
C
Cai Yudong 已提交
614
        } else if (child_key == CONFIG_GPU_RESOURCE_SEARCH_RESOURCES) {
615
            status = SetGpuResourceConfigSearchResources(value);
C
Cai Yudong 已提交
616
        } else if (child_key == CONFIG_GPU_RESOURCE_BUILD_INDEX_RESOURCES) {
617
            status = SetGpuResourceConfigBuildIndexResources(value);
618 619
        } else {
            status = Status(SERVER_UNEXPECTED_ERROR, invalid_node_str);
C
Cai Yudong 已提交
620 621 622
        }
#endif
    } else if (parent_key == CONFIG_TRACING) {
623 624 625 626 627
        if (child_key == CONFIG_TRACING_JSON_CONFIG_PATH) {
            status = SetTracingConfigJsonConfigPath(value);
        } else {
            status = Status(SERVER_UNEXPECTED_ERROR, invalid_node_str);
        }
J
Jin Hai 已提交
628 629 630 631 632 633 634 635 636
    } 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);
637 638
        } else {
            status = Status(SERVER_UNEXPECTED_ERROR, invalid_node_str);
J
Jin Hai 已提交
639
        }
C
Cai Yudong 已提交
640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661
    } else if (parent_key == CONFIG_LOGS) {
        if (child_key == CONFIG_LOGS_TRACE_ENABLE) {
            status = SetLogsTraceEnable(value);
        } else if (child_key == CONFIG_LOGS_DEBUG_ENABLE) {
            status = SetLogsDebugEnable(value);
        } else if (child_key == CONFIG_LOGS_INFO_ENABLE) {
            status = SetLogsInfoEnable(value);
        } else if (child_key == CONFIG_LOGS_WARNING_ENABLE) {
            status = SetLogsWarningEnable(value);
        } else if (child_key == CONFIG_LOGS_ERROR_ENABLE) {
            status = SetLogsErrorEnable(value);
        } else if (child_key == CONFIG_LOGS_FATAL_ENABLE) {
            status = SetLogsFatalEnable(value);
        } else if (child_key == CONFIG_LOGS_PATH) {
            status = SetLogsPath(value);
        } else if (child_key == CONFIG_LOGS_MAX_LOG_FILE_SIZE) {
            status = SetLogsMaxLogFileSize(value);
        } else if (child_key == CONFIG_LOGS_LOG_ROTATE_NUM) {
            status = SetLogsLogRotateNum(value);
        } else {
            status = Status(SERVER_UNEXPECTED_ERROR, invalid_node_str);
        }
662 663 664 665
    }

    if (status.ok()) {
        status = UpdateFileConfigFromMem(parent_key, child_key);
666 667
        if (status.ok() &&
            !(parent_key == CONFIG_CACHE || parent_key == CONFIG_ENGINE || parent_key == CONFIG_GPU_RESOURCE)) {
668 669
            restart_required_ = true;
        }
C
Cai Yudong 已提交
670
    }
671 672

    return status;
C
Cai Yudong 已提交
673 674
}

675
//////////////////////////////////////////////////////////////
C
Cai Yudong 已提交
676
Status
677
Config::ProcessConfigCli(std::string& result, const std::string& cmd) {
C
Cai Yudong 已提交
678 679 680
    std::vector<std::string> tokens;
    std::vector<std::string> nodes;
    server::StringHelpFunctions::SplitStringByDelimeter(cmd, " ", tokens);
681
    if (tokens[0] == "get_config") {
C
Cai Yudong 已提交
682 683 684
        if (tokens.size() != 2) {
            return Status(SERVER_UNEXPECTED_ERROR, "Invalid command: " + cmd);
        }
685 686 687 688 689 690 691 692 693
        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 已提交
694
        }
695
    } else if (tokens[0] == "set_config") {
C
Cai Yudong 已提交
696 697 698 699 700 701 702 703 704 705 706 707 708
        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);
    }
}

709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724
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();
725
    auto duration_in_ms = std::chrono::duration_cast<std::chrono::nanoseconds>(time_now.time_since_epoch());
726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761
    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;
C
Cai Yudong 已提交
762 763
    if (child_key == CONFIG_CACHE_CACHE_INSERT_DATA ||
        // child_key == CONFIG_STORAGE_S3_ENABLE ||
764 765 766
        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;
C
Cai Yudong 已提交
767
        STATUS_CHECK(StringHelpFunctions::ConvertToBoolean(value, ok));
768
        value_str = ok ? "true" : "false";
769 770 771 772 773
    } 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) {
774
            std::transform(s.begin(), s.end(), s.begin(), ::tolower);
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 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868
            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 已提交
869
////////////////////////////////////////////////////////////////////////////////
870 871
Status
Config::CheckConfigVersion(const std::string& value) {
872 873 874 875 876 877
    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);
878
            LOG_SERVER_ERROR_ << msg;
Y
yudong.cai 已提交
879
            return Status(SERVER_INVALID_ARGUMENT, msg);
880
        }
881 882 883 884
    }
    return Status::OK();
}

C
Cai Yudong 已提交
885
/* server config */
S
starlord 已提交
886
Status
S
starlord 已提交
887
Config::CheckServerConfigAddress(const std::string& value) {
S
shengjh 已提交
888 889 890 891
    auto exist_error = !ValidationUtil::ValidateIpAddress(value).ok();
    fiu_do_on("check_config_address_fail", exist_error = true);

    if (exist_error) {
S
starlord 已提交
892 893
        std::string msg =
            "Invalid server IP address: " + value + ". Possible reason: server_config.address is invalid.";
894
        return Status(SERVER_INVALID_ARGUMENT, msg);
Z
zhiru 已提交
895
    }
Y
yudong.cai 已提交
896 897
    return Status::OK();
}
Z
zhiru 已提交
898

Y
yudong.cai 已提交
899
Status
S
starlord 已提交
900
Config::CheckServerConfigPort(const std::string& value) {
S
shengjh 已提交
901 902 903 904
    auto exist_error = !ValidationUtil::ValidateStringIsNumber(value).ok();
    fiu_do_on("check_config_port_fail", exist_error = true);

    if (exist_error) {
S
starlord 已提交
905
        std::string msg = "Invalid server port: " + value + ". Possible reason: server_config.port is not a number.";
906
        return Status(SERVER_INVALID_ARGUMENT, msg);
907
    } else {
J
Jin Hai 已提交
908 909 910 911 912 913 914 915 916
        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 已提交
917 918
        }
    }
Y
yudong.cai 已提交
919 920
    return Status::OK();
}
Z
zhiru 已提交
921

Y
yudong.cai 已提交
922
Status
S
starlord 已提交
923
Config::CheckServerConfigDeployMode(const std::string& value) {
S
shengjh 已提交
924 925 926 927
    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 已提交
928
    if (value != "single" && value != "cluster_readonly" && value != "cluster_writable") {
Y
yudong.cai 已提交
929
        return Status(SERVER_INVALID_ARGUMENT,
Z
Zhiru Zhu 已提交
930
                      "server_config.deploy_mode is not one of single, cluster_readonly, and cluster_writable.");
931
    }
Y
yudong.cai 已提交
932 933
    return Status::OK();
}
934

Y
yudong.cai 已提交
935
Status
S
starlord 已提交
936
Config::CheckServerConfigTimeZone(const std::string& value) {
S
shengjh 已提交
937 938 939
    fiu_return_on("check_config_time_zone_fail",
                  Status(SERVER_INVALID_ARGUMENT, "Invalid server_config.time_zone: " + value));

Y
yudong.cai 已提交
940
    if (value.length() <= 3) {
S
starlord 已提交
941
        return Status(SERVER_INVALID_ARGUMENT, "Invalid server_config.time_zone: " + value);
942
    } else {
Y
yudong.cai 已提交
943
        if (value.substr(0, 3) != "UTC") {
S
starlord 已提交
944
            return Status(SERVER_INVALID_ARGUMENT, "Invalid server_config.time_zone: " + value);
945
        } else {
J
Jin Hai 已提交
946
            if (!ValidationUtil::IsNumber(value.substr(4))) {
S
starlord 已提交
947
                return Status(SERVER_INVALID_ARGUMENT, "Invalid server_config.time_zone: " + value);
948
            }
949 950
        }
    }
Y
yudong.cai 已提交
951
    return Status::OK();
Z
zhiru 已提交
952 953
}

954 955 956 957 958
Status
Config::CheckServerConfigWebEnable(const std::string& value) {
    return ValidationUtil::ValidateStringIsBool(value);
}

B
BossZou 已提交
959 960 961 962 963 964 965
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 已提交
966 967 968 969 970 971 972 973 974
        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 已提交
975 976 977 978 979
        }
    }
    return Status::OK();
}

C
Cai Yudong 已提交
980
/* DB config */
Y
yudong.cai 已提交
981
Status
S
starlord 已提交
982
Config::CheckDBConfigBackendUrl(const std::string& value) {
S
shengjh 已提交
983 984 985 986
    auto exist_error = !ValidationUtil::ValidateDbURI(value).ok();
    fiu_do_on("check_config_backend_url_fail", exist_error = true);

    if (exist_error) {
987
        std::string msg =
S
starlord 已提交
988
            "Invalid backend url: " + value + ". Possible reason: db_config.db_backend_url is invalid. " +
989
            "The correct format should be like sqlite://:@:/ or mysql://root:123456@127.0.0.1:3306/milvus.";
990
        return Status(SERVER_INVALID_ARGUMENT, msg);
Z
zhiru 已提交
991
    }
Y
yudong.cai 已提交
992 993
    return Status::OK();
}
Z
zhiru 已提交
994

995
Status
996
Config::CheckDBConfigPreloadCollection(const std::string& value) {
997
    fiu_return_on("check_config_preload_collection_fail", Status(SERVER_INVALID_ARGUMENT, ""));
998

999 1000 1001 1002 1003 1004
    if (value.empty() || value == "*") {
        return Status::OK();
    }

    std::vector<std::string> tables;
    StringHelpFunctions::SplitStringByDelimeter(value, ",", tables);
1005 1006 1007

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

J
Jin Hai 已提交
1008 1009 1010
    for (auto& collection : tables) {
        if (!ValidationUtil::ValidateCollectionName(collection).ok()) {
            return Status(SERVER_INVALID_ARGUMENT, "Invalid collection name: " + collection);
1011 1012
        }
        bool exist = false;
1013
        auto status = DBWrapper::DB()->HasNativeCollection(collection, exist);
1014
        if (!(status.ok() && exist)) {
G
groot 已提交
1015
            return Status(SERVER_COLLECTION_NOT_EXIST, "Collection " + collection + " not exist");
1016
        }
J
Jin Hai 已提交
1017
        table_set.insert(collection);
1018 1019 1020 1021 1022
    }

    if (table_set.size() != tables.size()) {
        std::string msg =
            "Invalid preload tables. "
1023
            "Possible reason: db_config.preload_collection contains duplicate collection.";
1024
        return Status(SERVER_INVALID_ARGUMENT, msg);
1025 1026 1027 1028 1029
    }

    return Status::OK();
}

Y
yudong.cai 已提交
1030
Status
S
starlord 已提交
1031
Config::CheckDBConfigArchiveDiskThreshold(const std::string& value) {
S
shengjh 已提交
1032 1033 1034 1035
    auto exist_error = !ValidationUtil::ValidateStringIsNumber(value).ok();
    fiu_do_on("check_config_archive_disk_threshold_fail", exist_error = true);

    if (exist_error) {
1036
        std::string msg = "Invalid archive disk threshold: " + value +
S
starlord 已提交
1037
                          ". Possible reason: db_config.archive_disk_threshold is invalid.";
1038
        return Status(SERVER_INVALID_ARGUMENT, msg);
Z
zhiru 已提交
1039
    }
Y
yudong.cai 已提交
1040 1041
    return Status::OK();
}
Z
zhiru 已提交
1042

Y
yudong.cai 已提交
1043
Status
S
starlord 已提交
1044
Config::CheckDBConfigArchiveDaysThreshold(const std::string& value) {
S
shengjh 已提交
1045 1046 1047 1048
    auto exist_error = !ValidationUtil::ValidateStringIsNumber(value).ok();
    fiu_do_on("check_config_archive_days_threshold_fail", exist_error = true);

    if (exist_error) {
1049
        std::string msg = "Invalid archive days threshold: " + value +
1050
                          ". Possible reason: db_config.archive_days_threshold is invalid.";
1051
        return Status(SERVER_INVALID_ARGUMENT, msg);
Z
zhiru 已提交
1052
    }
Y
yudong.cai 已提交
1053 1054
    return Status::OK();
}
Z
zhiru 已提交
1055

1056 1057
Status
Config::CheckDBConfigAutoFlushInterval(const std::string& value) {
1058 1059 1060 1061
    auto exist_error = !ValidationUtil::ValidateStringIsNumber(value).ok();
    fiu_do_on("check_config_auto_flush_interval_fail", exist_error = true);

    if (exist_error) {
1062
        std::string msg = "Invalid db configuration auto_flush_interval: " + value +
1063
                          ". Possible reason: db.auto_flush_interval is not a natural number.";
1064 1065 1066 1067 1068 1069
        return Status(SERVER_INVALID_ARGUMENT, msg);
    }

    return Status::OK();
}

C
Cai Yudong 已提交
1070
/* storage config */
1071 1072
Status
Config::CheckStorageConfigPrimaryPath(const std::string& value) {
S
shengjh 已提交
1073
    fiu_return_on("check_config_primary_path_fail", Status(SERVER_INVALID_ARGUMENT, ""));
1074 1075 1076
    if (value.empty()) {
        return Status(SERVER_INVALID_ARGUMENT, "storage_config.db_path is empty.");
    }
1077 1078

    return ValidationUtil::ValidateStoragePath(value);
1079 1080 1081 1082
}

Status
Config::CheckStorageConfigSecondaryPath(const std::string& value) {
S
shengjh 已提交
1083
    fiu_return_on("check_config_secondary_path_fail", Status(SERVER_INVALID_ARGUMENT, ""));
1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107

    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");
    }

1108 1109 1110
    return Status::OK();
}

G
groot 已提交
1111 1112 1113
Status
Config::CheckStorageConfigFileCleanupTimeout(const std::string& value) {
    if (!ValidationUtil::ValidateStringIsNumber(value).ok()) {
C
Cai Yudong 已提交
1114
        std::string msg = "Invalid file_cleanup_timeout: " + value +
G
groot 已提交
1115 1116 1117 1118
                          ". Possible reason: storage_config.file_cleanup_timeout is not a positive integer.";
        return Status(SERVER_INVALID_ARGUMENT, msg);
    } else {
        int64_t file_cleanup_timeout = std::stoll(value);
C
Cai Yudong 已提交
1119 1120 1121
        if (file_cleanup_timeout < CONFIG_STORAGE_FILE_CLEANUP_TIMEOUT_MIN ||
            file_cleanup_timeout > CONFIG_STORAGE_FILE_CLEANUP_TIMEOUT_MAX) {
            std::string msg = "Invalid file_cleanup_timeout: " + value +
G
groot 已提交
1122
                              ". Possible reason: storage_config.file_cleanup_timeout is not in range [" +
C
Cai Yudong 已提交
1123 1124
                              std::to_string(CONFIG_STORAGE_FILE_CLEANUP_TIMEOUT_MIN) + ", " +
                              std::to_string(CONFIG_STORAGE_FILE_CLEANUP_TIMEOUT_MIN) + "].";
G
groot 已提交
1125 1126 1127 1128 1129 1130 1131
            return Status(SERVER_INVALID_ARGUMENT, msg);
        }
    }

    return Status::OK();
}

C
Cai Yudong 已提交
1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193
// Status
// Config::CheckStorageConfigS3Enable(const std::string& value) {
//    if (!ValidationUtil::ValidateStringIsBool(value).ok()) {
//        std::string msg =
//            "Invalid storage config: " + value + ". Possible reason: storage_config.s3_enable is not a boolean.";
//        return Status(SERVER_INVALID_ARGUMENT, msg);
//    }
//    return Status::OK();
// }
//
// Status
// Config::CheckStorageConfigS3Address(const std::string& value) {
//    if (!ValidationUtil::ValidateIpAddress(value).ok()) {
//        std::string msg = "Invalid s3 address: " + value + ". Possible reason: storage_config.s3_address is invalid.";
//        return Status(SERVER_INVALID_ARGUMENT, msg);
//    }
//    return Status::OK();
// }
//
// Status
// Config::CheckStorageConfigS3Port(const std::string& value) {
//    if (!ValidationUtil::ValidateStringIsNumber(value).ok()) {
//        std::string msg = "Invalid s3 port: " + value + ". Possible reason: storage_config.s3_port is not a number.";
//        return Status(SERVER_INVALID_ARGUMENT, msg);
//    } else {
//        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);
//        }
//    }
//    return Status::OK();
// }
//
// Status
// Config::CheckStorageConfigS3AccessKey(const std::string& value) {
//    if (value.empty()) {
//        return Status(SERVER_INVALID_ARGUMENT, "storage_config.s3_access_key is empty.");
//    }
//    return Status::OK();
// }
//
// Status
// Config::CheckStorageConfigS3SecretKey(const std::string& value) {
//    if (value.empty()) {
//        return Status(SERVER_INVALID_ARGUMENT, "storage_config.s3_secret_key is empty.");
//    }
//    return Status::OK();
// }
//
// Status
// Config::CheckStorageConfigS3Bucket(const std::string& value) {
//    if (value.empty()) {
//        return Status(SERVER_INVALID_ARGUMENT, "storage_config.s3_bucket is empty.");
//    }
//    return Status::OK();
// }
C
Cai Yudong 已提交
1194 1195

/* metric config */
S
starlord 已提交
1196
Status
S
starlord 已提交
1197
Config::CheckMetricConfigEnableMonitor(const std::string& value) {
S
shengjh 已提交
1198 1199 1200 1201
    auto exist_error = !ValidationUtil::ValidateStringIsBool(value).ok();
    fiu_do_on("check_config_enable_monitor_fail", exist_error = true);

    if (exist_error) {
1202
        std::string msg =
S
starlord 已提交
1203
            "Invalid metric config: " + value + ". Possible reason: metric_config.enable_monitor is not a boolean.";
1204
        return Status(SERVER_INVALID_ARGUMENT, msg);
Z
zhiru 已提交
1205
    }
Y
yudong.cai 已提交
1206 1207
    return Status::OK();
}
Z
zhiru 已提交
1208

Y
yudong.cai 已提交
1209
Status
C
Cai Yudong 已提交
1210
Config::CheckMetricConfigAddress(const std::string& value) {
1211
    if (!ValidationUtil::ValidateIpAddress(value).ok()) {
C
Cai Yudong 已提交
1212
        std::string msg = "Invalid metric ip: " + value + ". Possible reason: metric_config.ip is invalid.";
1213
        return Status(SERVER_INVALID_ARGUMENT, msg);
1214 1215 1216 1217
    }
    return Status::OK();
}

Y
yudong.cai 已提交
1218
Status
C
Cai Yudong 已提交
1219
Config::CheckMetricConfigPort(const std::string& value) {
Y
yudong.cai 已提交
1220
    if (!ValidationUtil::ValidateStringIsNumber(value).ok()) {
C
Cai Yudong 已提交
1221
        std::string msg = "Invalid metric port: " + value + ". Possible reason: metric_config.port is not a number.";
C
Cai Yudong 已提交
1222 1223
        return Status(SERVER_INVALID_ARGUMENT, msg);
    } else {
J
Jin Hai 已提交
1224 1225 1226 1227 1228 1229 1230 1231 1232
        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 已提交
1233
        }
Z
zhiru 已提交
1234
    }
Y
yudong.cai 已提交
1235
    return Status::OK();
Z
zhiru 已提交
1236 1237
}

C
Cai Yudong 已提交
1238
/* cache config */
S
starlord 已提交
1239
Status
S
starlord 已提交
1240
Config::CheckCacheConfigCpuCacheCapacity(const std::string& value) {
S
shengjh 已提交
1241 1242
    fiu_return_on("check_config_cpu_cache_capacity_fail", Status(SERVER_INVALID_ARGUMENT, ""));

Y
yudong.cai 已提交
1243
    if (!ValidationUtil::ValidateStringIsNumber(value).ok()) {
1244
        std::string msg = "Invalid cpu cache capacity: " + value +
S
starlord 已提交
1245
                          ". Possible reason: cache_config.cpu_cache_capacity is not a positive integer.";
1246
        return Status(SERVER_INVALID_ARGUMENT, msg);
1247
    } else {
Y
yudong.cai 已提交
1248
        int64_t cpu_cache_capacity = std::stoll(value) * GB;
1249 1250
        if (cpu_cache_capacity <= 0) {
            std::string msg = "Invalid cpu cache capacity: " + value +
S
starlord 已提交
1251
                              ". Possible reason: cache_config.cpu_cache_capacity is not a positive integer.";
1252 1253 1254
            return Status(SERVER_INVALID_ARGUMENT, msg);
        }

S
starlord 已提交
1255
        uint64_t total_mem = 0, free_mem = 0;
Z
zhiru 已提交
1256
        CommonUtil::GetSystemMemInfo(total_mem, free_mem);
1257 1258
        if (static_cast<uint64_t>(cpu_cache_capacity) >= total_mem) {
            std::string msg = "Invalid cpu cache capacity: " + value +
S
starlord 已提交
1259
                              ". Possible reason: cache_config.cpu_cache_capacity exceeds system memory.";
1260
            return Status(SERVER_INVALID_ARGUMENT, msg);
1261
        } else if (static_cast<double>(cpu_cache_capacity) > static_cast<double>(total_mem * 0.9)) {
1262
            std::cerr << "WARNING: cpu cache capacity value is too big" << std::endl;
Z
zhiru 已提交
1263
        }
1264

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

Y
yudong.cai 已提交
1268
        int64_t insert_buffer_size = buffer_value * GB;
S
shengjh 已提交
1269
        fiu_do_on("Config.CheckCacheConfigCpuCacheCapacity.large_insert_buffer", insert_buffer_size = total_mem + 1);
Y
yudong.cai 已提交
1270
        if (insert_buffer_size + cpu_cache_capacity >= total_mem) {
1271
            std::string msg = "Invalid cpu cache capacity: " + value +
S
starlord 已提交
1272
                              ". Possible reason: sum of cache_config.cpu_cache_capacity and "
1273
                              "cache_config.insert_buffer_size exceeds system memory.";
1274
            return Status(SERVER_INVALID_ARGUMENT, msg);
Z
zhiru 已提交
1275 1276
        }
    }
Y
yudong.cai 已提交
1277 1278
    return Status::OK();
}
Z
zhiru 已提交
1279

Y
yudong.cai 已提交
1280
Status
S
starlord 已提交
1281
Config::CheckCacheConfigCpuCacheThreshold(const std::string& value) {
S
shengjh 已提交
1282 1283
    fiu_return_on("check_config_cpu_cache_threshold_fail", Status(SERVER_INVALID_ARGUMENT, ""));

Y
yudong.cai 已提交
1284
    if (!ValidationUtil::ValidateStringIsFloat(value).ok()) {
1285
        std::string msg = "Invalid cpu cache threshold: " + value +
S
starlord 已提交
1286
                          ". Possible reason: cache_config.cpu_cache_threshold is not in range (0.0, 1.0].";
1287
        return Status(SERVER_INVALID_ARGUMENT, msg);
Y
yudong.cai 已提交
1288
    } else {
Y
yudong.cai 已提交
1289 1290
        float cpu_cache_threshold = std::stof(value);
        if (cpu_cache_threshold <= 0.0 || cpu_cache_threshold >= 1.0) {
1291
            std::string msg = "Invalid cpu cache threshold: " + value +
S
starlord 已提交
1292
                              ". Possible reason: cache_config.cpu_cache_threshold is not in range (0.0, 1.0].";
1293
            return Status(SERVER_INVALID_ARGUMENT, msg);
Y
yudong.cai 已提交
1294
        }
1295
    }
Y
yudong.cai 已提交
1296 1297
    return Status::OK();
}
1298

1299 1300
Status
Config::CheckCacheConfigInsertBufferSize(const std::string& value) {
S
shengjh 已提交
1301
    fiu_return_on("check_config_insert_buffer_size_fail", Status(SERVER_INVALID_ARGUMENT, ""));
1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313
    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);
        }

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

1317 1318
        uint64_t total_mem = 0, free_mem = 0;
        CommonUtil::GetSystemMemInfo(total_mem, free_mem);
T
Tinkerrr 已提交
1319
        if (buffer_size + cache_size >= total_mem) {
1320 1321 1322 1323 1324 1325 1326 1327
            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 已提交
1328
Status
S
starlord 已提交
1329
Config::CheckCacheConfigCacheInsertData(const std::string& value) {
S
shengjh 已提交
1330 1331
    fiu_return_on("check_config_cache_insert_data_fail", Status(SERVER_INVALID_ARGUMENT, ""));

Y
yudong.cai 已提交
1332
    if (!ValidationUtil::ValidateStringIsBool(value).ok()) {
1333
        std::string msg = "Invalid cache insert data option: " + value +
S
starlord 已提交
1334
                          ". Possible reason: cache_config.cache_insert_data is not a boolean.";
1335
        return Status(SERVER_INVALID_ARGUMENT, msg);
Y
yudong.cai 已提交
1336 1337
    }
    return Status::OK();
Z
zhiru 已提交
1338 1339
}

C
Cai Yudong 已提交
1340
/* engine config */
S
starlord 已提交
1341
Status
S
starlord 已提交
1342
Config::CheckEngineConfigUseBlasThreshold(const std::string& value) {
S
shengjh 已提交
1343 1344
    fiu_return_on("check_config_use_blas_threshold_fail", Status(SERVER_INVALID_ARGUMENT, ""));

Y
yudong.cai 已提交
1345
    if (!ValidationUtil::ValidateStringIsNumber(value).ok()) {
1346
        std::string msg = "Invalid use blas threshold: " + value +
S
starlord 已提交
1347
                          ". Possible reason: engine_config.use_blas_threshold is not a positive integer.";
1348
        return Status(SERVER_INVALID_ARGUMENT, msg);
Z
zhiru 已提交
1349
    }
Y
yudong.cai 已提交
1350 1351
    return Status::OK();
}
Z
zhiru 已提交
1352

Y
yudong.cai 已提交
1353
Status
S
starlord 已提交
1354
Config::CheckEngineConfigOmpThreadNum(const std::string& value) {
S
shengjh 已提交
1355 1356
    fiu_return_on("check_config_omp_thread_num_fail", Status(SERVER_INVALID_ARGUMENT, ""));

Y
yudong.cai 已提交
1357
    if (!ValidationUtil::ValidateStringIsNumber(value).ok()) {
1358
        std::string msg = "Invalid omp thread num: " + value +
S
starlord 已提交
1359
                          ". Possible reason: engine_config.omp_thread_num is not a positive integer.";
1360
        return Status(SERVER_INVALID_ARGUMENT, msg);
S
starlord 已提交
1361 1362
    }

Y
yudong.cai 已提交
1363 1364
    int64_t omp_thread = std::stoll(value);
    int64_t sys_thread_cnt = 8;
S
starlord 已提交
1365
    CommonUtil::GetSystemAvailableThreads(sys_thread_cnt);
Y
yudong.cai 已提交
1366
    if (omp_thread > sys_thread_cnt) {
1367
        std::string msg = "Invalid omp thread num: " + value +
S
starlord 已提交
1368
                          ". Possible reason: engine_config.omp_thread_num exceeds system cpu cores.";
1369
        return Status(SERVER_INVALID_ARGUMENT, msg);
Z
zhiru 已提交
1370
    }
Y
yudong.cai 已提交
1371
    return Status::OK();
Z
zhiru 已提交
1372 1373
}

C
Cai Yudong 已提交
1374
Status
F
feisiyicl 已提交
1375 1376 1377 1378 1379 1380
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 已提交
1381 1382 1383 1384
    }
    return Status::OK();
}

G
groot 已提交
1385
#ifdef MILVUS_GPU_VERSION
B
BossZou 已提交
1386

W
wxyu 已提交
1387
Status
1388
Config::CheckEngineConfigGpuSearchThreshold(const std::string& value) {
S
shengjh 已提交
1389 1390
    fiu_return_on("check_config_gpu_search_threshold_fail", Status(SERVER_INVALID_ARGUMENT, ""));

W
wxyu 已提交
1391
    if (!ValidationUtil::ValidateStringIsNumber(value).ok()) {
1392 1393
        std::string msg = "Invalid gpu search threshold: " + value +
                          ". Possible reason: engine_config.gpu_search_threshold is not a positive integer.";
W
wxyu 已提交
1394 1395 1396 1397 1398
        return Status(SERVER_INVALID_ARGUMENT, msg);
    }
    return Status::OK();
}

C
Cai Yudong 已提交
1399
/* gpu resource config */
S
starlord 已提交
1400
Status
1401
Config::CheckGpuResourceConfigEnable(const std::string& value) {
S
shengjh 已提交
1402 1403
    fiu_return_on("check_config_gpu_resource_enable_fail", Status(SERVER_INVALID_ARGUMENT, ""));

Y
yudong.cai 已提交
1404
    if (!ValidationUtil::ValidateStringIsBool(value).ok()) {
1405 1406
        std::string msg =
            "Invalid gpu resource config: " + value + ". Possible reason: gpu_resource_config.enable is not a boolean.";
1407
        return Status(SERVER_INVALID_ARGUMENT, msg);
W
wxyu 已提交
1408
    }
Y
yudong.cai 已提交
1409 1410
    return Status::OK();
}
1411

Y
yudong.cai 已提交
1412
Status
Y
yudong.cai 已提交
1413
Config::CheckGpuResourceConfigCacheCapacity(const std::string& value) {
S
shengjh 已提交
1414 1415
    fiu_return_on("check_gpu_resource_config_cache_capacity_fail", Status(SERVER_INVALID_ARGUMENT, ""));

Y
yudong.cai 已提交
1416 1417 1418
    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.";
1419
        return Status(SERVER_INVALID_ARGUMENT, msg);
Y
yudong.cai 已提交
1420
    } else {
Y
yudong.cai 已提交
1421 1422
        int64_t gpu_cache_capacity = std::stoll(value) * GB;
        std::vector<int64_t> gpu_ids;
C
Cai Yudong 已提交
1423
        STATUS_CHECK(GetGpuResourceConfigBuildIndexResources(gpu_ids));
Y
yudong.cai 已提交
1424

Y
yudong.cai 已提交
1425
        for (int64_t gpu_id : gpu_ids) {
Y
yudong.cai 已提交
1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437
            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 已提交
1438
    }
Y
yudong.cai 已提交
1439 1440
    return Status::OK();
}
1441

Y
yudong.cai 已提交
1442
Status
Y
yudong.cai 已提交
1443
Config::CheckGpuResourceConfigCacheThreshold(const std::string& value) {
S
shengjh 已提交
1444 1445
    fiu_return_on("check_config_gpu_resource_cache_threshold_fail", Status(SERVER_INVALID_ARGUMENT, ""));

Y
yudong.cai 已提交
1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462
    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 已提交
1463 1464
    std::string s = value;
    std::transform(s.begin(), s.end(), s.begin(), ::tolower);
Z
Zhiru Zhu 已提交
1465

Y
yudong.cai 已提交
1466
    const std::regex pat("gpu(\\d+)");
Z
Zhiru Zhu 已提交
1467 1468
    std::smatch m;
    if (!std::regex_match(s, m, pat)) {
Y
yudong.cai 已提交
1469 1470
        std::string msg = "Invalid gpu resource: " + value +
                          ". Possible reason: gpu_resource_config is not in the format of cpux or gpux";
1471
        return Status(SERVER_INVALID_ARGUMENT, msg);
1472 1473
    }

Z
Zhiru Zhu 已提交
1474
    if (s.compare(0, 3, "gpu") == 0) {
J
Jin Hai 已提交
1475 1476 1477 1478 1479 1480 1481 1482 1483
        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 已提交
1484
        }
1485
    }
Z
Zhiru Zhu 已提交
1486

1487 1488 1489 1490
    return Status::OK();
}

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

Y
yudong.cai 已提交
1494
    if (value.empty()) {
1495
        std::string msg =
Y
yudong.cai 已提交
1496 1497
            "Invalid gpu search resource. "
            "Possible reason: gpu_resource_config.search_resources is empty.";
1498
        return Status(SERVER_INVALID_ARGUMENT, msg);
1499 1500
    }

B
BossZou 已提交
1501
    std::unordered_set<std::string> value_set;
Z
Zhiru Zhu 已提交
1502
    for (auto& resource : value) {
C
Cai Yudong 已提交
1503
        STATUS_CHECK(CheckGpuResource(resource));
B
BossZou 已提交
1504
        value_set.insert(resource);
1505
    }
B
BossZou 已提交
1506 1507 1508 1509 1510 1511 1512 1513

    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);
    }

1514 1515 1516 1517
    return Status::OK();
}

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

1521 1522
    if (value.empty()) {
        std::string msg =
Y
yudong.cai 已提交
1523 1524
            "Invalid gpu build index resource. "
            "Possible reason: gpu_resource_config.build_index_resources is empty.";
1525 1526 1527
        return Status(SERVER_INVALID_ARGUMENT, msg);
    }

B
BossZou 已提交
1528
    std::unordered_set<std::string> value_set;
1529
    for (auto& resource : value) {
C
Cai Yudong 已提交
1530
        STATUS_CHECK(CheckGpuResource(resource));
B
BossZou 已提交
1531 1532 1533 1534 1535 1536 1537 1538
        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 已提交
1539
    }
1540

Y
yudong.cai 已提交
1541
    return Status::OK();
G
groot 已提交
1542
}
B
BossZou 已提交
1543

G
groot 已提交
1544
#endif
G
groot 已提交
1545

1546 1547 1548 1549 1550 1551 1552
/* 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 已提交
1553

C
Cai Yudong 已提交
1554 1555 1556
/* wal config */
Status
Config::CheckWalConfigEnable(const std::string& value) {
J
Jin Hai 已提交
1557 1558 1559 1560
    auto exist_error = !ValidationUtil::ValidateStringIsBool(value).ok();
    fiu_do_on("check_config_wal_enable_fail", exist_error = true);

    if (exist_error) {
C
Cai Yudong 已提交
1561 1562 1563 1564 1565 1566 1567 1568
        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 已提交
1569 1570 1571 1572
    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 已提交
1573 1574 1575 1576 1577 1578 1579 1580 1581
        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 已提交
1582 1583 1584 1585
    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 已提交
1586 1587 1588 1589 1590 1591 1592
        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 已提交
1593 1594 1595 1596 1597 1598 1599 1600 1601 1602
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 已提交
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 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 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685
/* 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 已提交
1686 1687 1688 1689 1690 1691 1692 1693 1694
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);
C
Cai Yudong 已提交
1695 1696 1697 1698 1699 1700 1701 1702 1703 1704
    } else {
        int64_t max_log_file_size = std::stoll(value);
        if (max_log_file_size < CONFIG_LOGS_MAX_LOG_FILE_SIZE_MIN ||
            max_log_file_size > CONFIG_LOGS_MAX_LOG_FILE_SIZE_MAX) {
            std::string msg = "Invalid max_log_file_size: " + value +
                              ". Possible reason: logs.max_log_file_size is not in range [" +
                              std::to_string(CONFIG_LOGS_MAX_LOG_FILE_SIZE_MIN) + ", " +
                              std::to_string(CONFIG_LOGS_MAX_LOG_FILE_SIZE_MAX) + "].";
            return Status(SERVER_INVALID_ARGUMENT, msg);
        }
W
Wang XiangYu 已提交
1705 1706 1707 1708 1709
    }
    return Status::OK();
}

Status
C
Cai Yudong 已提交
1710
Config::CheckLogsLogRotateNum(const std::string& value) {
W
Wang XiangYu 已提交
1711
    auto exist_error = !ValidationUtil::ValidateStringIsNumber(value).ok();
C
Cai Yudong 已提交
1712
    fiu_do_on("check_logs_log_rotate_num_fail", exist_error = true);
W
Wang XiangYu 已提交
1713 1714

    if (exist_error) {
C
Cai Yudong 已提交
1715 1716
        std::string msg =
            "Invalid log_rotate_num: " + value + ". Possible reason: logs.log_rotate_num is not a positive integer.";
W
Wang XiangYu 已提交
1717
        return Status(SERVER_INVALID_ARGUMENT, msg);
C
Cai Yudong 已提交
1718 1719 1720 1721 1722 1723 1724 1725 1726
    } else {
        int64_t log_rotate_num = std::stoll(value);
        if (log_rotate_num < CONFIG_LOGS_LOG_ROTATE_NUM_MIN || log_rotate_num > CONFIG_LOGS_LOG_ROTATE_NUM_MAX) {
            std::string msg = "Invalid log_rotate_num: " + value +
                              ". Possible reason: logs.log_rotate_num is not in range [" +
                              std::to_string(CONFIG_LOGS_LOG_ROTATE_NUM_MIN) + ", " +
                              std::to_string(CONFIG_LOGS_LOG_ROTATE_NUM_MAX) + "].";
            return Status(SERVER_INVALID_ARGUMENT, msg);
        }
W
Wang XiangYu 已提交
1727 1728 1729 1730
    }
    return Status::OK();
}

Y
yudong.cai 已提交
1731
////////////////////////////////////////////////////////////////////////////////
S
starlord 已提交
1732
ConfigNode&
1733
Config::GetConfigRoot() {
1734
    ConfigMgr* mgr = YamlConfigMgr::GetInstance();
1735 1736 1737 1738 1739 1740
    return mgr->GetRootNode();
}

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

C
Cai Yudong 已提交
1743 1744 1745 1746 1747
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 已提交
1748
    return config_map_[parent_key].count(child_key) != 0;
C
Cai Yudong 已提交
1749 1750
}

Y
yudong.cai 已提交
1751
Status
S
starlord 已提交
1752
Config::GetConfigValueInMem(const std::string& parent_key, const std::string& child_key, std::string& value) {
Y
yudong.cai 已提交
1753
    std::lock_guard<std::mutex> lock(mutex_);
Y
yudong.cai 已提交
1754 1755 1756 1757 1758
    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 已提交
1759
    return Status(SERVER_UNEXPECTED_ERROR, "key not exist");
Y
yudong.cai 已提交
1760 1761
}

C
Cai Yudong 已提交
1762
Status
S
starlord 已提交
1763
Config::SetConfigValueInMem(const std::string& parent_key, const std::string& child_key, const std::string& value) {
Y
yudong.cai 已提交
1764 1765
    std::lock_guard<std::mutex> lock(mutex_);
    config_map_[parent_key][child_key] = value;
C
Cai Yudong 已提交
1766
    return Status::OK();
Y
yudong.cai 已提交
1767 1768 1769
}

////////////////////////////////////////////////////////////////////////////////
Y
yudong.cai 已提交
1770
std::string
S
starlord 已提交
1771
Config::GetConfigStr(const std::string& parent_key, const std::string& child_key, const std::string& default_value) {
Y
yudong.cai 已提交
1772
    std::string value;
S
starlord 已提交
1773 1774 1775
    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 已提交
1776
    }
Y
yudong.cai 已提交
1777
    return value;
Y
yudong.cai 已提交
1778 1779
}

Z
Zhiru Zhu 已提交
1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795
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;
}

1796 1797 1798 1799 1800 1801
Status
Config::GetConfigVersion(std::string& value) {
    value = GetConfigRoot().GetValue(CONFIG_VERSION);
    return CheckConfigVersion(value);
}

1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827
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 已提交
1828
/* server config */
1829
Status
S
starlord 已提交
1830
Config::GetServerConfigAddress(std::string& value) {
S
starlord 已提交
1831
    value = GetConfigStr(CONFIG_SERVER, CONFIG_SERVER_ADDRESS, CONFIG_SERVER_ADDRESS_DEFAULT);
Y
yudong.cai 已提交
1832
    return CheckServerConfigAddress(value);
1833 1834 1835
}

Status
S
starlord 已提交
1836
Config::GetServerConfigPort(std::string& value) {
S
starlord 已提交
1837
    value = GetConfigStr(CONFIG_SERVER, CONFIG_SERVER_PORT, CONFIG_SERVER_PORT_DEFAULT);
Y
yudong.cai 已提交
1838
    return CheckServerConfigPort(value);
1839 1840 1841
}

Status
S
starlord 已提交
1842
Config::GetServerConfigDeployMode(std::string& value) {
S
starlord 已提交
1843
    value = GetConfigStr(CONFIG_SERVER, CONFIG_SERVER_DEPLOY_MODE, CONFIG_SERVER_DEPLOY_MODE_DEFAULT);
Y
yudong.cai 已提交
1844
    return CheckServerConfigDeployMode(value);
1845 1846 1847
}

Status
S
starlord 已提交
1848
Config::GetServerConfigTimeZone(std::string& value) {
S
starlord 已提交
1849
    value = GetConfigStr(CONFIG_SERVER, CONFIG_SERVER_TIME_ZONE, CONFIG_SERVER_TIME_ZONE_DEFAULT);
Y
yudong.cai 已提交
1850
    return CheckServerConfigTimeZone(value);
1851 1852
}

1853 1854 1855
Status
Config::GetServerConfigWebEnable(bool& value) {
    std::string str = GetConfigStr(CONFIG_SERVER, CONFIG_SERVER_WEB_ENABLE, CONFIG_SERVER_WEB_ENABLE_DEFAULT);
C
Cai Yudong 已提交
1856
    STATUS_CHECK(CheckServerConfigWebEnable(str));
1857 1858 1859
    return StringHelpFunctions::ConvertToBoolean(str, value);
}

B
BossZou 已提交
1860 1861 1862 1863 1864 1865
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 已提交
1866
/* DB config */
1867
Status
S
starlord 已提交
1868
Config::GetDBConfigBackendUrl(std::string& value) {
S
starlord 已提交
1869
    value = GetConfigStr(CONFIG_DB, CONFIG_DB_BACKEND_URL, CONFIG_DB_BACKEND_URL_DEFAULT);
Y
yudong.cai 已提交
1870
    return CheckDBConfigBackendUrl(value);
1871 1872 1873
}

Status
Y
yudong.cai 已提交
1874
Config::GetDBConfigArchiveDiskThreshold(int64_t& value) {
S
starlord 已提交
1875 1876
    std::string str =
        GetConfigStr(CONFIG_DB, CONFIG_DB_ARCHIVE_DISK_THRESHOLD, CONFIG_DB_ARCHIVE_DISK_THRESHOLD_DEFAULT);
C
Cai Yudong 已提交
1877
    STATUS_CHECK(CheckDBConfigArchiveDiskThreshold(str));
Y
yudong.cai 已提交
1878
    value = std::stoll(str);
1879 1880 1881 1882
    return Status::OK();
}

Status
Y
yudong.cai 已提交
1883
Config::GetDBConfigArchiveDaysThreshold(int64_t& value) {
S
starlord 已提交
1884 1885
    std::string str =
        GetConfigStr(CONFIG_DB, CONFIG_DB_ARCHIVE_DAYS_THRESHOLD, CONFIG_DB_ARCHIVE_DAYS_THRESHOLD_DEFAULT);
C
Cai Yudong 已提交
1886
    STATUS_CHECK(CheckDBConfigArchiveDaysThreshold(str));
Y
yudong.cai 已提交
1887
    value = std::stoll(str);
1888 1889 1890
    return Status::OK();
}

S
starlord 已提交
1891
Status
1892
Config::GetDBConfigPreloadCollection(std::string& value) {
G
groot 已提交
1893
    value = GetConfigStr(CONFIG_DB, CONFIG_DB_PRELOAD_COLLECTION);
S
starlord 已提交
1894 1895 1896
    return Status::OK();
}

1897
Status
C
Cai Yudong 已提交
1898
Config::GetDBConfigAutoFlushInterval(int64_t& value) {
1899
    std::string str = GetConfigStr(CONFIG_DB, CONFIG_DB_AUTO_FLUSH_INTERVAL, CONFIG_DB_AUTO_FLUSH_INTERVAL_DEFAULT);
C
Cai Yudong 已提交
1900
    STATUS_CHECK(CheckDBConfigAutoFlushInterval(str));
C
Cai Yudong 已提交
1901
    value = std::stoll(str);
1902 1903 1904
    return Status::OK();
}

C
Cai Yudong 已提交
1905
/* storage config */
1906 1907
Status
Config::GetStorageConfigPrimaryPath(std::string& value) {
C
Cai Yudong 已提交
1908
    value = GetConfigStr(CONFIG_STORAGE, CONFIG_STORAGE_PRIMARY_PATH, CONFIG_STORAGE_PRIMARY_PATH_DEFAULT);
1909 1910 1911 1912 1913
    return CheckStorageConfigPrimaryPath(value);
}

Status
Config::GetStorageConfigSecondaryPath(std::string& value) {
C
Cai Yudong 已提交
1914
    value = GetConfigStr(CONFIG_STORAGE, CONFIG_STORAGE_SECONDARY_PATH, CONFIG_STORAGE_SECONDARY_PATH_DEFAULT);
1915 1916 1917
    return CheckStorageConfigSecondaryPath(value);
}

G
groot 已提交
1918 1919 1920 1921
Status
Config::GetStorageConfigFileCleanupTimeup(int64_t& value) {
    std::string str =
        GetConfigStr(CONFIG_STORAGE, CONFIG_STORAGE_FILE_CLEANUP_TIMEOUT, CONFIG_STORAGE_FILE_CLEANUP_TIMEOUT_DEFAULT);
C
Cai Yudong 已提交
1922
    STATUS_CHECK(CheckStorageConfigFileCleanupTimeout(str));
G
groot 已提交
1923 1924 1925 1926
    value = std::stoll(str);
    return Status::OK();
}

C
Cai Yudong 已提交
1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963
// Status
// Config::GetStorageConfigS3Enable(bool& value) {
//    std::string str = GetConfigStr(CONFIG_STORAGE, CONFIG_STORAGE_S3_ENABLE, CONFIG_STORAGE_S3_ENABLE_DEFAULT);
//    STATUS_CHECK(CheckStorageConfigS3Enable(str));
//    STATUS_CHECK(StringHelpFunctions::ConvertToBoolean(str, value));
//    return Status::OK();
// }
//
// Status
// Config::GetStorageConfigS3Address(std::string& value) {
//    value = GetConfigStr(CONFIG_STORAGE, CONFIG_STORAGE_S3_ADDRESS, CONFIG_STORAGE_S3_ADDRESS_DEFAULT);
//    return CheckStorageConfigS3Address(value);
// }
//
// Status
// Config::GetStorageConfigS3Port(std::string& value) {
//    value = GetConfigStr(CONFIG_STORAGE, CONFIG_STORAGE_S3_PORT, CONFIG_STORAGE_S3_PORT_DEFAULT);
//    return CheckStorageConfigS3Port(value);
// }
//
// Status
// Config::GetStorageConfigS3AccessKey(std::string& value) {
//    value = GetConfigStr(CONFIG_STORAGE, CONFIG_STORAGE_S3_ACCESS_KEY, CONFIG_STORAGE_S3_ACCESS_KEY_DEFAULT);
//    return Status::OK();
// }
//
// Status
// Config::GetStorageConfigS3SecretKey(std::string& value) {
//    value = GetConfigStr(CONFIG_STORAGE, CONFIG_STORAGE_S3_SECRET_KEY, CONFIG_STORAGE_S3_SECRET_KEY_DEFAULT);
//    return Status::OK();
// }
//
// Status
// Config::GetStorageConfigS3Bucket(std::string& value) {
//    value = GetConfigStr(CONFIG_STORAGE, CONFIG_STORAGE_S3_BUCKET, CONFIG_STORAGE_S3_BUCKET_DEFAULT);
//    return Status::OK();
// }
C
Cai Yudong 已提交
1964 1965

/* metric config */
1966
Status
S
starlord 已提交
1967
Config::GetMetricConfigEnableMonitor(bool& value) {
1968
    std::string str = GetConfigStr(CONFIG_METRIC, CONFIG_METRIC_ENABLE_MONITOR, CONFIG_METRIC_ENABLE_MONITOR_DEFAULT);
C
Cai Yudong 已提交
1969 1970
    STATUS_CHECK(CheckMetricConfigEnableMonitor(str));
    STATUS_CHECK(StringHelpFunctions::ConvertToBoolean(str, value));
1971 1972 1973 1974
    return Status::OK();
}

Status
C
Cai Yudong 已提交
1975 1976
Config::GetMetricConfigAddress(std::string& value) {
    value = GetConfigStr(CONFIG_METRIC, CONFIG_METRIC_ADDRESS, CONFIG_METRIC_ADDRESS_DEFAULT);
Y
yudong.cai 已提交
1977
    return Status::OK();
1978 1979
}

1980
Status
C
Cai Yudong 已提交
1981 1982 1983
Config::GetMetricConfigPort(std::string& value) {
    value = GetConfigStr(CONFIG_METRIC, CONFIG_METRIC_PORT, CONFIG_METRIC_PORT_DEFAULT);
    return CheckMetricConfigPort(value);
1984 1985
}

C
Cai Yudong 已提交
1986
/* cache config */
1987
Status
W
wxyu 已提交
1988
Config::GetCacheConfigCpuCacheCapacity(int64_t& value) {
S
starlord 已提交
1989 1990
    std::string str =
        GetConfigStr(CONFIG_CACHE, CONFIG_CACHE_CPU_CACHE_CAPACITY, CONFIG_CACHE_CPU_CACHE_CAPACITY_DEFAULT);
C
Cai Yudong 已提交
1991
    STATUS_CHECK(CheckCacheConfigCpuCacheCapacity(str));
Y
yudong.cai 已提交
1992
    value = std::stoll(str);
1993 1994 1995 1996
    return Status::OK();
}

Status
S
starlord 已提交
1997
Config::GetCacheConfigCpuCacheThreshold(float& value) {
S
starlord 已提交
1998 1999
    std::string str =
        GetConfigStr(CONFIG_CACHE, CONFIG_CACHE_CPU_CACHE_THRESHOLD, CONFIG_CACHE_CPU_CACHE_THRESHOLD_DEFAULT);
C
Cai Yudong 已提交
2000
    STATUS_CHECK(CheckCacheConfigCpuCacheThreshold(str));
2001 2002 2003 2004
    value = std::stof(str);
    return Status::OK();
}

2005 2006 2007 2008
Status
Config::GetCacheConfigInsertBufferSize(int64_t& value) {
    std::string str =
        GetConfigStr(CONFIG_CACHE, CONFIG_CACHE_INSERT_BUFFER_SIZE, CONFIG_CACHE_INSERT_BUFFER_SIZE_DEFAULT);
C
Cai Yudong 已提交
2009
    STATUS_CHECK(CheckCacheConfigInsertBufferSize(str));
2010 2011 2012 2013
    value = std::stoll(str);
    return Status::OK();
}

2014
Status
S
starlord 已提交
2015
Config::GetCacheConfigCacheInsertData(bool& value) {
S
starlord 已提交
2016 2017
    std::string str =
        GetConfigStr(CONFIG_CACHE, CONFIG_CACHE_CACHE_INSERT_DATA, CONFIG_CACHE_CACHE_INSERT_DATA_DEFAULT);
C
Cai Yudong 已提交
2018
    STATUS_CHECK(CheckCacheConfigCacheInsertData(str));
2019 2020 2021 2022 2023
    std::transform(str.begin(), str.end(), str.begin(), ::tolower);
    value = (str == "true" || str == "on" || str == "yes" || str == "1");
    return Status::OK();
}

C
Cai Yudong 已提交
2024
/* engine config */
2025
Status
Y
yudong.cai 已提交
2026
Config::GetEngineConfigUseBlasThreshold(int64_t& value) {
S
starlord 已提交
2027 2028
    std::string str =
        GetConfigStr(CONFIG_ENGINE, CONFIG_ENGINE_USE_BLAS_THRESHOLD, CONFIG_ENGINE_USE_BLAS_THRESHOLD_DEFAULT);
C
Cai Yudong 已提交
2029
    STATUS_CHECK(CheckEngineConfigUseBlasThreshold(str));
Y
yudong.cai 已提交
2030
    value = std::stoll(str);
2031 2032 2033 2034
    return Status::OK();
}

Status
Y
yudong.cai 已提交
2035
Config::GetEngineConfigOmpThreadNum(int64_t& value) {
2036
    std::string str = GetConfigStr(CONFIG_ENGINE, CONFIG_ENGINE_OMP_THREAD_NUM, CONFIG_ENGINE_OMP_THREAD_NUM_DEFAULT);
C
Cai Yudong 已提交
2037
    STATUS_CHECK(CheckEngineConfigOmpThreadNum(str));
Y
yudong.cai 已提交
2038
    value = std::stoll(str);
2039 2040 2041
    return Status::OK();
}

C
Cai Yudong 已提交
2042
Status
F
feisiyicl 已提交
2043 2044 2045
Config::GetEngineConfigSimdType(std::string& value) {
    value = GetConfigStr(CONFIG_ENGINE, CONFIG_ENGINE_SIMD_TYPE, CONFIG_ENGINE_SIMD_TYPE_DEFAULT);
    return CheckEngineConfigSimdType(value);
C
Cai Yudong 已提交
2046 2047
}

G
groot 已提交
2048
#ifdef MILVUS_GPU_VERSION
W
wxyu 已提交
2049
Status
Y
yudong.cai 已提交
2050
Config::GetEngineConfigGpuSearchThreshold(int64_t& value) {
W
wxyu 已提交
2051
    std::string str =
2052
        GetConfigStr(CONFIG_ENGINE, CONFIG_ENGINE_GPU_SEARCH_THRESHOLD, CONFIG_ENGINE_GPU_SEARCH_THRESHOLD_DEFAULT);
C
Cai Yudong 已提交
2053
    STATUS_CHECK(CheckEngineConfigGpuSearchThreshold(str));
Y
yudong.cai 已提交
2054
    value = std::stoll(str);
W
wxyu 已提交
2055 2056
    return Status::OK();
}
C
Cai Yudong 已提交
2057
#endif
W
wxyu 已提交
2058

C
Cai Yudong 已提交
2059 2060
/* gpu resource config */
#ifdef MILVUS_GPU_VERSION
S
shengjh 已提交
2061

2062
Status
2063 2064
Config::GetGpuResourceConfigEnable(bool& value) {
    std::string str = GetConfigStr(CONFIG_GPU_RESOURCE, CONFIG_GPU_RESOURCE_ENABLE, CONFIG_GPU_RESOURCE_ENABLE_DEFAULT);
C
Cai Yudong 已提交
2065 2066
    STATUS_CHECK(CheckGpuResourceConfigEnable(str));
    STATUS_CHECK(StringHelpFunctions::ConvertToBoolean(str, value));
Y
yudong.cai 已提交
2067
    return Status::OK();
2068 2069 2070
}

Status
Y
yudong.cai 已提交
2071
Config::GetGpuResourceConfigCacheCapacity(int64_t& value) {
2072
    bool gpu_resource_enable = false;
C
Cai Yudong 已提交
2073
    STATUS_CHECK(GetGpuResourceConfigEnable(gpu_resource_enable));
S
shengjh 已提交
2074
    fiu_do_on("Config.GetGpuResourceConfigCacheCapacity.diable_gpu_resource", gpu_resource_enable = false);
2075 2076
    if (!gpu_resource_enable) {
        std::string msg = "GPU not supported. Possible reason: gpu_resource_config.enable is set to false.";
Y
yudong.cai 已提交
2077 2078 2079 2080
        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 已提交
2081
    STATUS_CHECK(CheckGpuResourceConfigCacheCapacity(str));
Y
yudong.cai 已提交
2082
    value = std::stoll(str);
W
wxyu 已提交
2083 2084 2085
    return Status::OK();
}

2086
Status
Y
yudong.cai 已提交
2087
Config::GetGpuResourceConfigCacheThreshold(float& value) {
2088
    bool gpu_resource_enable = false;
C
Cai Yudong 已提交
2089
    STATUS_CHECK(GetGpuResourceConfigEnable(gpu_resource_enable));
S
shengjh 已提交
2090
    fiu_do_on("Config.GetGpuResourceConfigCacheThreshold.diable_gpu_resource", gpu_resource_enable = false);
2091 2092
    if (!gpu_resource_enable) {
        std::string msg = "GPU not supported. Possible reason: gpu_resource_config.enable is set to false.";
Y
yudong.cai 已提交
2093 2094 2095 2096
        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 已提交
2097
    STATUS_CHECK(CheckGpuResourceConfigCacheThreshold(str));
Y
yudong.cai 已提交
2098 2099
    value = std::stof(str);
    return Status::OK();
2100 2101 2102
}

Status
Y
yudong.cai 已提交
2103
Config::GetGpuResourceConfigSearchResources(std::vector<int64_t>& value) {
2104
    bool gpu_resource_enable = false;
C
Cai Yudong 已提交
2105
    STATUS_CHECK(GetGpuResourceConfigEnable(gpu_resource_enable));
S
shengjh 已提交
2106
    fiu_do_on("get_gpu_config_search_resources.disable_gpu_resource_fail", gpu_resource_enable = false);
2107 2108
    if (!gpu_resource_enable) {
        std::string msg = "GPU not supported. Possible reason: gpu_resource_config.enable is set to false.";
Y
yudong.cai 已提交
2109 2110 2111 2112 2113 2114
        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 已提交
2115
    STATUS_CHECK(CheckGpuResourceConfigSearchResources(res_vec));
2116
    value.clear();
Y
yudong.cai 已提交
2117
    for (std::string& res : res_vec) {
Y
yudong.cai 已提交
2118
        value.push_back(std::stoll(res.substr(3)));
Y
yudong.cai 已提交
2119 2120
    }
    return Status::OK();
2121 2122 2123
}

Status
Y
yudong.cai 已提交
2124
Config::GetGpuResourceConfigBuildIndexResources(std::vector<int64_t>& value) {
2125
    bool gpu_resource_enable = false;
C
Cai Yudong 已提交
2126
    STATUS_CHECK(GetGpuResourceConfigEnable(gpu_resource_enable));
S
shengjh 已提交
2127
    fiu_do_on("get_gpu_config_build_index_resources.disable_gpu_resource_fail", gpu_resource_enable = false);
2128 2129
    if (!gpu_resource_enable) {
        std::string msg = "GPU not supported. Possible reason: gpu_resource_config.enable is set to false.";
Y
yudong.cai 已提交
2130 2131
        return Status(SERVER_UNSUPPORTED_ERROR, msg);
    }
2132
    std::string str =
Y
yudong.cai 已提交
2133 2134 2135 2136
        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 已提交
2137
    STATUS_CHECK(CheckGpuResourceConfigBuildIndexResources(res_vec));
2138
    value.clear();
Y
yudong.cai 已提交
2139
    for (std::string& res : res_vec) {
Y
yudong.cai 已提交
2140
        value.push_back(std::stoll(res.substr(3)));
Y
yudong.cai 已提交
2141
    }
2142
    return Status::OK();
Y
yudong.cai 已提交
2143
}
B
BossZou 已提交
2144

G
groot 已提交
2145
#endif
G
groot 已提交
2146

Z
Zhiru Zhu 已提交
2147 2148 2149 2150
/* tracing config */
Status
Config::GetTracingConfigJsonConfigPath(std::string& value) {
    value = GetConfigStr(CONFIG_TRACING, CONFIG_TRACING_JSON_CONFIG_PATH, "");
S
shengjh 已提交
2151
    fiu_do_on("get_config_json_config_path_fail", value = "error_config_json_path");
Z
Zhiru Zhu 已提交
2152 2153 2154 2155 2156 2157 2158 2159 2160 2161 2162
    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();
}

2163 2164 2165 2166
/* wal config */
Status
Config::GetWalConfigEnable(bool& wal_enable) {
    std::string str = GetConfigStr(CONFIG_WAL, CONFIG_WAL_ENABLE, CONFIG_WAL_ENABLE_DEFAULT);
C
Cai Yudong 已提交
2167 2168
    STATUS_CHECK(CheckWalConfigEnable(str));
    STATUS_CHECK(StringHelpFunctions::ConvertToBoolean(str, wal_enable));
2169 2170 2171 2172 2173 2174 2175
    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 已提交
2176 2177
    STATUS_CHECK(CheckWalConfigRecoveryErrorIgnore(str));
    STATUS_CHECK(StringHelpFunctions::ConvertToBoolean(str, recovery_error_ignore));
2178 2179 2180 2181
    return Status::OK();
}

Status
C
Cai Yudong 已提交
2182
Config::GetWalConfigBufferSize(int64_t& buffer_size) {
2183
    std::string str = GetConfigStr(CONFIG_WAL, CONFIG_WAL_BUFFER_SIZE, CONFIG_WAL_BUFFER_SIZE_DEFAULT);
C
Cai Yudong 已提交
2184
    STATUS_CHECK(CheckWalConfigBufferSize(str));
C
Cai Yudong 已提交
2185
    buffer_size = std::stoll(str);
2186 2187 2188 2189 2190
    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;
    }
2191 2192 2193 2194 2195
    return Status::OK();
}

Status
Config::GetWalConfigWalPath(std::string& wal_path) {
C
Cai Yudong 已提交
2196
    wal_path = GetConfigStr(CONFIG_WAL, CONFIG_WAL_WAL_PATH, CONFIG_WAL_WAL_PATH_DEFAULT);
C
Cai Yudong 已提交
2197
    STATUS_CHECK(CheckWalConfigWalPath(wal_path));
2198 2199 2200
    return Status::OK();
}

W
Wang XiangYu 已提交
2201 2202 2203 2204
/* logs config */
Status
Config::GetLogsTraceEnable(bool& value) {
    std::string str = GetConfigStr(CONFIG_LOGS, CONFIG_LOGS_TRACE_ENABLE, CONFIG_LOGS_TRACE_ENABLE_DEFAULT);
C
Cai Yudong 已提交
2205 2206
    STATUS_CHECK(CheckLogsTraceEnable(str));
    STATUS_CHECK(StringHelpFunctions::ConvertToBoolean(str, value));
W
Wang XiangYu 已提交
2207 2208 2209 2210 2211 2212
    return Status::OK();
}

Status
Config::GetLogsDebugEnable(bool& value) {
    std::string str = GetConfigStr(CONFIG_LOGS, CONFIG_LOGS_DEBUG_ENABLE, CONFIG_LOGS_DEBUG_ENABLE_DEFAULT);
C
Cai Yudong 已提交
2213 2214
    STATUS_CHECK(CheckLogsDebugEnable(str));
    STATUS_CHECK(StringHelpFunctions::ConvertToBoolean(str, value));
W
Wang XiangYu 已提交
2215 2216 2217 2218 2219 2220
    return Status::OK();
}

Status
Config::GetLogsInfoEnable(bool& value) {
    std::string str = GetConfigStr(CONFIG_LOGS, CONFIG_LOGS_INFO_ENABLE, CONFIG_LOGS_INFO_ENABLE_DEFAULT);
C
Cai Yudong 已提交
2221 2222
    STATUS_CHECK(CheckLogsInfoEnable(str));
    STATUS_CHECK(StringHelpFunctions::ConvertToBoolean(str, value));
W
Wang XiangYu 已提交
2223 2224 2225 2226 2227 2228
    return Status::OK();
}

Status
Config::GetLogsWarningEnable(bool& value) {
    std::string str = GetConfigStr(CONFIG_LOGS, CONFIG_LOGS_WARNING_ENABLE, CONFIG_LOGS_WARNING_ENABLE_DEFAULT);
C
Cai Yudong 已提交
2229 2230
    STATUS_CHECK(CheckLogsWarningEnable(str));
    STATUS_CHECK(StringHelpFunctions::ConvertToBoolean(str, value));
W
Wang XiangYu 已提交
2231 2232 2233 2234 2235 2236
    return Status::OK();
}

Status
Config::GetLogsErrorEnable(bool& value) {
    std::string str = GetConfigStr(CONFIG_LOGS, CONFIG_LOGS_ERROR_ENABLE, CONFIG_LOGS_ERROR_ENABLE_DEFAULT);
C
Cai Yudong 已提交
2237 2238
    STATUS_CHECK(CheckLogsErrorEnable(str));
    STATUS_CHECK(StringHelpFunctions::ConvertToBoolean(str, value));
W
Wang XiangYu 已提交
2239 2240 2241 2242 2243 2244
    return Status::OK();
}

Status
Config::GetLogsFatalEnable(bool& value) {
    std::string str = GetConfigStr(CONFIG_LOGS, CONFIG_LOGS_FATAL_ENABLE, CONFIG_LOGS_FATAL_ENABLE_DEFAULT);
C
Cai Yudong 已提交
2245 2246
    STATUS_CHECK(CheckLogsFatalEnable(str));
    STATUS_CHECK(StringHelpFunctions::ConvertToBoolean(str, value));
W
Wang XiangYu 已提交
2247 2248 2249 2250 2251 2252
    return Status::OK();
}

Status
Config::GetLogsPath(std::string& value) {
    value = GetConfigStr(CONFIG_LOGS, CONFIG_LOGS_PATH, CONFIG_LOGS_PATH_DEFAULT);
C
Cai Yudong 已提交
2253
    STATUS_CHECK(CheckLogsPath(value));
W
Wang XiangYu 已提交
2254 2255 2256 2257 2258 2259
    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);
C
Cai Yudong 已提交
2260
    STATUS_CHECK(CheckLogsMaxLogFileSize(str));
W
Wang XiangYu 已提交
2261 2262 2263 2264 2265
    value = std::stoll(str);
    return Status::OK();
}

Status
C
Cai Yudong 已提交
2266 2267 2268
Config::GetLogsLogRotateNum(int64_t& value) {
    std::string str = GetConfigStr(CONFIG_LOGS, CONFIG_LOGS_LOG_ROTATE_NUM, CONFIG_LOGS_LOG_ROTATE_NUM_DEFAULT);
    STATUS_CHECK(CheckLogsLogRotateNum(str));
W
Wang XiangYu 已提交
2269
    value = std::stoll(str);
W
Wang XiangYu 已提交
2270 2271 2272
    return Status::OK();
}

2273 2274 2275 2276 2277 2278
Status
Config::GetServerRestartRequired(bool& required) {
    required = restart_required_;
    return Status::OK();
}

Y
yudong.cai 已提交
2279 2280 2281
///////////////////////////////////////////////////////////////////////////////
/* server config */
Status
S
starlord 已提交
2282
Config::SetServerConfigAddress(const std::string& value) {
C
Cai Yudong 已提交
2283
    STATUS_CHECK(CheckServerConfigAddress(value));
C
Cai Yudong 已提交
2284
    return SetConfigValueInMem(CONFIG_SERVER, CONFIG_SERVER_ADDRESS, value);
Y
yudong.cai 已提交
2285 2286 2287
}

Status
S
starlord 已提交
2288
Config::SetServerConfigPort(const std::string& value) {
C
Cai Yudong 已提交
2289
    STATUS_CHECK(CheckServerConfigPort(value));
C
Cai Yudong 已提交
2290
    return SetConfigValueInMem(CONFIG_SERVER, CONFIG_SERVER_PORT, value);
Y
yudong.cai 已提交
2291 2292 2293
}

Status
S
starlord 已提交
2294
Config::SetServerConfigDeployMode(const std::string& value) {
C
Cai Yudong 已提交
2295
    STATUS_CHECK(CheckServerConfigDeployMode(value));
C
Cai Yudong 已提交
2296
    return SetConfigValueInMem(CONFIG_SERVER, CONFIG_SERVER_DEPLOY_MODE, value);
Y
yudong.cai 已提交
2297 2298 2299
}

Status
S
starlord 已提交
2300
Config::SetServerConfigTimeZone(const std::string& value) {
C
Cai Yudong 已提交
2301
    STATUS_CHECK(CheckServerConfigTimeZone(value));
C
Cai Yudong 已提交
2302
    return SetConfigValueInMem(CONFIG_SERVER, CONFIG_SERVER_TIME_ZONE, value);
Y
yudong.cai 已提交
2303 2304
}

2305 2306
Status
Config::SetServerConfigWebEnable(const std::string& value) {
C
Cai Yudong 已提交
2307
    STATUS_CHECK(CheckServerConfigWebEnable(value));
2308 2309 2310
    return SetConfigValueInMem(CONFIG_SERVER, CONFIG_SERVER_WEB_ENABLE, value);
}

B
BossZou 已提交
2311 2312
Status
Config::SetServerConfigWebPort(const std::string& value) {
C
Cai Yudong 已提交
2313
    STATUS_CHECK(CheckServerConfigWebPort(value));
B
BossZou 已提交
2314 2315 2316
    return SetConfigValueInMem(CONFIG_SERVER, CONFIG_SERVER_WEB_PORT, value);
}

Y
yudong.cai 已提交
2317 2318
/* db config */
Status
S
starlord 已提交
2319
Config::SetDBConfigBackendUrl(const std::string& value) {
C
Cai Yudong 已提交
2320
    STATUS_CHECK(CheckDBConfigBackendUrl(value));
C
Cai Yudong 已提交
2321
    return SetConfigValueInMem(CONFIG_DB, CONFIG_DB_BACKEND_URL, value);
Y
yudong.cai 已提交
2322 2323
}

2324
Status
2325
Config::SetDBConfigPreloadCollection(const std::string& value) {
C
Cai Yudong 已提交
2326
    STATUS_CHECK(CheckDBConfigPreloadCollection(value));
2327
    std::string cor_value = value == "*" ? "\'*\'" : value;
G
groot 已提交
2328
    return SetConfigValueInMem(CONFIG_DB, CONFIG_DB_PRELOAD_COLLECTION, cor_value);
2329 2330
}

Y
yudong.cai 已提交
2331
Status
S
starlord 已提交
2332
Config::SetDBConfigArchiveDiskThreshold(const std::string& value) {
C
Cai Yudong 已提交
2333
    STATUS_CHECK(CheckDBConfigArchiveDiskThreshold(value));
C
Cai Yudong 已提交
2334
    return SetConfigValueInMem(CONFIG_DB, CONFIG_DB_ARCHIVE_DISK_THRESHOLD, value);
Y
yudong.cai 已提交
2335 2336 2337
}

Status
S
starlord 已提交
2338
Config::SetDBConfigArchiveDaysThreshold(const std::string& value) {
C
Cai Yudong 已提交
2339
    STATUS_CHECK(CheckDBConfigArchiveDaysThreshold(value));
C
Cai Yudong 已提交
2340
    return SetConfigValueInMem(CONFIG_DB, CONFIG_DB_ARCHIVE_DAYS_THRESHOLD, value);
Y
yudong.cai 已提交
2341 2342
}

2343 2344
Status
Config::SetDBConfigAutoFlushInterval(const std::string& value) {
C
Cai Yudong 已提交
2345
    STATUS_CHECK(CheckDBConfigAutoFlushInterval(value));
2346 2347 2348
    return SetConfigValueInMem(CONFIG_DB, CONFIG_DB_AUTO_FLUSH_INTERVAL, value);
}

C
Cai Yudong 已提交
2349
/* storage config */
2350 2351
Status
Config::SetStorageConfigPrimaryPath(const std::string& value) {
C
Cai Yudong 已提交
2352
    STATUS_CHECK(CheckStorageConfigPrimaryPath(value));
C
Cai Yudong 已提交
2353
    return SetConfigValueInMem(CONFIG_STORAGE, CONFIG_STORAGE_PRIMARY_PATH, value);
2354 2355 2356 2357
}

Status
Config::SetStorageConfigSecondaryPath(const std::string& value) {
C
Cai Yudong 已提交
2358
    STATUS_CHECK(CheckStorageConfigSecondaryPath(value));
C
Cai Yudong 已提交
2359
    return SetConfigValueInMem(CONFIG_STORAGE, CONFIG_STORAGE_SECONDARY_PATH, value);
2360 2361
}

G
groot 已提交
2362 2363
Status
Config::SetStorageConfigFileCleanupTimeout(const std::string& value) {
C
Cai Yudong 已提交
2364
    STATUS_CHECK(CheckStorageConfigFileCleanupTimeout(value));
G
groot 已提交
2365 2366 2367
    return SetConfigValueInMem(CONFIG_STORAGE, CONFIG_STORAGE_FILE_CLEANUP_TIMEOUT, value);
}

C
Cai Yudong 已提交
2368 2369 2370 2371 2372 2373 2374 2375 2376 2377 2378 2379 2380 2381 2382 2383 2384 2385 2386 2387 2388 2389 2390 2391 2392 2393 2394 2395 2396 2397 2398 2399 2400 2401 2402
// Status
// Config::SetStorageConfigS3Enable(const std::string& value) {
//    STATUS_CHECK(CheckStorageConfigS3Enable(value));
//    return SetConfigValueInMem(CONFIG_STORAGE, CONFIG_STORAGE_S3_ENABLE, value);
// }
//
// Status
// Config::SetStorageConfigS3Address(const std::string& value) {
//    STATUS_CHECK(CheckStorageConfigS3Address(value));
//    return SetConfigValueInMem(CONFIG_STORAGE, CONFIG_STORAGE_S3_ADDRESS, value);
// }
//
// Status
// Config::SetStorageConfigS3Port(const std::string& value) {
//    STATUS_CHECK(CheckStorageConfigS3Port(value));
//    return SetConfigValueInMem(CONFIG_STORAGE, CONFIG_STORAGE_S3_PORT, value);
// }
//
// Status
// Config::SetStorageConfigS3AccessKey(const std::string& value) {
//    STATUS_CHECK(CheckStorageConfigS3AccessKey(value));
//    return SetConfigValueInMem(CONFIG_STORAGE, CONFIG_STORAGE_S3_ACCESS_KEY, value);
// }
//
// Status
// Config::SetStorageConfigS3SecretKey(const std::string& value) {
//    STATUS_CHECK(CheckStorageConfigS3SecretKey(value));
//    return SetConfigValueInMem(CONFIG_STORAGE, CONFIG_STORAGE_S3_SECRET_KEY, value);
// }
//
// Status
// Config::SetStorageConfigS3Bucket(const std::string& value) {
//    STATUS_CHECK(CheckStorageConfigS3Bucket(value));
//    return SetConfigValueInMem(CONFIG_STORAGE, CONFIG_STORAGE_S3_BUCKET, value);
// }
Y
yudong.cai 已提交
2403 2404 2405

/* metric config */
Status
S
starlord 已提交
2406
Config::SetMetricConfigEnableMonitor(const std::string& value) {
C
Cai Yudong 已提交
2407
    STATUS_CHECK(CheckMetricConfigEnableMonitor(value));
C
Cai Yudong 已提交
2408
    return SetConfigValueInMem(CONFIG_METRIC, CONFIG_METRIC_ENABLE_MONITOR, value);
Y
yudong.cai 已提交
2409 2410 2411
}

Status
C
Cai Yudong 已提交
2412
Config::SetMetricConfigAddress(const std::string& value) {
C
Cai Yudong 已提交
2413
    STATUS_CHECK(CheckMetricConfigAddress(value));
C
Cai Yudong 已提交
2414
    return SetConfigValueInMem(CONFIG_METRIC, CONFIG_METRIC_ADDRESS, value);
2415 2416
}

Y
yudong.cai 已提交
2417
Status
C
Cai Yudong 已提交
2418
Config::SetMetricConfigPort(const std::string& value) {
C
Cai Yudong 已提交
2419
    STATUS_CHECK(CheckMetricConfigPort(value));
C
Cai Yudong 已提交
2420
    return SetConfigValueInMem(CONFIG_METRIC, CONFIG_METRIC_PORT, value);
Y
yudong.cai 已提交
2421 2422 2423 2424
}

/* cache config */
Status
S
starlord 已提交
2425
Config::SetCacheConfigCpuCacheCapacity(const std::string& value) {
C
Cai Yudong 已提交
2426 2427
    STATUS_CHECK(CheckCacheConfigCpuCacheCapacity(value));
    STATUS_CHECK(SetConfigValueInMem(CONFIG_CACHE, CONFIG_CACHE_CPU_CACHE_CAPACITY, value));
2428
    return ExecCallBacks(CONFIG_CACHE, CONFIG_CACHE_CPU_CACHE_CAPACITY, value);
Y
yudong.cai 已提交
2429 2430 2431
}

Status
S
starlord 已提交
2432
Config::SetCacheConfigCpuCacheThreshold(const std::string& value) {
C
Cai Yudong 已提交
2433
    STATUS_CHECK(CheckCacheConfigCpuCacheThreshold(value));
C
Cai Yudong 已提交
2434
    return SetConfigValueInMem(CONFIG_CACHE, CONFIG_CACHE_CPU_CACHE_THRESHOLD, value);
Y
yudong.cai 已提交
2435 2436
}

2437 2438
Status
Config::SetCacheConfigInsertBufferSize(const std::string& value) {
C
Cai Yudong 已提交
2439 2440
    STATUS_CHECK(CheckCacheConfigInsertBufferSize(value));
    STATUS_CHECK(SetConfigValueInMem(CONFIG_CACHE, CONFIG_CACHE_INSERT_BUFFER_SIZE, value));
2441
    return ExecCallBacks(CONFIG_CACHE, CONFIG_CACHE_INSERT_BUFFER_SIZE, value);
2442 2443
}

Y
yudong.cai 已提交
2444
Status
S
starlord 已提交
2445
Config::SetCacheConfigCacheInsertData(const std::string& value) {
C
Cai Yudong 已提交
2446 2447
    STATUS_CHECK(CheckCacheConfigCacheInsertData(value));
    STATUS_CHECK(SetConfigValueInMem(CONFIG_CACHE, CONFIG_CACHE_CACHE_INSERT_DATA, value));
2448
    return ExecCallBacks(CONFIG_CACHE, CONFIG_CACHE_CACHE_INSERT_DATA, value);
Y
yudong.cai 已提交
2449 2450 2451 2452
}

/* engine config */
Status
S
starlord 已提交
2453
Config::SetEngineConfigUseBlasThreshold(const std::string& value) {
C
Cai Yudong 已提交
2454 2455
    STATUS_CHECK(CheckEngineConfigUseBlasThreshold(value));
    STATUS_CHECK(SetConfigValueInMem(CONFIG_ENGINE, CONFIG_ENGINE_USE_BLAS_THRESHOLD, value));
2456
    return ExecCallBacks(CONFIG_ENGINE, CONFIG_ENGINE_USE_BLAS_THRESHOLD, value);
Y
yudong.cai 已提交
2457 2458 2459
}

Status
S
starlord 已提交
2460
Config::SetEngineConfigOmpThreadNum(const std::string& value) {
C
Cai Yudong 已提交
2461
    STATUS_CHECK(CheckEngineConfigOmpThreadNum(value));
C
Cai Yudong 已提交
2462
    return SetConfigValueInMem(CONFIG_ENGINE, CONFIG_ENGINE_OMP_THREAD_NUM, value);
Y
yudong.cai 已提交
2463 2464
}

C
Cai Yudong 已提交
2465
Status
F
feisiyicl 已提交
2466
Config::SetEngineConfigSimdType(const std::string& value) {
C
Cai Yudong 已提交
2467
    STATUS_CHECK(CheckEngineConfigSimdType(value));
F
feisiyicl 已提交
2468
    return SetConfigValueInMem(CONFIG_ENGINE, CONFIG_ENGINE_SIMD_TYPE, value);
C
Cai Yudong 已提交
2469 2470
}

C
Cai Yudong 已提交
2471 2472 2473 2474 2475 2476 2477 2478 2479 2480 2481 2482 2483 2484 2485 2486 2487 2488 2489 2490 2491 2492 2493 2494 2495 2496 2497 2498 2499 2500 2501 2502 2503 2504 2505 2506 2507 2508 2509 2510 2511 2512 2513 2514 2515 2516 2517 2518 2519 2520
#ifdef MILVUS_GPU_VERSION
Status
Config::SetEngineConfigGpuSearchThreshold(const std::string& value) {
    STATUS_CHECK(CheckEngineConfigGpuSearchThreshold(value));
    STATUS_CHECK(SetConfigValueInMem(CONFIG_ENGINE, CONFIG_ENGINE_GPU_SEARCH_THRESHOLD, value));
    return ExecCallBacks(CONFIG_ENGINE, CONFIG_ENGINE_GPU_SEARCH_THRESHOLD, value);
}
#endif

/* gpu resource config */
#ifdef MILVUS_GPU_VERSION
Status
Config::SetGpuResourceConfigEnable(const std::string& value) {
    STATUS_CHECK(CheckGpuResourceConfigEnable(value));
    STATUS_CHECK(SetConfigValueInMem(CONFIG_GPU_RESOURCE, CONFIG_GPU_RESOURCE_ENABLE, value));
    return ExecCallBacks(CONFIG_GPU_RESOURCE, CONFIG_GPU_RESOURCE_ENABLE, value);
}

Status
Config::SetGpuResourceConfigCacheCapacity(const std::string& value) {
    STATUS_CHECK(CheckGpuResourceConfigCacheCapacity(value));
    STATUS_CHECK(SetConfigValueInMem(CONFIG_GPU_RESOURCE, CONFIG_GPU_RESOURCE_CACHE_CAPACITY, value));
    return ExecCallBacks(CONFIG_GPU_RESOURCE, CONFIG_GPU_RESOURCE_CACHE_CAPACITY, value);
}

Status
Config::SetGpuResourceConfigCacheThreshold(const std::string& value) {
    STATUS_CHECK(CheckGpuResourceConfigCacheThreshold(value));
    return SetConfigValueInMem(CONFIG_GPU_RESOURCE, CONFIG_GPU_RESOURCE_CACHE_THRESHOLD, value);
}

Status
Config::SetGpuResourceConfigSearchResources(const std::string& value) {
    std::vector<std::string> res_vec;
    server::StringHelpFunctions::SplitStringByDelimeter(value, CONFIG_GPU_RESOURCE_DELIMITER, res_vec);
    STATUS_CHECK(CheckGpuResourceConfigSearchResources(res_vec));
    STATUS_CHECK(SetConfigValueInMem(CONFIG_GPU_RESOURCE, CONFIG_GPU_RESOURCE_SEARCH_RESOURCES, value));
    return ExecCallBacks(CONFIG_GPU_RESOURCE, CONFIG_GPU_RESOURCE_SEARCH_RESOURCES, value);
}

Status
Config::SetGpuResourceConfigBuildIndexResources(const std::string& value) {
    std::vector<std::string> res_vec;
    server::StringHelpFunctions::SplitStringByDelimeter(value, CONFIG_GPU_RESOURCE_DELIMITER, res_vec);
    STATUS_CHECK(CheckGpuResourceConfigBuildIndexResources(res_vec));
    STATUS_CHECK(SetConfigValueInMem(CONFIG_GPU_RESOURCE, CONFIG_GPU_RESOURCE_BUILD_INDEX_RESOURCES, value));
    return ExecCallBacks(CONFIG_GPU_RESOURCE, CONFIG_GPU_RESOURCE_BUILD_INDEX_RESOURCES, value);
}
#endif

2521 2522 2523
/* tracing config */
Status
Config::SetTracingConfigJsonConfigPath(const std::string& value) {
C
Cai Yudong 已提交
2524
    STATUS_CHECK(CheckTracingConfigJsonConfigPath(value));
2525 2526 2527
    return SetConfigValueInMem(CONFIG_TRACING, CONFIG_TRACING_JSON_CONFIG_PATH, value);
}

J
Jin Hai 已提交
2528 2529 2530
/* wal config */
Status
Config::SetWalConfigEnable(const std::string& value) {
C
Cai Yudong 已提交
2531
    STATUS_CHECK(CheckWalConfigEnable(value));
J
Jin Hai 已提交
2532 2533 2534 2535 2536
    return SetConfigValueInMem(CONFIG_WAL, CONFIG_WAL_ENABLE, value);
}

Status
Config::SetWalConfigRecoveryErrorIgnore(const std::string& value) {
C
Cai Yudong 已提交
2537
    STATUS_CHECK(CheckWalConfigRecoveryErrorIgnore(value));
2538
    return SetConfigValueInMem(CONFIG_WAL, CONFIG_WAL_RECOVERY_ERROR_IGNORE, value);
J
Jin Hai 已提交
2539 2540 2541 2542
}

Status
Config::SetWalConfigBufferSize(const std::string& value) {
C
Cai Yudong 已提交
2543
    STATUS_CHECK(CheckWalConfigBufferSize(value));
J
Jin Hai 已提交
2544 2545 2546 2547 2548
    return SetConfigValueInMem(CONFIG_WAL, CONFIG_WAL_BUFFER_SIZE, value);
}

Status
Config::SetWalConfigWalPath(const std::string& value) {
C
Cai Yudong 已提交
2549
    STATUS_CHECK(CheckWalConfigWalPath(value));
J
Jin Hai 已提交
2550 2551 2552
    return SetConfigValueInMem(CONFIG_WAL, CONFIG_WAL_WAL_PATH, value);
}

W
Wang XiangYu 已提交
2553 2554 2555
/* logs config */
Status
Config::SetLogsTraceEnable(const std::string& value) {
C
Cai Yudong 已提交
2556
    STATUS_CHECK(CheckLogsTraceEnable(value));
W
Wang XiangYu 已提交
2557 2558 2559 2560 2561
    return SetConfigValueInMem(CONFIG_LOGS, CONFIG_LOGS_TRACE_ENABLE, value);
}

Status
Config::SetLogsDebugEnable(const std::string& value) {
C
Cai Yudong 已提交
2562
    STATUS_CHECK(CheckLogsDebugEnable(value));
W
Wang XiangYu 已提交
2563 2564 2565 2566 2567
    return SetConfigValueInMem(CONFIG_LOGS, CONFIG_LOGS_DEBUG_ENABLE, value);
}

Status
Config::SetLogsInfoEnable(const std::string& value) {
C
Cai Yudong 已提交
2568
    STATUS_CHECK(CheckLogsInfoEnable(value));
W
Wang XiangYu 已提交
2569 2570 2571 2572 2573
    return SetConfigValueInMem(CONFIG_LOGS, CONFIG_LOGS_INFO_ENABLE, value);
}

Status
Config::SetLogsWarningEnable(const std::string& value) {
C
Cai Yudong 已提交
2574
    STATUS_CHECK(CheckLogsWarningEnable(value));
W
Wang XiangYu 已提交
2575 2576 2577 2578 2579
    return SetConfigValueInMem(CONFIG_LOGS, CONFIG_LOGS_WARNING_ENABLE, value);
}

Status
Config::SetLogsErrorEnable(const std::string& value) {
C
Cai Yudong 已提交
2580
    STATUS_CHECK(CheckLogsErrorEnable(value));
W
Wang XiangYu 已提交
2581 2582 2583 2584 2585
    return SetConfigValueInMem(CONFIG_LOGS, CONFIG_LOGS_ERROR_ENABLE, value);
}

Status
Config::SetLogsFatalEnable(const std::string& value) {
C
Cai Yudong 已提交
2586
    STATUS_CHECK(CheckLogsFatalEnable(value));
W
Wang XiangYu 已提交
2587 2588 2589 2590 2591
    return SetConfigValueInMem(CONFIG_LOGS, CONFIG_LOGS_FATAL_ENABLE, value);
}

Status
Config::SetLogsPath(const std::string& value) {
C
Cai Yudong 已提交
2592
    STATUS_CHECK(CheckLogsPath(value));
W
Wang XiangYu 已提交
2593 2594 2595
    return SetConfigValueInMem(CONFIG_LOGS, CONFIG_LOGS_PATH, value);
}

W
Wang XiangYu 已提交
2596 2597
Status
Config::SetLogsMaxLogFileSize(const std::string& value) {
C
Cai Yudong 已提交
2598
    STATUS_CHECK(CheckLogsMaxLogFileSize(value));
W
Wang XiangYu 已提交
2599 2600 2601 2602
    return SetConfigValueInMem(CONFIG_LOGS, CONFIG_LOGS_MAX_LOG_FILE_SIZE, value);
}

Status
C
Cai Yudong 已提交
2603 2604 2605
Config::SetLogsLogRotateNum(const std::string& value) {
    STATUS_CHECK(CheckLogsLogRotateNum(value));
    return SetConfigValueInMem(CONFIG_LOGS, CONFIG_LOGS_LOG_ROTATE_NUM, value);
W
Wang XiangYu 已提交
2606 2607
}

S
starlord 已提交
2608 2609
}  // namespace server
}  // namespace milvus