Config.cpp 85.1 KB
Newer Older
1
// Copyright (C) 2019-2020 Zilliz. All rights reserved.
J
jinhai 已提交
2
//
3 4
// Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
J
jinhai 已提交
5
//
6 7 8 9 10
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software distributed under the License
// is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
// or implied. See the License for the specific language governing permissions and limitations under the License.
J
jinhai 已提交
11

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

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

26 27
#include <fiu-local.h>

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

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

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

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

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

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

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

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

110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156
/* 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";
const char* CONFIG_ENGINE_USE_AVX512 = "use_avx512";
const char* CONFIG_ENGINE_USE_AVX512_DEFAULT = "true";
const char* CONFIG_ENGINE_GPU_SEARCH_THRESHOLD = "gpu_search_threshold";
const char* CONFIG_ENGINE_GPU_SEARCH_THRESHOLD_DEFAULT = "1000";

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

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

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

constexpr int64_t GB = 1UL << 30;
J
Jin Hai 已提交
157 158 159
constexpr int32_t PORT_NUMBER_MIN = 1024;
constexpr int32_t PORT_NUMBER_MAX = 65535;

160 161
static const std::unordered_map<std::string, std::string> milvus_config_version_map(
    {{"0.6.0", "0.1"}, {"0.7.0", "0.2"}, {"0.7.1", "0.2"}, {"0.8.0", "0.3"}});
162

163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197
/////////////////////////////////////////////////////////////
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 已提交
198
Config&
199 200 201
Config::GetInstance() {
    static Config config_inst;
    return config_inst;
G
groot 已提交
202 203
}

S
starlord 已提交
204
Status
S
starlord 已提交
205
Config::LoadConfigFile(const std::string& filename) {
206
    if (filename.empty()) {
207
        return Status(SERVER_UNEXPECTED_ERROR, "No specified config file");
G
groot 已提交
208
    }
209 210 211 212 213

    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 已提交
214 215
    }

S
shengjh 已提交
216 217 218 219
    ConfigMgr* mgr = YamlConfigMgr::GetInstance();
    Status s = mgr->LoadConfigFile(filename);
    if (!s.ok()) {
        return s;
G
groot 已提交
220 221
    }

222 223 224
    // store config file path
    config_file_ = filename;

S
starlord 已提交
225
    return Status::OK();
G
groot 已提交
226 227
}

Y
yudong.cai 已提交
228 229
Status
Config::ValidateConfig() {
230
    std::string config_version;
C
Cai Yudong 已提交
231
    CONFIG_CHECK(GetConfigVersion(config_version));
232

Y
yudong.cai 已提交
233 234
    /* server config */
    std::string server_addr;
C
Cai Yudong 已提交
235
    CONFIG_CHECK(GetServerConfigAddress(server_addr));
Y
yudong.cai 已提交
236 237

    std::string server_port;
C
Cai Yudong 已提交
238
    CONFIG_CHECK(GetServerConfigPort(server_port));
Y
yudong.cai 已提交
239 240

    std::string server_mode;
C
Cai Yudong 已提交
241
    CONFIG_CHECK(GetServerConfigDeployMode(server_mode));
Y
yudong.cai 已提交
242 243

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

246 247 248
    bool server_web_enable;
    CONFIG_CHECK(GetServerConfigWebEnable(server_web_enable));

B
BossZou 已提交
249 250 251
    std::string server_web_port;
    CONFIG_CHECK(GetServerConfigWebPort(server_web_port));

Y
yudong.cai 已提交
252 253
    /* db config */
    std::string db_backend_url;
C
Cai Yudong 已提交
254
    CONFIG_CHECK(GetDBConfigBackendUrl(db_backend_url));
Y
yudong.cai 已提交
255

256 257
    std::string db_preload_collection;
    CONFIG_CHECK(GetDBConfigPreloadCollection(db_preload_collection));
258

Y
yudong.cai 已提交
259
    int64_t db_archive_disk_threshold;
C
Cai Yudong 已提交
260
    CONFIG_CHECK(GetDBConfigArchiveDiskThreshold(db_archive_disk_threshold));
Y
yudong.cai 已提交
261

Y
yudong.cai 已提交
262
    int64_t db_archive_days_threshold;
C
Cai Yudong 已提交
263
    CONFIG_CHECK(GetDBConfigArchiveDaysThreshold(db_archive_days_threshold));
Y
yudong.cai 已提交
264

C
Cai Yudong 已提交
265
    int64_t auto_flush_interval;
266 267
    CONFIG_CHECK(GetDBConfigAutoFlushInterval(auto_flush_interval));

C
Cai Yudong 已提交
268
    /* storage config */
269 270 271 272 273 274
    std::string storage_primary_path;
    CONFIG_CHECK(GetStorageConfigPrimaryPath(storage_primary_path));

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

275 276
    bool storage_s3_enable;
    CONFIG_CHECK(GetStorageConfigS3Enable(storage_s3_enable));
C
Cai Yudong 已提交
277
    // std::cout << "S3 " << (storage_s3_enable ? "ENABLED !" : "DISABLED !") << std::endl;
C
Cai Yudong 已提交
278

279 280
    std::string storage_s3_address;
    CONFIG_CHECK(GetStorageConfigS3Address(storage_s3_address));
C
Cai Yudong 已提交
281

282 283
    std::string storage_s3_port;
    CONFIG_CHECK(GetStorageConfigS3Port(storage_s3_port));
C
Cai Yudong 已提交
284

285 286
    std::string storage_s3_access_key;
    CONFIG_CHECK(GetStorageConfigS3AccessKey(storage_s3_access_key));
C
Cai Yudong 已提交
287

288 289
    std::string storage_s3_secret_key;
    CONFIG_CHECK(GetStorageConfigS3SecretKey(storage_s3_secret_key));
C
Cai Yudong 已提交
290

291 292
    std::string storage_s3_bucket;
    CONFIG_CHECK(GetStorageConfigS3Bucket(storage_s3_bucket));
Y
yudong.cai 已提交
293 294 295

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

C
Cai Yudong 已提交
298 299
    std::string metric_address;
    CONFIG_CHECK(GetMetricConfigAddress(metric_address));
Y
yudong.cai 已提交
300

C
Cai Yudong 已提交
301 302
    std::string metric_port;
    CONFIG_CHECK(GetMetricConfigPort(metric_port));
Y
yudong.cai 已提交
303 304

    /* cache config */
W
wxyu 已提交
305
    int64_t cache_cpu_cache_capacity;
C
Cai Yudong 已提交
306
    CONFIG_CHECK(GetCacheConfigCpuCacheCapacity(cache_cpu_cache_capacity));
Y
yudong.cai 已提交
307

Y
yudong.cai 已提交
308
    float cache_cpu_cache_threshold;
C
Cai Yudong 已提交
309
    CONFIG_CHECK(GetCacheConfigCpuCacheThreshold(cache_cpu_cache_threshold));
Y
yudong.cai 已提交
310

311 312 313
    int64_t cache_insert_buffer_size;
    CONFIG_CHECK(GetCacheConfigInsertBufferSize(cache_insert_buffer_size));

Y
yudong.cai 已提交
314
    bool cache_insert_data;
C
Cai Yudong 已提交
315
    CONFIG_CHECK(GetCacheConfigCacheInsertData(cache_insert_data));
Y
yudong.cai 已提交
316 317

    /* engine config */
Y
yudong.cai 已提交
318
    int64_t engine_use_blas_threshold;
C
Cai Yudong 已提交
319
    CONFIG_CHECK(GetEngineConfigUseBlasThreshold(engine_use_blas_threshold));
Y
yudong.cai 已提交
320

Y
yudong.cai 已提交
321
    int64_t engine_omp_thread_num;
C
Cai Yudong 已提交
322
    CONFIG_CHECK(GetEngineConfigOmpThreadNum(engine_omp_thread_num));
Y
yudong.cai 已提交
323

C
Cai Yudong 已提交
324 325 326
    bool engine_use_avx512;
    CONFIG_CHECK(GetEngineConfigUseAVX512(engine_use_avx512));

G
groot 已提交
327
#ifdef MILVUS_GPU_VERSION
Y
yudong.cai 已提交
328
    int64_t engine_gpu_search_threshold;
C
Cai Yudong 已提交
329 330
    CONFIG_CHECK(GetEngineConfigGpuSearchThreshold(engine_gpu_search_threshold));
#endif
W
wxyu 已提交
331

Y
yudong.cai 已提交
332
    /* gpu resource config */
C
Cai Yudong 已提交
333
#ifdef MILVUS_GPU_VERSION
334
    bool gpu_resource_enable;
C
Cai Yudong 已提交
335
    CONFIG_CHECK(GetGpuResourceConfigEnable(gpu_resource_enable));
336
    std::cout << "GPU resources " << (gpu_resource_enable ? "ENABLED !" : "DISABLED !") << std::endl;
C
Cai Yudong 已提交
337

338 339
    if (gpu_resource_enable) {
        int64_t resource_cache_capacity;
C
Cai Yudong 已提交
340
        CONFIG_CHECK(GetGpuResourceConfigCacheCapacity(resource_cache_capacity));
Y
yudong.cai 已提交
341

342
        float resource_cache_threshold;
C
Cai Yudong 已提交
343
        CONFIG_CHECK(GetGpuResourceConfigCacheThreshold(resource_cache_threshold));
Y
yudong.cai 已提交
344

345
        std::vector<int64_t> search_resources;
C
Cai Yudong 已提交
346
        CONFIG_CHECK(GetGpuResourceConfigSearchResources(search_resources));
347

348
        std::vector<int64_t> index_build_resources;
C
Cai Yudong 已提交
349
        CONFIG_CHECK(GetGpuResourceConfigBuildIndexResources(index_build_resources));
S
starlord 已提交
350
    }
Y
yudong.cai 已提交
351
#endif
Y
yudong.cai 已提交
352

Z
Zhiru Zhu 已提交
353 354
    /* tracing config */
    std::string tracing_config_path;
C
Cai Yudong 已提交
355
    CONFIG_CHECK(GetTracingConfigJsonConfigPath(tracing_config_path));
Z
Zhiru Zhu 已提交
356

357 358 359 360 361 362 363
    /* wal config */
    bool enable;
    CONFIG_CHECK(GetWalConfigEnable(enable));

    bool recovery_error_ignore;
    CONFIG_CHECK(GetWalConfigRecoveryErrorIgnore(recovery_error_ignore));

C
Cai Yudong 已提交
364
    int64_t buffer_size;
365 366 367 368 369
    CONFIG_CHECK(GetWalConfigBufferSize(buffer_size));

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

Y
yudong.cai 已提交
370 371 372
    return Status::OK();
}

Y
yudong.cai 已提交
373 374 375
Status
Config::ResetDefaultConfig() {
    /* server config */
C
Cai Yudong 已提交
376 377 378 379
    CONFIG_CHECK(SetServerConfigAddress(CONFIG_SERVER_ADDRESS_DEFAULT));
    CONFIG_CHECK(SetServerConfigPort(CONFIG_SERVER_PORT_DEFAULT));
    CONFIG_CHECK(SetServerConfigDeployMode(CONFIG_SERVER_DEPLOY_MODE_DEFAULT));
    CONFIG_CHECK(SetServerConfigTimeZone(CONFIG_SERVER_TIME_ZONE_DEFAULT));
380
    CONFIG_CHECK(SetServerConfigWebEnable(CONFIG_SERVER_WEB_ENABLE_DEFAULT));
B
BossZou 已提交
381
    CONFIG_CHECK(SetServerConfigWebPort(CONFIG_SERVER_WEB_PORT_DEFAULT));
Y
yudong.cai 已提交
382 383

    /* db config */
C
Cai Yudong 已提交
384
    CONFIG_CHECK(SetDBConfigBackendUrl(CONFIG_DB_BACKEND_URL_DEFAULT));
G
groot 已提交
385
    CONFIG_CHECK(SetDBConfigPreloadCollection(CONFIG_DB_PRELOAD_COLLECTION_DEFAULT));
C
Cai Yudong 已提交
386 387
    CONFIG_CHECK(SetDBConfigArchiveDiskThreshold(CONFIG_DB_ARCHIVE_DISK_THRESHOLD_DEFAULT));
    CONFIG_CHECK(SetDBConfigArchiveDaysThreshold(CONFIG_DB_ARCHIVE_DAYS_THRESHOLD_DEFAULT));
388
    CONFIG_CHECK(SetDBConfigAutoFlushInterval(CONFIG_DB_AUTO_FLUSH_INTERVAL_DEFAULT));
C
Cai Yudong 已提交
389 390

    /* storage config */
391 392
    CONFIG_CHECK(SetStorageConfigPrimaryPath(CONFIG_STORAGE_PRIMARY_PATH_DEFAULT));
    CONFIG_CHECK(SetStorageConfigSecondaryPath(CONFIG_STORAGE_SECONDARY_PATH_DEFAULT));
393 394 395 396 397 398
    CONFIG_CHECK(SetStorageConfigS3Enable(CONFIG_STORAGE_S3_ENABLE_DEFAULT));
    CONFIG_CHECK(SetStorageConfigS3Address(CONFIG_STORAGE_S3_ADDRESS_DEFAULT));
    CONFIG_CHECK(SetStorageConfigS3Port(CONFIG_STORAGE_S3_PORT_DEFAULT));
    CONFIG_CHECK(SetStorageConfigS3AccessKey(CONFIG_STORAGE_S3_ACCESS_KEY_DEFAULT));
    CONFIG_CHECK(SetStorageConfigS3SecretKey(CONFIG_STORAGE_S3_SECRET_KEY_DEFAULT));
    CONFIG_CHECK(SetStorageConfigS3Bucket(CONFIG_STORAGE_S3_BUCKET_DEFAULT));
Y
yudong.cai 已提交
399 400

    /* metric config */
C
Cai Yudong 已提交
401
    CONFIG_CHECK(SetMetricConfigEnableMonitor(CONFIG_METRIC_ENABLE_MONITOR_DEFAULT));
C
Cai Yudong 已提交
402 403
    CONFIG_CHECK(SetMetricConfigAddress(CONFIG_METRIC_ADDRESS_DEFAULT));
    CONFIG_CHECK(SetMetricConfigPort(CONFIG_METRIC_PORT_DEFAULT));
Y
yudong.cai 已提交
404 405

    /* cache config */
C
Cai Yudong 已提交
406 407
    CONFIG_CHECK(SetCacheConfigCpuCacheCapacity(CONFIG_CACHE_CPU_CACHE_CAPACITY_DEFAULT));
    CONFIG_CHECK(SetCacheConfigCpuCacheThreshold(CONFIG_CACHE_CPU_CACHE_THRESHOLD_DEFAULT));
408
    CONFIG_CHECK(SetCacheConfigInsertBufferSize(CONFIG_CACHE_INSERT_BUFFER_SIZE_DEFAULT));
C
Cai Yudong 已提交
409
    CONFIG_CHECK(SetCacheConfigCacheInsertData(CONFIG_CACHE_CACHE_INSERT_DATA_DEFAULT));
Y
yudong.cai 已提交
410

Y
yudong.cai 已提交
411
    /* engine config */
C
Cai Yudong 已提交
412 413
    CONFIG_CHECK(SetEngineConfigUseBlasThreshold(CONFIG_ENGINE_USE_BLAS_THRESHOLD_DEFAULT));
    CONFIG_CHECK(SetEngineConfigOmpThreadNum(CONFIG_ENGINE_OMP_THREAD_NUM_DEFAULT));
C
Cai Yudong 已提交
414
    CONFIG_CHECK(SetEngineConfigUseAVX512(CONFIG_ENGINE_USE_AVX512_DEFAULT));
J
Jin Hai 已提交
415 416 417 418 419 420

    /* wal config */
    CONFIG_CHECK(SetWalConfigEnable(CONFIG_WAL_ENABLE_DEFAULT));
    CONFIG_CHECK(SetWalConfigRecoveryErrorIgnore(CONFIG_WAL_RECOVERY_ERROR_IGNORE_DEFAULT));
    CONFIG_CHECK(SetWalConfigBufferSize(CONFIG_WAL_BUFFER_SIZE_DEFAULT));
    CONFIG_CHECK(SetWalConfigWalPath(CONFIG_WAL_WAL_PATH_DEFAULT));
G
groot 已提交
421
#ifdef MILVUS_GPU_VERSION
C
Cai Yudong 已提交
422 423
    CONFIG_CHECK(SetEngineConfigGpuSearchThreshold(CONFIG_ENGINE_GPU_SEARCH_THRESHOLD_DEFAULT));
#endif
Z
Zhiru Zhu 已提交
424

C
Cai Yudong 已提交
425 426 427 428 429 430 431
    /* gpu resource config */
#ifdef MILVUS_GPU_VERSION
    CONFIG_CHECK(SetGpuResourceConfigEnable(CONFIG_GPU_RESOURCE_ENABLE_DEFAULT));
    CONFIG_CHECK(SetGpuResourceConfigCacheCapacity(CONFIG_GPU_RESOURCE_CACHE_CAPACITY_DEFAULT));
    CONFIG_CHECK(SetGpuResourceConfigCacheThreshold(CONFIG_GPU_RESOURCE_CACHE_THRESHOLD_DEFAULT));
    CONFIG_CHECK(SetGpuResourceConfigSearchResources(CONFIG_GPU_RESOURCE_SEARCH_RESOURCES_DEFAULT));
    CONFIG_CHECK(SetGpuResourceConfigBuildIndexResources(CONFIG_GPU_RESOURCE_BUILD_INDEX_RESOURCES_DEFAULT));
Y
yudong.cai 已提交
432
#endif
433

Y
yudong.cai 已提交
434 435 436
    return Status::OK();
}

Y
yudong.cai 已提交
437
void
438
Config::GetConfigJsonStr(std::string& result, int64_t indent) {
439
    nlohmann::json config_json(config_map_);
440
    result = config_json.dump(indent);
Y
yudong.cai 已提交
441 442
}

C
Cai Yudong 已提交
443
Status
444
Config::GetConfigCli(std::string& value, const std::string& parent_key, const std::string& child_key) {
C
Cai Yudong 已提交
445 446 447 448 449 450 451 452 453
    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) {
454 455
    std::string invalid_node_str = "Config node invalid: " + parent_key + CONFIG_NODE_DELIMITER + child_key;

C
Cai Yudong 已提交
456
    if (!ConfigNodeValid(parent_key, child_key)) {
457
        return Status(SERVER_UNEXPECTED_ERROR, invalid_node_str);
C
Cai Yudong 已提交
458
    }
459
    auto status = Status::OK();
C
Cai Yudong 已提交
460
    if (parent_key == CONFIG_SERVER) {
461 462 463 464 465 466 467 468 469 470
        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);
471 472
        } else {
            status = Status(SERVER_UNEXPECTED_ERROR, invalid_node_str);
473
        }
C
Cai Yudong 已提交
474
    } else if (parent_key == CONFIG_DB) {
475 476
        if (child_key == CONFIG_DB_BACKEND_URL) {
            status = SetDBConfigBackendUrl(value);
G
groot 已提交
477
        } else if (child_key == CONFIG_DB_PRELOAD_COLLECTION) {
478
            status = SetDBConfigPreloadCollection(value);
479 480
        } else if (child_key == CONFIG_DB_AUTO_FLUSH_INTERVAL) {
            status = SetDBConfigAutoFlushInterval(value);
481 482
        } else {
            status = Status(SERVER_UNEXPECTED_ERROR, invalid_node_str);
483
        }
C
Cai Yudong 已提交
484
    } else if (parent_key == CONFIG_STORAGE) {
485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500
        if (child_key == CONFIG_STORAGE_PRIMARY_PATH) {
            status = SetStorageConfigPrimaryPath(value);
        } else if (child_key == CONFIG_STORAGE_SECONDARY_PATH) {
            status = SetStorageConfigSecondaryPath(value);
        } else if (child_key == CONFIG_STORAGE_S3_ENABLE) {
            status = SetStorageConfigS3Enable(value);
        } else if (child_key == CONFIG_STORAGE_S3_ADDRESS) {
            status = SetStorageConfigS3Address(value);
        } else if (child_key == CONFIG_STORAGE_S3_PORT) {
            status = SetStorageConfigS3Port(value);
        } else if (child_key == CONFIG_STORAGE_S3_ACCESS_KEY) {
            status = SetStorageConfigS3AccessKey(value);
        } else if (child_key == CONFIG_STORAGE_S3_SECRET_KEY) {
            status = SetStorageConfigS3SecretKey(value);
        } else if (child_key == CONFIG_STORAGE_S3_BUCKET) {
            status = SetStorageConfigS3Bucket(value);
501 502
        } else {
            status = Status(SERVER_UNEXPECTED_ERROR, invalid_node_str);
503
        }
C
Cai Yudong 已提交
504
    } else if (parent_key == CONFIG_METRIC) {
505 506 507 508 509 510
        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);
511 512
        } else {
            status = Status(SERVER_UNEXPECTED_ERROR, invalid_node_str);
513
        }
C
Cai Yudong 已提交
514 515
    } else if (parent_key == CONFIG_CACHE) {
        if (child_key == CONFIG_CACHE_CPU_CACHE_CAPACITY) {
516
            status = SetCacheConfigCpuCacheCapacity(value);
C
Cai Yudong 已提交
517
        } else if (child_key == CONFIG_CACHE_CPU_CACHE_THRESHOLD) {
518
            status = SetCacheConfigCpuCacheThreshold(value);
C
Cai Yudong 已提交
519
        } else if (child_key == CONFIG_CACHE_CACHE_INSERT_DATA) {
520
            status = SetCacheConfigCacheInsertData(value);
521
        } else if (child_key == CONFIG_CACHE_INSERT_BUFFER_SIZE) {
522
            status = SetCacheConfigInsertBufferSize(value);
523 524
        } else {
            status = Status(SERVER_UNEXPECTED_ERROR, invalid_node_str);
C
Cai Yudong 已提交
525 526 527
        }
    } else if (parent_key == CONFIG_ENGINE) {
        if (child_key == CONFIG_ENGINE_USE_BLAS_THRESHOLD) {
528
            status = SetEngineConfigUseBlasThreshold(value);
C
Cai Yudong 已提交
529
        } else if (child_key == CONFIG_ENGINE_OMP_THREAD_NUM) {
530
            status = SetEngineConfigOmpThreadNum(value);
C
Cai Yudong 已提交
531 532
        } else if (child_key == CONFIG_ENGINE_USE_AVX512) {
            status = SetEngineConfigUseAVX512(value);
C
Cai Yudong 已提交
533 534
#ifdef MILVUS_GPU_VERSION
        } else if (child_key == CONFIG_ENGINE_GPU_SEARCH_THRESHOLD) {
535
            status = SetEngineConfigGpuSearchThreshold(value);
C
Cai Yudong 已提交
536
#endif
537 538
        } else {
            status = Status(SERVER_UNEXPECTED_ERROR, invalid_node_str);
C
Cai Yudong 已提交
539 540 541 542
        }
#ifdef MILVUS_GPU_VERSION
    } else if (parent_key == CONFIG_GPU_RESOURCE) {
        if (child_key == CONFIG_GPU_RESOURCE_ENABLE) {
543
            status = SetGpuResourceConfigEnable(value);
C
Cai Yudong 已提交
544
        } else if (child_key == CONFIG_GPU_RESOURCE_CACHE_CAPACITY) {
545
            status = SetGpuResourceConfigCacheCapacity(value);
C
Cai Yudong 已提交
546
        } else if (child_key == CONFIG_GPU_RESOURCE_CACHE_THRESHOLD) {
547
            status = SetGpuResourceConfigCacheThreshold(value);
C
Cai Yudong 已提交
548
        } else if (child_key == CONFIG_GPU_RESOURCE_SEARCH_RESOURCES) {
549
            status = SetGpuResourceConfigSearchResources(value);
C
Cai Yudong 已提交
550
        } else if (child_key == CONFIG_GPU_RESOURCE_BUILD_INDEX_RESOURCES) {
551
            status = SetGpuResourceConfigBuildIndexResources(value);
552 553
        } else {
            status = Status(SERVER_UNEXPECTED_ERROR, invalid_node_str);
C
Cai Yudong 已提交
554 555 556
        }
#endif
    } else if (parent_key == CONFIG_TRACING) {
557 558 559 560 561
        if (child_key == CONFIG_TRACING_JSON_CONFIG_PATH) {
            status = SetTracingConfigJsonConfigPath(value);
        } else {
            status = Status(SERVER_UNEXPECTED_ERROR, invalid_node_str);
        }
J
Jin Hai 已提交
562 563 564 565 566 567 568 569 570
    } 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);
571 572
        } else {
            status = Status(SERVER_UNEXPECTED_ERROR, invalid_node_str);
J
Jin Hai 已提交
573
        }
574 575 576 577
    }

    if (status.ok()) {
        status = UpdateFileConfigFromMem(parent_key, child_key);
578 579
        if (status.ok() &&
            !(parent_key == CONFIG_CACHE || parent_key == CONFIG_ENGINE || parent_key == CONFIG_GPU_RESOURCE)) {
580 581
            restart_required_ = true;
        }
C
Cai Yudong 已提交
582
    }
583 584

    return status;
C
Cai Yudong 已提交
585 586
}

587
//////////////////////////////////////////////////////////////
C
Cai Yudong 已提交
588
Status
589
Config::ProcessConfigCli(std::string& result, const std::string& cmd) {
C
Cai Yudong 已提交
590 591 592
    std::vector<std::string> tokens;
    std::vector<std::string> nodes;
    server::StringHelpFunctions::SplitStringByDelimeter(cmd, " ", tokens);
593
    if (tokens[0] == "get_config") {
C
Cai Yudong 已提交
594 595 596
        if (tokens.size() != 2) {
            return Status(SERVER_UNEXPECTED_ERROR, "Invalid command: " + cmd);
        }
597 598 599 600 601 602 603 604 605
        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 已提交
606
        }
607
    } else if (tokens[0] == "set_config") {
C
Cai Yudong 已提交
608 609 610 611 612 613 614 615 616 617 618 619 620
        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);
    }
}

621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636
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();
637
    auto duration_in_ms = std::chrono::duration_cast<std::chrono::nanoseconds>(time_now.time_since_epoch());
638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674
    elements.push_back(std::to_string(duration_in_ms.count()));

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

    return Status::OK();
}

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

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

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

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

    // convert value string to standard string stored in yaml file
    std::string value_str;
    if (child_key == CONFIG_CACHE_CACHE_INSERT_DATA || child_key == CONFIG_STORAGE_S3_ENABLE ||
675 676 677 678 679 680 681 682
        child_key == CONFIG_METRIC_ENABLE_MONITOR || child_key == CONFIG_GPU_RESOURCE_ENABLE ||
        child_key == CONFIG_WAL_ENABLE || child_key == CONFIG_WAL_RECOVERY_ERROR_IGNORE) {
        bool ok = false;
        status = StringHelpFunctions::ConvertToBoolean(value, ok);
        if (!status.ok()) {
            return status;
        }
        value_str = ok ? "true" : "false";
683 684 685 686 687
    } 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) {
688
            std::transform(s.begin(), s.end(), s.begin(), ::tolower);
689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783
            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 已提交
784
////////////////////////////////////////////////////////////////////////////////
785 786
Status
Config::CheckConfigVersion(const std::string& value) {
787 788 789 790 791 792
    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);
793
            LOG_SERVER_ERROR_ << msg;
Y
yudong.cai 已提交
794
            return Status(SERVER_INVALID_ARGUMENT, msg);
795
        }
796 797 798 799
    }
    return Status::OK();
}

C
Cai Yudong 已提交
800
/* server config */
S
starlord 已提交
801
Status
S
starlord 已提交
802
Config::CheckServerConfigAddress(const std::string& value) {
S
shengjh 已提交
803 804 805 806
    auto exist_error = !ValidationUtil::ValidateIpAddress(value).ok();
    fiu_do_on("check_config_address_fail", exist_error = true);

    if (exist_error) {
S
starlord 已提交
807 808
        std::string msg =
            "Invalid server IP address: " + value + ". Possible reason: server_config.address is invalid.";
809
        return Status(SERVER_INVALID_ARGUMENT, msg);
Z
zhiru 已提交
810
    }
Y
yudong.cai 已提交
811 812
    return Status::OK();
}
Z
zhiru 已提交
813

Y
yudong.cai 已提交
814
Status
S
starlord 已提交
815
Config::CheckServerConfigPort(const std::string& value) {
S
shengjh 已提交
816 817 818 819
    auto exist_error = !ValidationUtil::ValidateStringIsNumber(value).ok();
    fiu_do_on("check_config_port_fail", exist_error = true);

    if (exist_error) {
S
starlord 已提交
820
        std::string msg = "Invalid server port: " + value + ". Possible reason: server_config.port is not a number.";
821
        return Status(SERVER_INVALID_ARGUMENT, msg);
822
    } else {
J
Jin Hai 已提交
823 824 825 826 827 828 829 830 831
        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 已提交
832 833
        }
    }
Y
yudong.cai 已提交
834 835
    return Status::OK();
}
Z
zhiru 已提交
836

Y
yudong.cai 已提交
837
Status
S
starlord 已提交
838
Config::CheckServerConfigDeployMode(const std::string& value) {
S
shengjh 已提交
839 840 841 842
    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 已提交
843
    if (value != "single" && value != "cluster_readonly" && value != "cluster_writable") {
Y
yudong.cai 已提交
844
        return Status(SERVER_INVALID_ARGUMENT,
Z
Zhiru Zhu 已提交
845
                      "server_config.deploy_mode is not one of single, cluster_readonly, and cluster_writable.");
846
    }
Y
yudong.cai 已提交
847 848
    return Status::OK();
}
849

Y
yudong.cai 已提交
850
Status
S
starlord 已提交
851
Config::CheckServerConfigTimeZone(const std::string& value) {
S
shengjh 已提交
852 853 854
    fiu_return_on("check_config_time_zone_fail",
                  Status(SERVER_INVALID_ARGUMENT, "Invalid server_config.time_zone: " + value));

Y
yudong.cai 已提交
855
    if (value.length() <= 3) {
S
starlord 已提交
856
        return Status(SERVER_INVALID_ARGUMENT, "Invalid server_config.time_zone: " + value);
857
    } else {
Y
yudong.cai 已提交
858
        if (value.substr(0, 3) != "UTC") {
S
starlord 已提交
859
            return Status(SERVER_INVALID_ARGUMENT, "Invalid server_config.time_zone: " + value);
860
        } else {
J
Jin Hai 已提交
861
            if (!ValidationUtil::IsNumber(value.substr(4))) {
S
starlord 已提交
862
                return Status(SERVER_INVALID_ARGUMENT, "Invalid server_config.time_zone: " + value);
863
            }
864 865
        }
    }
Y
yudong.cai 已提交
866
    return Status::OK();
Z
zhiru 已提交
867 868
}

869 870 871 872 873
Status
Config::CheckServerConfigWebEnable(const std::string& value) {
    return ValidationUtil::ValidateStringIsBool(value);
}

B
BossZou 已提交
874 875 876 877 878 879 880
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 已提交
881 882 883 884 885 886 887 888 889
        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 已提交
890 891 892 893 894
        }
    }
    return Status::OK();
}

C
Cai Yudong 已提交
895
/* DB config */
Y
yudong.cai 已提交
896
Status
S
starlord 已提交
897
Config::CheckDBConfigBackendUrl(const std::string& value) {
S
shengjh 已提交
898 899 900 901
    auto exist_error = !ValidationUtil::ValidateDbURI(value).ok();
    fiu_do_on("check_config_backend_url_fail", exist_error = true);

    if (exist_error) {
902
        std::string msg =
S
starlord 已提交
903
            "Invalid backend url: " + value + ". Possible reason: db_config.db_backend_url is invalid. " +
904
            "The correct format should be like sqlite://:@:/ or mysql://root:123456@127.0.0.1:3306/milvus.";
905
        return Status(SERVER_INVALID_ARGUMENT, msg);
Z
zhiru 已提交
906
    }
Y
yudong.cai 已提交
907 908
    return Status::OK();
}
Z
zhiru 已提交
909

910
Status
911
Config::CheckDBConfigPreloadCollection(const std::string& value) {
912
    fiu_return_on("check_config_preload_collection_fail", Status(SERVER_INVALID_ARGUMENT, ""));
913

914 915 916 917 918 919
    if (value.empty() || value == "*") {
        return Status::OK();
    }

    std::vector<std::string> tables;
    StringHelpFunctions::SplitStringByDelimeter(value, ",", tables);
920 921 922

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

J
Jin Hai 已提交
923 924 925
    for (auto& collection : tables) {
        if (!ValidationUtil::ValidateCollectionName(collection).ok()) {
            return Status(SERVER_INVALID_ARGUMENT, "Invalid collection name: " + collection);
926 927
        }
        bool exist = false;
928
        auto status = DBWrapper::DB()->HasNativeCollection(collection, exist);
929
        if (!(status.ok() && exist)) {
G
groot 已提交
930
            return Status(SERVER_COLLECTION_NOT_EXIST, "Collection " + collection + " not exist");
931
        }
J
Jin Hai 已提交
932
        table_set.insert(collection);
933 934 935 936 937
    }

    if (table_set.size() != tables.size()) {
        std::string msg =
            "Invalid preload tables. "
938
            "Possible reason: db_config.preload_collection contains duplicate collection.";
939
        return Status(SERVER_INVALID_ARGUMENT, msg);
940 941 942 943 944
    }

    return Status::OK();
}

Y
yudong.cai 已提交
945
Status
S
starlord 已提交
946
Config::CheckDBConfigArchiveDiskThreshold(const std::string& value) {
S
shengjh 已提交
947 948 949 950
    auto exist_error = !ValidationUtil::ValidateStringIsNumber(value).ok();
    fiu_do_on("check_config_archive_disk_threshold_fail", exist_error = true);

    if (exist_error) {
951
        std::string msg = "Invalid archive disk threshold: " + value +
S
starlord 已提交
952
                          ". Possible reason: db_config.archive_disk_threshold is invalid.";
953
        return Status(SERVER_INVALID_ARGUMENT, msg);
Z
zhiru 已提交
954
    }
Y
yudong.cai 已提交
955 956
    return Status::OK();
}
Z
zhiru 已提交
957

Y
yudong.cai 已提交
958
Status
S
starlord 已提交
959
Config::CheckDBConfigArchiveDaysThreshold(const std::string& value) {
S
shengjh 已提交
960 961 962 963
    auto exist_error = !ValidationUtil::ValidateStringIsNumber(value).ok();
    fiu_do_on("check_config_archive_days_threshold_fail", exist_error = true);

    if (exist_error) {
964
        std::string msg = "Invalid archive days threshold: " + value +
965
                          ". Possible reason: db_config.archive_days_threshold is invalid.";
966
        return Status(SERVER_INVALID_ARGUMENT, msg);
Z
zhiru 已提交
967
    }
Y
yudong.cai 已提交
968 969
    return Status::OK();
}
Z
zhiru 已提交
970

971 972
Status
Config::CheckDBConfigAutoFlushInterval(const std::string& value) {
973 974 975 976
    auto exist_error = !ValidationUtil::ValidateStringIsNumber(value).ok();
    fiu_do_on("check_config_auto_flush_interval_fail", exist_error = true);

    if (exist_error) {
977
        std::string msg = "Invalid db configuration auto_flush_interval: " + value +
978
                          ". Possible reason: db.auto_flush_interval is not a natural number.";
979 980 981 982 983 984
        return Status(SERVER_INVALID_ARGUMENT, msg);
    }

    return Status::OK();
}

C
Cai Yudong 已提交
985
/* storage config */
986 987
Status
Config::CheckStorageConfigPrimaryPath(const std::string& value) {
S
shengjh 已提交
988
    fiu_return_on("check_config_primary_path_fail", Status(SERVER_INVALID_ARGUMENT, ""));
989 990 991
    if (value.empty()) {
        return Status(SERVER_INVALID_ARGUMENT, "storage_config.db_path is empty.");
    }
992 993

    return ValidationUtil::ValidateStoragePath(value);
994 995 996 997
}

Status
Config::CheckStorageConfigSecondaryPath(const std::string& value) {
S
shengjh 已提交
998
    fiu_return_on("check_config_secondary_path_fail", Status(SERVER_INVALID_ARGUMENT, ""));
999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022

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

1023 1024 1025
    return Status::OK();
}

C
Cai Yudong 已提交
1026
Status
1027
Config::CheckStorageConfigS3Enable(const std::string& value) {
C
Cai Yudong 已提交
1028 1029
    if (!ValidationUtil::ValidateStringIsBool(value).ok()) {
        std::string msg =
1030
            "Invalid storage config: " + value + ". Possible reason: storage_config.s3_enable is not a boolean.";
C
Cai Yudong 已提交
1031 1032 1033 1034 1035 1036
        return Status(SERVER_INVALID_ARGUMENT, msg);
    }
    return Status::OK();
}

Status
1037
Config::CheckStorageConfigS3Address(const std::string& value) {
C
Cai Yudong 已提交
1038
    if (!ValidationUtil::ValidateIpAddress(value).ok()) {
1039
        std::string msg = "Invalid s3 address: " + value + ". Possible reason: storage_config.s3_address is invalid.";
C
Cai Yudong 已提交
1040 1041 1042 1043 1044 1045
        return Status(SERVER_INVALID_ARGUMENT, msg);
    }
    return Status::OK();
}

Status
1046
Config::CheckStorageConfigS3Port(const std::string& value) {
C
Cai Yudong 已提交
1047
    if (!ValidationUtil::ValidateStringIsNumber(value).ok()) {
1048
        std::string msg = "Invalid s3 port: " + value + ". Possible reason: storage_config.s3_port is not a number.";
C
Cai Yudong 已提交
1049 1050
        return Status(SERVER_INVALID_ARGUMENT, msg);
    } else {
J
Jin Hai 已提交
1051 1052 1053 1054 1055 1056 1057 1058 1059
        try {
            int32_t port = std::stoi(value);
            if (!(port > PORT_NUMBER_MIN && port < PORT_NUMBER_MAX)) {
                std::string msg = "Invalid s3 port: " + value +
                                  ". Possible reason: storage_config.s3_port is not in range (1024, 65535).";
                return Status(SERVER_INVALID_ARGUMENT, msg);
            }
        } catch (...) {
            return Status(SERVER_INVALID_ARGUMENT, "Invalid storage_config.s3_port: " + value);
C
Cai Yudong 已提交
1060 1061 1062 1063 1064 1065
        }
    }
    return Status::OK();
}

Status
1066
Config::CheckStorageConfigS3AccessKey(const std::string& value) {
C
Cai Yudong 已提交
1067
    if (value.empty()) {
1068
        return Status(SERVER_INVALID_ARGUMENT, "storage_config.s3_access_key is empty.");
C
Cai Yudong 已提交
1069 1070 1071 1072 1073
    }
    return Status::OK();
}

Status
1074
Config::CheckStorageConfigS3SecretKey(const std::string& value) {
C
Cai Yudong 已提交
1075
    if (value.empty()) {
1076
        return Status(SERVER_INVALID_ARGUMENT, "storage_config.s3_secret_key is empty.");
C
Cai Yudong 已提交
1077 1078 1079 1080 1081
    }
    return Status::OK();
}

Status
1082
Config::CheckStorageConfigS3Bucket(const std::string& value) {
C
Cai Yudong 已提交
1083
    if (value.empty()) {
1084
        return Status(SERVER_INVALID_ARGUMENT, "storage_config.s3_bucket is empty.");
C
Cai Yudong 已提交
1085 1086 1087 1088 1089
    }
    return Status::OK();
}

/* metric config */
S
starlord 已提交
1090
Status
S
starlord 已提交
1091
Config::CheckMetricConfigEnableMonitor(const std::string& value) {
S
shengjh 已提交
1092 1093 1094 1095
    auto exist_error = !ValidationUtil::ValidateStringIsBool(value).ok();
    fiu_do_on("check_config_enable_monitor_fail", exist_error = true);

    if (exist_error) {
1096
        std::string msg =
S
starlord 已提交
1097
            "Invalid metric config: " + value + ". Possible reason: metric_config.enable_monitor is not a boolean.";
1098
        return Status(SERVER_INVALID_ARGUMENT, msg);
Z
zhiru 已提交
1099
    }
Y
yudong.cai 已提交
1100 1101
    return Status::OK();
}
Z
zhiru 已提交
1102

Y
yudong.cai 已提交
1103
Status
C
Cai Yudong 已提交
1104
Config::CheckMetricConfigAddress(const std::string& value) {
1105
    if (!ValidationUtil::ValidateIpAddress(value).ok()) {
C
Cai Yudong 已提交
1106
        std::string msg = "Invalid metric ip: " + value + ". Possible reason: metric_config.ip is invalid.";
1107
        return Status(SERVER_INVALID_ARGUMENT, msg);
1108 1109 1110 1111
    }
    return Status::OK();
}

Y
yudong.cai 已提交
1112
Status
C
Cai Yudong 已提交
1113
Config::CheckMetricConfigPort(const std::string& value) {
Y
yudong.cai 已提交
1114
    if (!ValidationUtil::ValidateStringIsNumber(value).ok()) {
C
Cai Yudong 已提交
1115
        std::string msg = "Invalid metric port: " + value + ". Possible reason: metric_config.port is not a number.";
C
Cai Yudong 已提交
1116 1117
        return Status(SERVER_INVALID_ARGUMENT, msg);
    } else {
J
Jin Hai 已提交
1118 1119 1120 1121 1122 1123 1124 1125 1126
        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 已提交
1127
        }
Z
zhiru 已提交
1128
    }
Y
yudong.cai 已提交
1129
    return Status::OK();
Z
zhiru 已提交
1130 1131
}

C
Cai Yudong 已提交
1132
/* cache config */
S
starlord 已提交
1133
Status
S
starlord 已提交
1134
Config::CheckCacheConfigCpuCacheCapacity(const std::string& value) {
S
shengjh 已提交
1135 1136
    fiu_return_on("check_config_cpu_cache_capacity_fail", Status(SERVER_INVALID_ARGUMENT, ""));

Y
yudong.cai 已提交
1137
    if (!ValidationUtil::ValidateStringIsNumber(value).ok()) {
1138
        std::string msg = "Invalid cpu cache capacity: " + value +
S
starlord 已提交
1139
                          ". Possible reason: cache_config.cpu_cache_capacity is not a positive integer.";
1140
        return Status(SERVER_INVALID_ARGUMENT, msg);
1141
    } else {
Y
yudong.cai 已提交
1142
        int64_t cpu_cache_capacity = std::stoll(value) * GB;
1143 1144
        if (cpu_cache_capacity <= 0) {
            std::string msg = "Invalid cpu cache capacity: " + value +
S
starlord 已提交
1145
                              ". Possible reason: cache_config.cpu_cache_capacity is not a positive integer.";
1146 1147 1148
            return Status(SERVER_INVALID_ARGUMENT, msg);
        }

S
starlord 已提交
1149
        uint64_t total_mem = 0, free_mem = 0;
Z
zhiru 已提交
1150
        CommonUtil::GetSystemMemInfo(total_mem, free_mem);
1151 1152
        if (static_cast<uint64_t>(cpu_cache_capacity) >= total_mem) {
            std::string msg = "Invalid cpu cache capacity: " + value +
S
starlord 已提交
1153
                              ". Possible reason: cache_config.cpu_cache_capacity exceeds system memory.";
1154
            return Status(SERVER_INVALID_ARGUMENT, msg);
1155
        } else if (static_cast<double>(cpu_cache_capacity) > static_cast<double>(total_mem * 0.9)) {
1156
            std::cerr << "WARNING: cpu cache capacity value is too big" << std::endl;
Z
zhiru 已提交
1157
        }
1158

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

Y
yudong.cai 已提交
1162
        int64_t insert_buffer_size = buffer_value * GB;
S
shengjh 已提交
1163
        fiu_do_on("Config.CheckCacheConfigCpuCacheCapacity.large_insert_buffer", insert_buffer_size = total_mem + 1);
Y
yudong.cai 已提交
1164
        if (insert_buffer_size + cpu_cache_capacity >= total_mem) {
1165
            std::string msg = "Invalid cpu cache capacity: " + value +
S
starlord 已提交
1166
                              ". Possible reason: sum of cache_config.cpu_cache_capacity and "
1167
                              "cache_config.insert_buffer_size exceeds system memory.";
1168
            return Status(SERVER_INVALID_ARGUMENT, msg);
Z
zhiru 已提交
1169 1170
        }
    }
Y
yudong.cai 已提交
1171 1172
    return Status::OK();
}
Z
zhiru 已提交
1173

Y
yudong.cai 已提交
1174
Status
S
starlord 已提交
1175
Config::CheckCacheConfigCpuCacheThreshold(const std::string& value) {
S
shengjh 已提交
1176 1177
    fiu_return_on("check_config_cpu_cache_threshold_fail", Status(SERVER_INVALID_ARGUMENT, ""));

Y
yudong.cai 已提交
1178
    if (!ValidationUtil::ValidateStringIsFloat(value).ok()) {
1179
        std::string msg = "Invalid cpu cache threshold: " + value +
S
starlord 已提交
1180
                          ". Possible reason: cache_config.cpu_cache_threshold is not in range (0.0, 1.0].";
1181
        return Status(SERVER_INVALID_ARGUMENT, msg);
Y
yudong.cai 已提交
1182
    } else {
Y
yudong.cai 已提交
1183 1184
        float cpu_cache_threshold = std::stof(value);
        if (cpu_cache_threshold <= 0.0 || cpu_cache_threshold >= 1.0) {
1185
            std::string msg = "Invalid cpu cache threshold: " + value +
S
starlord 已提交
1186
                              ". Possible reason: cache_config.cpu_cache_threshold is not in range (0.0, 1.0].";
1187
            return Status(SERVER_INVALID_ARGUMENT, msg);
Y
yudong.cai 已提交
1188
        }
1189
    }
Y
yudong.cai 已提交
1190 1191
    return Status::OK();
}
1192

1193 1194
Status
Config::CheckCacheConfigInsertBufferSize(const std::string& value) {
S
shengjh 已提交
1195
    fiu_return_on("check_config_insert_buffer_size_fail", Status(SERVER_INVALID_ARGUMENT, ""));
1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207
    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);
        }

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

1211 1212
        uint64_t total_mem = 0, free_mem = 0;
        CommonUtil::GetSystemMemInfo(total_mem, free_mem);
T
Tinkerrr 已提交
1213
        if (buffer_size + cache_size >= total_mem) {
1214 1215 1216 1217 1218 1219 1220 1221
            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 已提交
1222
Status
S
starlord 已提交
1223
Config::CheckCacheConfigCacheInsertData(const std::string& value) {
S
shengjh 已提交
1224 1225
    fiu_return_on("check_config_cache_insert_data_fail", Status(SERVER_INVALID_ARGUMENT, ""));

Y
yudong.cai 已提交
1226
    if (!ValidationUtil::ValidateStringIsBool(value).ok()) {
1227
        std::string msg = "Invalid cache insert data option: " + value +
S
starlord 已提交
1228
                          ". Possible reason: cache_config.cache_insert_data is not a boolean.";
1229
        return Status(SERVER_INVALID_ARGUMENT, msg);
Y
yudong.cai 已提交
1230 1231
    }
    return Status::OK();
Z
zhiru 已提交
1232 1233
}

C
Cai Yudong 已提交
1234
/* engine config */
S
starlord 已提交
1235
Status
S
starlord 已提交
1236
Config::CheckEngineConfigUseBlasThreshold(const std::string& value) {
S
shengjh 已提交
1237 1238
    fiu_return_on("check_config_use_blas_threshold_fail", Status(SERVER_INVALID_ARGUMENT, ""));

Y
yudong.cai 已提交
1239
    if (!ValidationUtil::ValidateStringIsNumber(value).ok()) {
1240
        std::string msg = "Invalid use blas threshold: " + value +
S
starlord 已提交
1241
                          ". Possible reason: engine_config.use_blas_threshold is not a positive integer.";
1242
        return Status(SERVER_INVALID_ARGUMENT, msg);
Z
zhiru 已提交
1243
    }
Y
yudong.cai 已提交
1244 1245
    return Status::OK();
}
Z
zhiru 已提交
1246

Y
yudong.cai 已提交
1247
Status
S
starlord 已提交
1248
Config::CheckEngineConfigOmpThreadNum(const std::string& value) {
S
shengjh 已提交
1249 1250
    fiu_return_on("check_config_omp_thread_num_fail", Status(SERVER_INVALID_ARGUMENT, ""));

Y
yudong.cai 已提交
1251
    if (!ValidationUtil::ValidateStringIsNumber(value).ok()) {
1252
        std::string msg = "Invalid omp thread num: " + value +
S
starlord 已提交
1253
                          ". Possible reason: engine_config.omp_thread_num is not a positive integer.";
1254
        return Status(SERVER_INVALID_ARGUMENT, msg);
S
starlord 已提交
1255 1256
    }

Y
yudong.cai 已提交
1257 1258
    int64_t omp_thread = std::stoll(value);
    int64_t sys_thread_cnt = 8;
S
starlord 已提交
1259
    CommonUtil::GetSystemAvailableThreads(sys_thread_cnt);
Y
yudong.cai 已提交
1260
    if (omp_thread > sys_thread_cnt) {
1261
        std::string msg = "Invalid omp thread num: " + value +
S
starlord 已提交
1262
                          ". Possible reason: engine_config.omp_thread_num exceeds system cpu cores.";
1263
        return Status(SERVER_INVALID_ARGUMENT, msg);
Z
zhiru 已提交
1264
    }
Y
yudong.cai 已提交
1265
    return Status::OK();
Z
zhiru 已提交
1266 1267
}

C
Cai Yudong 已提交
1268 1269 1270 1271 1272 1273 1274 1275 1276 1277
Status
Config::CheckEngineConfigUseAVX512(const std::string& value) {
    if (!ValidationUtil::ValidateStringIsBool(value).ok()) {
        std::string msg =
            "Invalid engine config: " + value + ". Possible reason: engine_config.use_avx512 is not a boolean.";
        return Status(SERVER_INVALID_ARGUMENT, msg);
    }
    return Status::OK();
}

G
groot 已提交
1278
#ifdef MILVUS_GPU_VERSION
B
BossZou 已提交
1279

W
wxyu 已提交
1280
Status
1281
Config::CheckEngineConfigGpuSearchThreshold(const std::string& value) {
S
shengjh 已提交
1282 1283
    fiu_return_on("check_config_gpu_search_threshold_fail", Status(SERVER_INVALID_ARGUMENT, ""));

W
wxyu 已提交
1284
    if (!ValidationUtil::ValidateStringIsNumber(value).ok()) {
1285 1286
        std::string msg = "Invalid gpu search threshold: " + value +
                          ". Possible reason: engine_config.gpu_search_threshold is not a positive integer.";
W
wxyu 已提交
1287 1288 1289 1290 1291
        return Status(SERVER_INVALID_ARGUMENT, msg);
    }
    return Status::OK();
}

C
Cai Yudong 已提交
1292
/* gpu resource config */
S
starlord 已提交
1293
Status
1294
Config::CheckGpuResourceConfigEnable(const std::string& value) {
S
shengjh 已提交
1295 1296
    fiu_return_on("check_config_gpu_resource_enable_fail", Status(SERVER_INVALID_ARGUMENT, ""));

Y
yudong.cai 已提交
1297
    if (!ValidationUtil::ValidateStringIsBool(value).ok()) {
1298 1299
        std::string msg =
            "Invalid gpu resource config: " + value + ". Possible reason: gpu_resource_config.enable is not a boolean.";
1300
        return Status(SERVER_INVALID_ARGUMENT, msg);
W
wxyu 已提交
1301
    }
Y
yudong.cai 已提交
1302 1303
    return Status::OK();
}
1304

Y
yudong.cai 已提交
1305
Status
Y
yudong.cai 已提交
1306
Config::CheckGpuResourceConfigCacheCapacity(const std::string& value) {
S
shengjh 已提交
1307 1308
    fiu_return_on("check_gpu_resource_config_cache_capacity_fail", Status(SERVER_INVALID_ARGUMENT, ""));

Y
yudong.cai 已提交
1309 1310 1311
    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.";
1312
        return Status(SERVER_INVALID_ARGUMENT, msg);
Y
yudong.cai 已提交
1313
    } else {
Y
yudong.cai 已提交
1314 1315
        int64_t gpu_cache_capacity = std::stoll(value) * GB;
        std::vector<int64_t> gpu_ids;
C
Cai Yudong 已提交
1316
        CONFIG_CHECK(GetGpuResourceConfigBuildIndexResources(gpu_ids));
Y
yudong.cai 已提交
1317

Y
yudong.cai 已提交
1318
        for (int64_t gpu_id : gpu_ids) {
Y
yudong.cai 已提交
1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330
            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 已提交
1331
    }
Y
yudong.cai 已提交
1332 1333
    return Status::OK();
}
1334

Y
yudong.cai 已提交
1335
Status
Y
yudong.cai 已提交
1336
Config::CheckGpuResourceConfigCacheThreshold(const std::string& value) {
S
shengjh 已提交
1337 1338
    fiu_return_on("check_config_gpu_resource_cache_threshold_fail", Status(SERVER_INVALID_ARGUMENT, ""));

Y
yudong.cai 已提交
1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355
    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 已提交
1356 1357
    std::string s = value;
    std::transform(s.begin(), s.end(), s.begin(), ::tolower);
Z
Zhiru Zhu 已提交
1358

Y
yudong.cai 已提交
1359
    const std::regex pat("gpu(\\d+)");
Z
Zhiru Zhu 已提交
1360 1361
    std::smatch m;
    if (!std::regex_match(s, m, pat)) {
Y
yudong.cai 已提交
1362 1363
        std::string msg = "Invalid gpu resource: " + value +
                          ". Possible reason: gpu_resource_config is not in the format of cpux or gpux";
1364
        return Status(SERVER_INVALID_ARGUMENT, msg);
1365 1366
    }

Z
Zhiru Zhu 已提交
1367
    if (s.compare(0, 3, "gpu") == 0) {
J
Jin Hai 已提交
1368 1369 1370 1371 1372 1373 1374 1375 1376
        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 已提交
1377
        }
1378
    }
Z
Zhiru Zhu 已提交
1379

1380 1381 1382 1383
    return Status::OK();
}

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

Y
yudong.cai 已提交
1387
    if (value.empty()) {
1388
        std::string msg =
Y
yudong.cai 已提交
1389 1390
            "Invalid gpu search resource. "
            "Possible reason: gpu_resource_config.search_resources is empty.";
1391
        return Status(SERVER_INVALID_ARGUMENT, msg);
1392 1393
    }

B
BossZou 已提交
1394
    std::unordered_set<std::string> value_set;
Z
Zhiru Zhu 已提交
1395
    for (auto& resource : value) {
C
Cai Yudong 已提交
1396
        CONFIG_CHECK(CheckGpuResource(resource));
B
BossZou 已提交
1397
        value_set.insert(resource);
1398
    }
B
BossZou 已提交
1399 1400 1401 1402 1403 1404 1405 1406

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

1407 1408 1409 1410
    return Status::OK();
}

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

1414 1415
    if (value.empty()) {
        std::string msg =
Y
yudong.cai 已提交
1416 1417
            "Invalid gpu build index resource. "
            "Possible reason: gpu_resource_config.build_index_resources is empty.";
1418 1419 1420
        return Status(SERVER_INVALID_ARGUMENT, msg);
    }

B
BossZou 已提交
1421
    std::unordered_set<std::string> value_set;
1422
    for (auto& resource : value) {
C
Cai Yudong 已提交
1423
        CONFIG_CHECK(CheckGpuResource(resource));
B
BossZou 已提交
1424 1425 1426 1427 1428 1429 1430 1431
        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 已提交
1432
    }
1433

Y
yudong.cai 已提交
1434
    return Status::OK();
G
groot 已提交
1435
}
B
BossZou 已提交
1436

G
groot 已提交
1437
#endif
1438 1439 1440 1441 1442 1443 1444
/* 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 已提交
1445

C
Cai Yudong 已提交
1446 1447 1448
/* wal config */
Status
Config::CheckWalConfigEnable(const std::string& value) {
J
Jin Hai 已提交
1449 1450 1451 1452
    auto exist_error = !ValidationUtil::ValidateStringIsBool(value).ok();
    fiu_do_on("check_config_wal_enable_fail", exist_error = true);

    if (exist_error) {
C
Cai Yudong 已提交
1453 1454 1455 1456 1457 1458 1459 1460
        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 已提交
1461 1462 1463 1464
    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 已提交
1465 1466 1467 1468 1469 1470 1471 1472 1473
        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 已提交
1474 1475 1476 1477
    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 已提交
1478 1479 1480 1481 1482 1483 1484
        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 已提交
1485 1486 1487 1488 1489 1490 1491 1492 1493 1494
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);
}

Y
yudong.cai 已提交
1495
////////////////////////////////////////////////////////////////////////////////
S
starlord 已提交
1496
ConfigNode&
1497
Config::GetConfigRoot() {
1498
    ConfigMgr* mgr = YamlConfigMgr::GetInstance();
1499 1500 1501 1502 1503 1504
    return mgr->GetRootNode();
}

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

C
Cai Yudong 已提交
1507 1508 1509 1510 1511
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 已提交
1512
    return config_map_[parent_key].count(child_key) != 0;
C
Cai Yudong 已提交
1513 1514
}

Y
yudong.cai 已提交
1515
Status
S
starlord 已提交
1516
Config::GetConfigValueInMem(const std::string& parent_key, const std::string& child_key, std::string& value) {
Y
yudong.cai 已提交
1517
    std::lock_guard<std::mutex> lock(mutex_);
Y
yudong.cai 已提交
1518 1519 1520 1521 1522
    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 已提交
1523
    return Status(SERVER_UNEXPECTED_ERROR, "key not exist");
Y
yudong.cai 已提交
1524 1525
}

C
Cai Yudong 已提交
1526
Status
S
starlord 已提交
1527
Config::SetConfigValueInMem(const std::string& parent_key, const std::string& child_key, const std::string& value) {
Y
yudong.cai 已提交
1528 1529
    std::lock_guard<std::mutex> lock(mutex_);
    config_map_[parent_key][child_key] = value;
C
Cai Yudong 已提交
1530
    return Status::OK();
Y
yudong.cai 已提交
1531 1532 1533
}

////////////////////////////////////////////////////////////////////////////////
Y
yudong.cai 已提交
1534
std::string
S
starlord 已提交
1535
Config::GetConfigStr(const std::string& parent_key, const std::string& child_key, const std::string& default_value) {
Y
yudong.cai 已提交
1536
    std::string value;
S
starlord 已提交
1537 1538 1539
    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 已提交
1540
    }
Y
yudong.cai 已提交
1541
    return value;
Y
yudong.cai 已提交
1542 1543
}

Z
Zhiru Zhu 已提交
1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559
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;
}

1560 1561 1562 1563 1564 1565
Status
Config::GetConfigVersion(std::string& value) {
    value = GetConfigRoot().GetValue(CONFIG_VERSION);
    return CheckConfigVersion(value);
}

1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591
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 已提交
1592
/* server config */
1593
Status
S
starlord 已提交
1594
Config::GetServerConfigAddress(std::string& value) {
S
starlord 已提交
1595
    value = GetConfigStr(CONFIG_SERVER, CONFIG_SERVER_ADDRESS, CONFIG_SERVER_ADDRESS_DEFAULT);
Y
yudong.cai 已提交
1596
    return CheckServerConfigAddress(value);
1597 1598 1599
}

Status
S
starlord 已提交
1600
Config::GetServerConfigPort(std::string& value) {
S
starlord 已提交
1601
    value = GetConfigStr(CONFIG_SERVER, CONFIG_SERVER_PORT, CONFIG_SERVER_PORT_DEFAULT);
Y
yudong.cai 已提交
1602
    return CheckServerConfigPort(value);
1603 1604 1605
}

Status
S
starlord 已提交
1606
Config::GetServerConfigDeployMode(std::string& value) {
S
starlord 已提交
1607
    value = GetConfigStr(CONFIG_SERVER, CONFIG_SERVER_DEPLOY_MODE, CONFIG_SERVER_DEPLOY_MODE_DEFAULT);
Y
yudong.cai 已提交
1608
    return CheckServerConfigDeployMode(value);
1609 1610 1611
}

Status
S
starlord 已提交
1612
Config::GetServerConfigTimeZone(std::string& value) {
S
starlord 已提交
1613
    value = GetConfigStr(CONFIG_SERVER, CONFIG_SERVER_TIME_ZONE, CONFIG_SERVER_TIME_ZONE_DEFAULT);
Y
yudong.cai 已提交
1614
    return CheckServerConfigTimeZone(value);
1615 1616
}

1617 1618 1619 1620 1621 1622 1623
Status
Config::GetServerConfigWebEnable(bool& value) {
    std::string str = GetConfigStr(CONFIG_SERVER, CONFIG_SERVER_WEB_ENABLE, CONFIG_SERVER_WEB_ENABLE_DEFAULT);
    CONFIG_CHECK(CheckServerConfigWebEnable(str));
    return StringHelpFunctions::ConvertToBoolean(str, value);
}

B
BossZou 已提交
1624 1625 1626 1627 1628 1629
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 已提交
1630
/* DB config */
1631
Status
S
starlord 已提交
1632
Config::GetDBConfigBackendUrl(std::string& value) {
S
starlord 已提交
1633
    value = GetConfigStr(CONFIG_DB, CONFIG_DB_BACKEND_URL, CONFIG_DB_BACKEND_URL_DEFAULT);
Y
yudong.cai 已提交
1634
    return CheckDBConfigBackendUrl(value);
1635 1636 1637
}

Status
Y
yudong.cai 已提交
1638
Config::GetDBConfigArchiveDiskThreshold(int64_t& value) {
S
starlord 已提交
1639 1640
    std::string str =
        GetConfigStr(CONFIG_DB, CONFIG_DB_ARCHIVE_DISK_THRESHOLD, CONFIG_DB_ARCHIVE_DISK_THRESHOLD_DEFAULT);
C
Cai Yudong 已提交
1641
    CONFIG_CHECK(CheckDBConfigArchiveDiskThreshold(str));
Y
yudong.cai 已提交
1642
    value = std::stoll(str);
1643 1644 1645 1646
    return Status::OK();
}

Status
Y
yudong.cai 已提交
1647
Config::GetDBConfigArchiveDaysThreshold(int64_t& value) {
S
starlord 已提交
1648 1649
    std::string str =
        GetConfigStr(CONFIG_DB, CONFIG_DB_ARCHIVE_DAYS_THRESHOLD, CONFIG_DB_ARCHIVE_DAYS_THRESHOLD_DEFAULT);
C
Cai Yudong 已提交
1650
    CONFIG_CHECK(CheckDBConfigArchiveDaysThreshold(str));
Y
yudong.cai 已提交
1651
    value = std::stoll(str);
1652 1653 1654
    return Status::OK();
}

S
starlord 已提交
1655
Status
1656
Config::GetDBConfigPreloadCollection(std::string& value) {
G
groot 已提交
1657
    value = GetConfigStr(CONFIG_DB, CONFIG_DB_PRELOAD_COLLECTION);
S
starlord 已提交
1658 1659 1660
    return Status::OK();
}

1661
Status
C
Cai Yudong 已提交
1662
Config::GetDBConfigAutoFlushInterval(int64_t& value) {
1663
    std::string str = GetConfigStr(CONFIG_DB, CONFIG_DB_AUTO_FLUSH_INTERVAL, CONFIG_DB_AUTO_FLUSH_INTERVAL_DEFAULT);
C
Cai Yudong 已提交
1664 1665
    CONFIG_CHECK(CheckDBConfigAutoFlushInterval(str));
    value = std::stoll(str);
1666 1667 1668
    return Status::OK();
}

C
Cai Yudong 已提交
1669
/* storage config */
1670 1671
Status
Config::GetStorageConfigPrimaryPath(std::string& value) {
C
Cai Yudong 已提交
1672
    value = GetConfigStr(CONFIG_STORAGE, CONFIG_STORAGE_PRIMARY_PATH, CONFIG_STORAGE_PRIMARY_PATH_DEFAULT);
1673 1674 1675 1676 1677
    return CheckStorageConfigPrimaryPath(value);
}

Status
Config::GetStorageConfigSecondaryPath(std::string& value) {
C
Cai Yudong 已提交
1678
    value = GetConfigStr(CONFIG_STORAGE, CONFIG_STORAGE_SECONDARY_PATH, CONFIG_STORAGE_SECONDARY_PATH_DEFAULT);
1679 1680 1681
    return CheckStorageConfigSecondaryPath(value);
}

C
Cai Yudong 已提交
1682
Status
1683 1684 1685
Config::GetStorageConfigS3Enable(bool& value) {
    std::string str = GetConfigStr(CONFIG_STORAGE, CONFIG_STORAGE_S3_ENABLE, CONFIG_STORAGE_S3_ENABLE_DEFAULT);
    CONFIG_CHECK(CheckStorageConfigS3Enable(str));
Y
Yhz 已提交
1686
    CONFIG_CHECK(StringHelpFunctions::ConvertToBoolean(str, value));
C
Cai Yudong 已提交
1687 1688 1689 1690
    return Status::OK();
}

Status
1691 1692 1693
Config::GetStorageConfigS3Address(std::string& value) {
    value = GetConfigStr(CONFIG_STORAGE, CONFIG_STORAGE_S3_ADDRESS, CONFIG_STORAGE_S3_ADDRESS_DEFAULT);
    return CheckStorageConfigS3Address(value);
C
Cai Yudong 已提交
1694 1695 1696
}

Status
1697 1698 1699
Config::GetStorageConfigS3Port(std::string& value) {
    value = GetConfigStr(CONFIG_STORAGE, CONFIG_STORAGE_S3_PORT, CONFIG_STORAGE_S3_PORT_DEFAULT);
    return CheckStorageConfigS3Port(value);
C
Cai Yudong 已提交
1700 1701 1702
}

Status
1703 1704
Config::GetStorageConfigS3AccessKey(std::string& value) {
    value = GetConfigStr(CONFIG_STORAGE, CONFIG_STORAGE_S3_ACCESS_KEY, CONFIG_STORAGE_S3_ACCESS_KEY_DEFAULT);
C
Cai Yudong 已提交
1705 1706 1707 1708
    return Status::OK();
}

Status
1709 1710
Config::GetStorageConfigS3SecretKey(std::string& value) {
    value = GetConfigStr(CONFIG_STORAGE, CONFIG_STORAGE_S3_SECRET_KEY, CONFIG_STORAGE_S3_SECRET_KEY_DEFAULT);
C
Cai Yudong 已提交
1711 1712 1713 1714
    return Status::OK();
}

Status
1715 1716
Config::GetStorageConfigS3Bucket(std::string& value) {
    value = GetConfigStr(CONFIG_STORAGE, CONFIG_STORAGE_S3_BUCKET, CONFIG_STORAGE_S3_BUCKET_DEFAULT);
C
Cai Yudong 已提交
1717 1718 1719 1720
    return Status::OK();
}

/* metric config */
1721
Status
S
starlord 已提交
1722
Config::GetMetricConfigEnableMonitor(bool& value) {
1723
    std::string str = GetConfigStr(CONFIG_METRIC, CONFIG_METRIC_ENABLE_MONITOR, CONFIG_METRIC_ENABLE_MONITOR_DEFAULT);
C
Cai Yudong 已提交
1724
    CONFIG_CHECK(CheckMetricConfigEnableMonitor(str));
Y
Yhz 已提交
1725
    CONFIG_CHECK(StringHelpFunctions::ConvertToBoolean(str, value));
1726 1727 1728 1729
    return Status::OK();
}

Status
C
Cai Yudong 已提交
1730 1731
Config::GetMetricConfigAddress(std::string& value) {
    value = GetConfigStr(CONFIG_METRIC, CONFIG_METRIC_ADDRESS, CONFIG_METRIC_ADDRESS_DEFAULT);
Y
yudong.cai 已提交
1732
    return Status::OK();
1733 1734
}

1735
Status
C
Cai Yudong 已提交
1736 1737 1738
Config::GetMetricConfigPort(std::string& value) {
    value = GetConfigStr(CONFIG_METRIC, CONFIG_METRIC_PORT, CONFIG_METRIC_PORT_DEFAULT);
    return CheckMetricConfigPort(value);
1739 1740
}

C
Cai Yudong 已提交
1741
/* cache config */
1742
Status
W
wxyu 已提交
1743
Config::GetCacheConfigCpuCacheCapacity(int64_t& value) {
S
starlord 已提交
1744 1745
    std::string str =
        GetConfigStr(CONFIG_CACHE, CONFIG_CACHE_CPU_CACHE_CAPACITY, CONFIG_CACHE_CPU_CACHE_CAPACITY_DEFAULT);
C
Cai Yudong 已提交
1746
    CONFIG_CHECK(CheckCacheConfigCpuCacheCapacity(str));
Y
yudong.cai 已提交
1747
    value = std::stoll(str);
1748 1749 1750 1751
    return Status::OK();
}

Status
S
starlord 已提交
1752
Config::GetCacheConfigCpuCacheThreshold(float& value) {
S
starlord 已提交
1753 1754
    std::string str =
        GetConfigStr(CONFIG_CACHE, CONFIG_CACHE_CPU_CACHE_THRESHOLD, CONFIG_CACHE_CPU_CACHE_THRESHOLD_DEFAULT);
C
Cai Yudong 已提交
1755
    CONFIG_CHECK(CheckCacheConfigCpuCacheThreshold(str));
1756 1757 1758 1759
    value = std::stof(str);
    return Status::OK();
}

1760 1761 1762 1763 1764 1765 1766 1767 1768
Status
Config::GetCacheConfigInsertBufferSize(int64_t& value) {
    std::string str =
        GetConfigStr(CONFIG_CACHE, CONFIG_CACHE_INSERT_BUFFER_SIZE, CONFIG_CACHE_INSERT_BUFFER_SIZE_DEFAULT);
    CONFIG_CHECK(CheckCacheConfigInsertBufferSize(str));
    value = std::stoll(str);
    return Status::OK();
}

1769
Status
S
starlord 已提交
1770
Config::GetCacheConfigCacheInsertData(bool& value) {
S
starlord 已提交
1771 1772
    std::string str =
        GetConfigStr(CONFIG_CACHE, CONFIG_CACHE_CACHE_INSERT_DATA, CONFIG_CACHE_CACHE_INSERT_DATA_DEFAULT);
C
Cai Yudong 已提交
1773
    CONFIG_CHECK(CheckCacheConfigCacheInsertData(str));
1774 1775 1776 1777 1778
    std::transform(str.begin(), str.end(), str.begin(), ::tolower);
    value = (str == "true" || str == "on" || str == "yes" || str == "1");
    return Status::OK();
}

C
Cai Yudong 已提交
1779
/* engine config */
1780
Status
Y
yudong.cai 已提交
1781
Config::GetEngineConfigUseBlasThreshold(int64_t& value) {
S
starlord 已提交
1782 1783
    std::string str =
        GetConfigStr(CONFIG_ENGINE, CONFIG_ENGINE_USE_BLAS_THRESHOLD, CONFIG_ENGINE_USE_BLAS_THRESHOLD_DEFAULT);
C
Cai Yudong 已提交
1784
    CONFIG_CHECK(CheckEngineConfigUseBlasThreshold(str));
Y
yudong.cai 已提交
1785
    value = std::stoll(str);
1786 1787 1788 1789
    return Status::OK();
}

Status
Y
yudong.cai 已提交
1790
Config::GetEngineConfigOmpThreadNum(int64_t& value) {
1791
    std::string str = GetConfigStr(CONFIG_ENGINE, CONFIG_ENGINE_OMP_THREAD_NUM, CONFIG_ENGINE_OMP_THREAD_NUM_DEFAULT);
C
Cai Yudong 已提交
1792
    CONFIG_CHECK(CheckEngineConfigOmpThreadNum(str));
Y
yudong.cai 已提交
1793
    value = std::stoll(str);
1794 1795 1796
    return Status::OK();
}

C
Cai Yudong 已提交
1797 1798 1799 1800 1801 1802 1803 1804 1805
Status
Config::GetEngineConfigUseAVX512(bool& value) {
    std::string str = GetConfigStr(CONFIG_ENGINE, CONFIG_ENGINE_USE_AVX512, CONFIG_ENGINE_USE_AVX512_DEFAULT);
    CONFIG_CHECK(CheckEngineConfigUseAVX512(str));
    std::transform(str.begin(), str.end(), str.begin(), ::tolower);
    value = (str == "true" || str == "on" || str == "yes" || str == "1");
    return Status::OK();
}

G
groot 已提交
1806
#ifdef MILVUS_GPU_VERSION
B
BossZou 已提交
1807

W
wxyu 已提交
1808
Status
Y
yudong.cai 已提交
1809
Config::GetEngineConfigGpuSearchThreshold(int64_t& value) {
W
wxyu 已提交
1810
    std::string str =
1811
        GetConfigStr(CONFIG_ENGINE, CONFIG_ENGINE_GPU_SEARCH_THRESHOLD, CONFIG_ENGINE_GPU_SEARCH_THRESHOLD_DEFAULT);
C
Cai Yudong 已提交
1812
    CONFIG_CHECK(CheckEngineConfigGpuSearchThreshold(str));
Y
yudong.cai 已提交
1813
    value = std::stoll(str);
W
wxyu 已提交
1814 1815
    return Status::OK();
}
S
shengjh 已提交
1816

C
Cai Yudong 已提交
1817
#endif
W
wxyu 已提交
1818

C
Cai Yudong 已提交
1819 1820
/* gpu resource config */
#ifdef MILVUS_GPU_VERSION
S
shengjh 已提交
1821

1822
Status
1823 1824
Config::GetGpuResourceConfigEnable(bool& value) {
    std::string str = GetConfigStr(CONFIG_GPU_RESOURCE, CONFIG_GPU_RESOURCE_ENABLE, CONFIG_GPU_RESOURCE_ENABLE_DEFAULT);
C
Cai Yudong 已提交
1825
    CONFIG_CHECK(CheckGpuResourceConfigEnable(str));
Y
Yhz 已提交
1826
    CONFIG_CHECK(StringHelpFunctions::ConvertToBoolean(str, value));
Y
yudong.cai 已提交
1827
    return Status::OK();
1828 1829 1830
}

Status
Y
yudong.cai 已提交
1831
Config::GetGpuResourceConfigCacheCapacity(int64_t& value) {
1832
    bool gpu_resource_enable = false;
C
Cai Yudong 已提交
1833
    CONFIG_CHECK(GetGpuResourceConfigEnable(gpu_resource_enable));
S
shengjh 已提交
1834
    fiu_do_on("Config.GetGpuResourceConfigCacheCapacity.diable_gpu_resource", gpu_resource_enable = false);
1835 1836
    if (!gpu_resource_enable) {
        std::string msg = "GPU not supported. Possible reason: gpu_resource_config.enable is set to false.";
Y
yudong.cai 已提交
1837 1838 1839 1840
        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 已提交
1841
    CONFIG_CHECK(CheckGpuResourceConfigCacheCapacity(str));
Y
yudong.cai 已提交
1842
    value = std::stoll(str);
W
wxyu 已提交
1843 1844 1845
    return Status::OK();
}

1846
Status
Y
yudong.cai 已提交
1847
Config::GetGpuResourceConfigCacheThreshold(float& value) {
1848
    bool gpu_resource_enable = false;
C
Cai Yudong 已提交
1849
    CONFIG_CHECK(GetGpuResourceConfigEnable(gpu_resource_enable));
S
shengjh 已提交
1850
    fiu_do_on("Config.GetGpuResourceConfigCacheThreshold.diable_gpu_resource", gpu_resource_enable = false);
1851 1852
    if (!gpu_resource_enable) {
        std::string msg = "GPU not supported. Possible reason: gpu_resource_config.enable is set to false.";
Y
yudong.cai 已提交
1853 1854 1855 1856
        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 已提交
1857
    CONFIG_CHECK(CheckGpuResourceConfigCacheThreshold(str));
Y
yudong.cai 已提交
1858 1859
    value = std::stof(str);
    return Status::OK();
1860 1861 1862
}

Status
Y
yudong.cai 已提交
1863
Config::GetGpuResourceConfigSearchResources(std::vector<int64_t>& value) {
1864
    bool gpu_resource_enable = false;
C
Cai Yudong 已提交
1865
    CONFIG_CHECK(GetGpuResourceConfigEnable(gpu_resource_enable));
S
shengjh 已提交
1866
    fiu_do_on("get_gpu_config_search_resources.disable_gpu_resource_fail", gpu_resource_enable = false);
1867 1868
    if (!gpu_resource_enable) {
        std::string msg = "GPU not supported. Possible reason: gpu_resource_config.enable is set to false.";
Y
yudong.cai 已提交
1869 1870 1871 1872 1873 1874
        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 已提交
1875
    CONFIG_CHECK(CheckGpuResourceConfigSearchResources(res_vec));
1876
    value.clear();
Y
yudong.cai 已提交
1877
    for (std::string& res : res_vec) {
Y
yudong.cai 已提交
1878
        value.push_back(std::stoll(res.substr(3)));
Y
yudong.cai 已提交
1879 1880
    }
    return Status::OK();
1881 1882 1883
}

Status
Y
yudong.cai 已提交
1884
Config::GetGpuResourceConfigBuildIndexResources(std::vector<int64_t>& value) {
1885
    bool gpu_resource_enable = false;
C
Cai Yudong 已提交
1886
    CONFIG_CHECK(GetGpuResourceConfigEnable(gpu_resource_enable));
S
shengjh 已提交
1887
    fiu_do_on("get_gpu_config_build_index_resources.disable_gpu_resource_fail", gpu_resource_enable = false);
1888 1889
    if (!gpu_resource_enable) {
        std::string msg = "GPU not supported. Possible reason: gpu_resource_config.enable is set to false.";
Y
yudong.cai 已提交
1890 1891
        return Status(SERVER_UNSUPPORTED_ERROR, msg);
    }
1892
    std::string str =
Y
yudong.cai 已提交
1893 1894 1895 1896
        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 已提交
1897
    CONFIG_CHECK(CheckGpuResourceConfigBuildIndexResources(res_vec));
1898
    value.clear();
Y
yudong.cai 已提交
1899
    for (std::string& res : res_vec) {
Y
yudong.cai 已提交
1900
        value.push_back(std::stoll(res.substr(3)));
Y
yudong.cai 已提交
1901
    }
1902
    return Status::OK();
Y
yudong.cai 已提交
1903
}
B
BossZou 已提交
1904

G
groot 已提交
1905
#endif
G
groot 已提交
1906

Z
Zhiru Zhu 已提交
1907 1908 1909 1910
/* tracing config */
Status
Config::GetTracingConfigJsonConfigPath(std::string& value) {
    value = GetConfigStr(CONFIG_TRACING, CONFIG_TRACING_JSON_CONFIG_PATH, "");
S
shengjh 已提交
1911
    fiu_do_on("get_config_json_config_path_fail", value = "error_config_json_path");
Z
Zhiru Zhu 已提交
1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922
    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();
}

1923 1924 1925 1926
/* wal config */
Status
Config::GetWalConfigEnable(bool& wal_enable) {
    std::string str = GetConfigStr(CONFIG_WAL, CONFIG_WAL_ENABLE, CONFIG_WAL_ENABLE_DEFAULT);
C
Cai Yudong 已提交
1927
    CONFIG_CHECK(CheckWalConfigEnable(str));
Y
Yhz 已提交
1928
    CONFIG_CHECK(StringHelpFunctions::ConvertToBoolean(str, wal_enable));
1929 1930 1931 1932 1933 1934 1935
    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 已提交
1936
    CONFIG_CHECK(CheckWalConfigRecoveryErrorIgnore(str));
Y
Yhz 已提交
1937
    CONFIG_CHECK(StringHelpFunctions::ConvertToBoolean(str, recovery_error_ignore));
1938 1939 1940 1941
    return Status::OK();
}

Status
C
Cai Yudong 已提交
1942
Config::GetWalConfigBufferSize(int64_t& buffer_size) {
1943
    std::string str = GetConfigStr(CONFIG_WAL, CONFIG_WAL_BUFFER_SIZE, CONFIG_WAL_BUFFER_SIZE_DEFAULT);
C
Cai Yudong 已提交
1944 1945
    CONFIG_CHECK(CheckWalConfigBufferSize(str));
    buffer_size = std::stoll(str);
1946 1947 1948 1949 1950
    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;
    }
1951 1952 1953 1954 1955
    return Status::OK();
}

Status
Config::GetWalConfigWalPath(std::string& wal_path) {
C
Cai Yudong 已提交
1956
    wal_path = GetConfigStr(CONFIG_WAL, CONFIG_WAL_WAL_PATH, CONFIG_WAL_WAL_PATH_DEFAULT);
J
Jin Hai 已提交
1957
    CONFIG_CHECK(CheckWalConfigWalPath(wal_path));
1958 1959 1960
    return Status::OK();
}

1961 1962 1963 1964 1965 1966
Status
Config::GetServerRestartRequired(bool& required) {
    required = restart_required_;
    return Status::OK();
}

Y
yudong.cai 已提交
1967 1968 1969
///////////////////////////////////////////////////////////////////////////////
/* server config */
Status
S
starlord 已提交
1970
Config::SetServerConfigAddress(const std::string& value) {
C
Cai Yudong 已提交
1971 1972
    CONFIG_CHECK(CheckServerConfigAddress(value));
    return SetConfigValueInMem(CONFIG_SERVER, CONFIG_SERVER_ADDRESS, value);
Y
yudong.cai 已提交
1973 1974 1975
}

Status
S
starlord 已提交
1976
Config::SetServerConfigPort(const std::string& value) {
C
Cai Yudong 已提交
1977 1978
    CONFIG_CHECK(CheckServerConfigPort(value));
    return SetConfigValueInMem(CONFIG_SERVER, CONFIG_SERVER_PORT, value);
Y
yudong.cai 已提交
1979 1980 1981
}

Status
S
starlord 已提交
1982
Config::SetServerConfigDeployMode(const std::string& value) {
C
Cai Yudong 已提交
1983 1984
    CONFIG_CHECK(CheckServerConfigDeployMode(value));
    return SetConfigValueInMem(CONFIG_SERVER, CONFIG_SERVER_DEPLOY_MODE, value);
Y
yudong.cai 已提交
1985 1986 1987
}

Status
S
starlord 已提交
1988
Config::SetServerConfigTimeZone(const std::string& value) {
C
Cai Yudong 已提交
1989 1990
    CONFIG_CHECK(CheckServerConfigTimeZone(value));
    return SetConfigValueInMem(CONFIG_SERVER, CONFIG_SERVER_TIME_ZONE, value);
Y
yudong.cai 已提交
1991 1992
}

1993 1994 1995 1996 1997 1998
Status
Config::SetServerConfigWebEnable(const std::string& value) {
    CONFIG_CHECK(CheckServerConfigWebEnable(value));
    return SetConfigValueInMem(CONFIG_SERVER, CONFIG_SERVER_WEB_ENABLE, value);
}

B
BossZou 已提交
1999 2000 2001 2002 2003 2004
Status
Config::SetServerConfigWebPort(const std::string& value) {
    CONFIG_CHECK(CheckServerConfigWebPort(value));
    return SetConfigValueInMem(CONFIG_SERVER, CONFIG_SERVER_WEB_PORT, value);
}

Y
yudong.cai 已提交
2005 2006
/* db config */
Status
S
starlord 已提交
2007
Config::SetDBConfigBackendUrl(const std::string& value) {
C
Cai Yudong 已提交
2008 2009
    CONFIG_CHECK(CheckDBConfigBackendUrl(value));
    return SetConfigValueInMem(CONFIG_DB, CONFIG_DB_BACKEND_URL, value);
Y
yudong.cai 已提交
2010 2011
}

2012
Status
2013 2014
Config::SetDBConfigPreloadCollection(const std::string& value) {
    CONFIG_CHECK(CheckDBConfigPreloadCollection(value));
2015
    std::string cor_value = value == "*" ? "\'*\'" : value;
G
groot 已提交
2016
    return SetConfigValueInMem(CONFIG_DB, CONFIG_DB_PRELOAD_COLLECTION, cor_value);
2017 2018
}

Y
yudong.cai 已提交
2019
Status
S
starlord 已提交
2020
Config::SetDBConfigArchiveDiskThreshold(const std::string& value) {
C
Cai Yudong 已提交
2021 2022
    CONFIG_CHECK(CheckDBConfigArchiveDiskThreshold(value));
    return SetConfigValueInMem(CONFIG_DB, CONFIG_DB_ARCHIVE_DISK_THRESHOLD, value);
Y
yudong.cai 已提交
2023 2024 2025
}

Status
S
starlord 已提交
2026
Config::SetDBConfigArchiveDaysThreshold(const std::string& value) {
C
Cai Yudong 已提交
2027 2028
    CONFIG_CHECK(CheckDBConfigArchiveDaysThreshold(value));
    return SetConfigValueInMem(CONFIG_DB, CONFIG_DB_ARCHIVE_DAYS_THRESHOLD, value);
Y
yudong.cai 已提交
2029 2030
}

2031 2032 2033 2034 2035 2036
Status
Config::SetDBConfigAutoFlushInterval(const std::string& value) {
    CONFIG_CHECK(CheckDBConfigAutoFlushInterval(value));
    return SetConfigValueInMem(CONFIG_DB, CONFIG_DB_AUTO_FLUSH_INTERVAL, value);
}

C
Cai Yudong 已提交
2037
/* storage config */
2038 2039 2040
Status
Config::SetStorageConfigPrimaryPath(const std::string& value) {
    CONFIG_CHECK(CheckStorageConfigPrimaryPath(value));
C
Cai Yudong 已提交
2041
    return SetConfigValueInMem(CONFIG_STORAGE, CONFIG_STORAGE_PRIMARY_PATH, value);
2042 2043 2044 2045 2046
}

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

C
Cai Yudong 已提交
2050
Status
2051 2052 2053
Config::SetStorageConfigS3Enable(const std::string& value) {
    CONFIG_CHECK(CheckStorageConfigS3Enable(value));
    return SetConfigValueInMem(CONFIG_STORAGE, CONFIG_STORAGE_S3_ENABLE, value);
C
Cai Yudong 已提交
2054 2055 2056
}

Status
2057 2058 2059
Config::SetStorageConfigS3Address(const std::string& value) {
    CONFIG_CHECK(CheckStorageConfigS3Address(value));
    return SetConfigValueInMem(CONFIG_STORAGE, CONFIG_STORAGE_S3_ADDRESS, value);
C
Cai Yudong 已提交
2060 2061 2062
}

Status
2063 2064 2065
Config::SetStorageConfigS3Port(const std::string& value) {
    CONFIG_CHECK(CheckStorageConfigS3Port(value));
    return SetConfigValueInMem(CONFIG_STORAGE, CONFIG_STORAGE_S3_PORT, value);
C
Cai Yudong 已提交
2066 2067 2068
}

Status
2069 2070 2071
Config::SetStorageConfigS3AccessKey(const std::string& value) {
    CONFIG_CHECK(CheckStorageConfigS3AccessKey(value));
    return SetConfigValueInMem(CONFIG_STORAGE, CONFIG_STORAGE_S3_ACCESS_KEY, value);
C
Cai Yudong 已提交
2072 2073 2074
}

Status
2075 2076 2077
Config::SetStorageConfigS3SecretKey(const std::string& value) {
    CONFIG_CHECK(CheckStorageConfigS3SecretKey(value));
    return SetConfigValueInMem(CONFIG_STORAGE, CONFIG_STORAGE_S3_SECRET_KEY, value);
C
Cai Yudong 已提交
2078 2079 2080
}

Status
2081 2082 2083
Config::SetStorageConfigS3Bucket(const std::string& value) {
    CONFIG_CHECK(CheckStorageConfigS3Bucket(value));
    return SetConfigValueInMem(CONFIG_STORAGE, CONFIG_STORAGE_S3_BUCKET, value);
Y
yudong.cai 已提交
2084 2085 2086 2087
}

/* metric config */
Status
S
starlord 已提交
2088
Config::SetMetricConfigEnableMonitor(const std::string& value) {
C
Cai Yudong 已提交
2089 2090
    CONFIG_CHECK(CheckMetricConfigEnableMonitor(value));
    return SetConfigValueInMem(CONFIG_METRIC, CONFIG_METRIC_ENABLE_MONITOR, value);
Y
yudong.cai 已提交
2091 2092 2093
}

Status
C
Cai Yudong 已提交
2094 2095 2096
Config::SetMetricConfigAddress(const std::string& value) {
    CONFIG_CHECK(CheckMetricConfigAddress(value));
    return SetConfigValueInMem(CONFIG_METRIC, CONFIG_METRIC_ADDRESS, value);
2097 2098
}

Y
yudong.cai 已提交
2099
Status
C
Cai Yudong 已提交
2100 2101 2102
Config::SetMetricConfigPort(const std::string& value) {
    CONFIG_CHECK(CheckMetricConfigPort(value));
    return SetConfigValueInMem(CONFIG_METRIC, CONFIG_METRIC_PORT, value);
Y
yudong.cai 已提交
2103 2104 2105 2106
}

/* cache config */
Status
S
starlord 已提交
2107
Config::SetCacheConfigCpuCacheCapacity(const std::string& value) {
C
Cai Yudong 已提交
2108
    CONFIG_CHECK(CheckCacheConfigCpuCacheCapacity(value));
C
Cai Yudong 已提交
2109
    CONFIG_CHECK(SetConfigValueInMem(CONFIG_CACHE, CONFIG_CACHE_CPU_CACHE_CAPACITY, value));
2110
    return ExecCallBacks(CONFIG_CACHE, CONFIG_CACHE_CPU_CACHE_CAPACITY, value);
Y
yudong.cai 已提交
2111 2112 2113
}

Status
S
starlord 已提交
2114
Config::SetCacheConfigCpuCacheThreshold(const std::string& value) {
C
Cai Yudong 已提交
2115 2116
    CONFIG_CHECK(CheckCacheConfigCpuCacheThreshold(value));
    return SetConfigValueInMem(CONFIG_CACHE, CONFIG_CACHE_CPU_CACHE_THRESHOLD, value);
Y
yudong.cai 已提交
2117 2118
}

2119 2120 2121
Status
Config::SetCacheConfigInsertBufferSize(const std::string& value) {
    CONFIG_CHECK(CheckCacheConfigInsertBufferSize(value));
C
Cai Yudong 已提交
2122
    CONFIG_CHECK(SetConfigValueInMem(CONFIG_CACHE, CONFIG_CACHE_INSERT_BUFFER_SIZE, value));
2123
    return ExecCallBacks(CONFIG_CACHE, CONFIG_CACHE_INSERT_BUFFER_SIZE, value);
2124 2125
}

Y
yudong.cai 已提交
2126
Status
S
starlord 已提交
2127
Config::SetCacheConfigCacheInsertData(const std::string& value) {
C
Cai Yudong 已提交
2128
    CONFIG_CHECK(CheckCacheConfigCacheInsertData(value));
C
Cai Yudong 已提交
2129
    CONFIG_CHECK(SetConfigValueInMem(CONFIG_CACHE, CONFIG_CACHE_CACHE_INSERT_DATA, value));
2130
    return ExecCallBacks(CONFIG_CACHE, CONFIG_CACHE_CACHE_INSERT_DATA, value);
Y
yudong.cai 已提交
2131 2132 2133 2134
}

/* engine config */
Status
S
starlord 已提交
2135
Config::SetEngineConfigUseBlasThreshold(const std::string& value) {
C
Cai Yudong 已提交
2136
    CONFIG_CHECK(CheckEngineConfigUseBlasThreshold(value));
C
Cai Yudong 已提交
2137
    CONFIG_CHECK(SetConfigValueInMem(CONFIG_ENGINE, CONFIG_ENGINE_USE_BLAS_THRESHOLD, value));
2138
    return ExecCallBacks(CONFIG_ENGINE, CONFIG_ENGINE_USE_BLAS_THRESHOLD, value);
Y
yudong.cai 已提交
2139 2140 2141
}

Status
S
starlord 已提交
2142
Config::SetEngineConfigOmpThreadNum(const std::string& value) {
C
Cai Yudong 已提交
2143 2144
    CONFIG_CHECK(CheckEngineConfigOmpThreadNum(value));
    return SetConfigValueInMem(CONFIG_ENGINE, CONFIG_ENGINE_OMP_THREAD_NUM, value);
Y
yudong.cai 已提交
2145 2146
}

C
Cai Yudong 已提交
2147 2148 2149 2150 2151 2152
Status
Config::SetEngineConfigUseAVX512(const std::string& value) {
    CONFIG_CHECK(CheckEngineConfigUseAVX512(value));
    return SetConfigValueInMem(CONFIG_ENGINE, CONFIG_ENGINE_USE_AVX512, value);
}

2153 2154 2155 2156 2157 2158 2159
/* tracing config */
Status
Config::SetTracingConfigJsonConfigPath(const std::string& value) {
    CONFIG_CHECK(CheckTracingConfigJsonConfigPath(value));
    return SetConfigValueInMem(CONFIG_TRACING, CONFIG_TRACING_JSON_CONFIG_PATH, value);
}

J
Jin Hai 已提交
2160 2161 2162 2163 2164 2165 2166 2167 2168 2169
/* wal config */
Status
Config::SetWalConfigEnable(const std::string& value) {
    CONFIG_CHECK(CheckWalConfigEnable(value));
    return SetConfigValueInMem(CONFIG_WAL, CONFIG_WAL_ENABLE, value);
}

Status
Config::SetWalConfigRecoveryErrorIgnore(const std::string& value) {
    CONFIG_CHECK(CheckWalConfigRecoveryErrorIgnore(value));
2170
    return SetConfigValueInMem(CONFIG_WAL, CONFIG_WAL_RECOVERY_ERROR_IGNORE, value);
J
Jin Hai 已提交
2171 2172 2173 2174 2175 2176 2177 2178 2179 2180 2181 2182 2183 2184
}

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

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

G
groot 已提交
2185
#ifdef MILVUS_GPU_VERSION
W
wxyu 已提交
2186
Status
2187
Config::SetEngineConfigGpuSearchThreshold(const std::string& value) {
C
Cai Yudong 已提交
2188
    CONFIG_CHECK(CheckEngineConfigGpuSearchThreshold(value));
C
Cai Yudong 已提交
2189
    CONFIG_CHECK(SetConfigValueInMem(CONFIG_ENGINE, CONFIG_ENGINE_GPU_SEARCH_THRESHOLD, value));
2190
    return ExecCallBacks(CONFIG_ENGINE, CONFIG_ENGINE_GPU_SEARCH_THRESHOLD, value);
W
wxyu 已提交
2191
}
C
Cai Yudong 已提交
2192
#endif
W
wxyu 已提交
2193

C
Cai Yudong 已提交
2194 2195
/* gpu resource config */
#ifdef MILVUS_GPU_VERSION
S
shengjh 已提交
2196

Y
yudong.cai 已提交
2197
Status
2198
Config::SetGpuResourceConfigEnable(const std::string& value) {
C
Cai Yudong 已提交
2199
    CONFIG_CHECK(CheckGpuResourceConfigEnable(value));
C
Cai Yudong 已提交
2200
    CONFIG_CHECK(SetConfigValueInMem(CONFIG_GPU_RESOURCE, CONFIG_GPU_RESOURCE_ENABLE, value));
2201
    return ExecCallBacks(CONFIG_GPU_RESOURCE, CONFIG_GPU_RESOURCE_ENABLE, value);
Z
Zhiru Zhu 已提交
2202 2203 2204
}

Status
Y
yudong.cai 已提交
2205
Config::SetGpuResourceConfigCacheCapacity(const std::string& value) {
C
Cai Yudong 已提交
2206
    CONFIG_CHECK(CheckGpuResourceConfigCacheCapacity(value));
C
Cai Yudong 已提交
2207
    CONFIG_CHECK(SetConfigValueInMem(CONFIG_GPU_RESOURCE, CONFIG_GPU_RESOURCE_CACHE_CAPACITY, value));
2208
    return ExecCallBacks(CONFIG_GPU_RESOURCE, CONFIG_GPU_RESOURCE_CACHE_CAPACITY, value);
Y
yudong.cai 已提交
2209
}
Z
Zhiru Zhu 已提交
2210

Y
yudong.cai 已提交
2211 2212
Status
Config::SetGpuResourceConfigCacheThreshold(const std::string& value) {
C
Cai Yudong 已提交
2213 2214
    CONFIG_CHECK(CheckGpuResourceConfigCacheThreshold(value));
    return SetConfigValueInMem(CONFIG_GPU_RESOURCE, CONFIG_GPU_RESOURCE_CACHE_THRESHOLD, value);
Y
yudong.cai 已提交
2215 2216
}

2217
Status
Y
yudong.cai 已提交
2218
Config::SetGpuResourceConfigSearchResources(const std::string& value) {
2219
    std::vector<std::string> res_vec;
Y
yudong.cai 已提交
2220
    server::StringHelpFunctions::SplitStringByDelimeter(value, CONFIG_GPU_RESOURCE_DELIMITER, res_vec);
C
Cai Yudong 已提交
2221
    CONFIG_CHECK(CheckGpuResourceConfigSearchResources(res_vec));
C
Cai Yudong 已提交
2222
    CONFIG_CHECK(SetConfigValueInMem(CONFIG_GPU_RESOURCE, CONFIG_GPU_RESOURCE_SEARCH_RESOURCES, value));
2223
    return ExecCallBacks(CONFIG_GPU_RESOURCE, CONFIG_GPU_RESOURCE_SEARCH_RESOURCES, value);
2224 2225
}

Y
yudong.cai 已提交
2226 2227 2228 2229
Status
Config::SetGpuResourceConfigBuildIndexResources(const std::string& value) {
    std::vector<std::string> res_vec;
    server::StringHelpFunctions::SplitStringByDelimeter(value, CONFIG_GPU_RESOURCE_DELIMITER, res_vec);
C
Cai Yudong 已提交
2230
    CONFIG_CHECK(CheckGpuResourceConfigBuildIndexResources(res_vec));
C
Cai Yudong 已提交
2231
    CONFIG_CHECK(SetConfigValueInMem(CONFIG_GPU_RESOURCE, CONFIG_GPU_RESOURCE_BUILD_INDEX_RESOURCES, value));
2232
    return ExecCallBacks(CONFIG_GPU_RESOURCE, CONFIG_GPU_RESOURCE_BUILD_INDEX_RESOURCES, value);
C
Cai Yudong 已提交
2233
}
S
shengjh 已提交
2234

G
groot 已提交
2235
#endif
2236

S
starlord 已提交
2237 2238
}  // namespace server
}  // namespace milvus