DBWrapper.cpp 4.2 KB
Newer Older
G
groot 已提交
1 2 3 4 5 6 7 8 9 10
/*******************************************************************************
 * Copyright 上海赜睿信息科技有限公司(Zilliz) - All Rights Reserved
 * Unauthorized copying of this file, via any medium is strictly prohibited.
 * Proprietary and confidential.
 ******************************************************************************/

#include "DBWrapper.h"
#include "ServerConfig.h"
#include "utils/CommonUtil.h"
#include "utils/Log.h"
S
starlord 已提交
11
#include "utils/StringHelpFunctions.h"
G
groot 已提交
12

13 14
#include <omp.h>

G
groot 已提交
15 16 17 18 19
namespace zilliz {
namespace milvus {
namespace server {

DBWrapper::DBWrapper() {
20
    //db config
G
groot 已提交
21
    zilliz::milvus::engine::Options opt;
S
starlord 已提交
22 23 24
    ConfigNode& db_config = ServerConfig::GetInstance().GetConfig(CONFIG_DB);
    opt.meta.backend_uri = db_config.GetValue(CONFIG_DB_URL);
    std::string db_path = db_config.GetValue(CONFIG_DB_PATH);
G
groot 已提交
25
    opt.meta.path = db_path + "/db";
S
starlord 已提交
26

S
starlord 已提交
27
    std::string db_slave_path = db_config.GetValue(CONFIG_DB_SLAVE_PATH);
S
starlord 已提交
28 29
    StringHelpFunctions::SplitStringByDelimeter(db_slave_path, ";", opt.meta.slave_paths);

S
starlord 已提交
30
    int64_t index_size = db_config.GetInt64Value(CONFIG_DB_INDEX_TRIGGER_SIZE);
G
groot 已提交
31 32 33
    if(index_size > 0) {//ensure larger than zero, unit is MB
        opt.index_trigger_size = (size_t)index_size * engine::ONE_MB;
    }
S
starlord 已提交
34
    int64_t insert_buffer_size = db_config.GetInt64Value(CONFIG_DB_INSERT_BUFFER_SIZE, 4);
35 36
    if (insert_buffer_size >= 1) {
        opt.insert_buffer_size = insert_buffer_size * engine::ONE_GB;
Z
zhiru 已提交
37
    }
38 39
    else {
        std::cout << "ERROR: insert_buffer_size should be at least 1 GB" << std::endl;
Z
zhiru 已提交
40 41
        kill(0, SIGUSR1);
    }
Z
update  
zhiru 已提交
42

43
    // cache config
S
starlord 已提交
44 45 46
    ConfigNode& cache_config = ServerConfig::GetInstance().GetConfig(CONFIG_CACHE);
    opt.insert_cache_immediately_ = cache_config.GetBoolValue(CONFIG_INSERT_CACHE_IMMEDIATELY, false);

Z
update  
zhiru 已提交
47
    ConfigNode& serverConfig = ServerConfig::GetInstance().GetConfig(CONFIG_SERVER);
Z
update  
zhiru 已提交
48 49 50 51 52 53 54 55 56 57 58
    std::string mode = serverConfig.GetValue(CONFIG_CLUSTER_MODE, "single");
    if (mode == "single") {
        opt.mode = zilliz::milvus::engine::Options::MODE::SINGLE;
    }
    else if (mode == "cluster") {
        opt.mode = zilliz::milvus::engine::Options::MODE::CLUSTER;
    }
    else if (mode == "read_only") {
        opt.mode = zilliz::milvus::engine::Options::MODE::READ_ONLY;
    }
    else {
Z
update  
zhiru 已提交
59 60 61
        std::cout << "ERROR: mode specified in server_config is not one of ['single', 'cluster', 'read_only']" << std::endl;
        kill(0, SIGUSR1);
    }
Z
update  
zhiru 已提交
62

63 64 65 66 67 68 69 70 71 72
    // engine config
    ConfigNode& engine_config = ServerConfig::GetInstance().GetConfig(CONFIG_ENGINE);
    float omp_thread_rate = engine_config.GetFloatValue(CONFIG_OMP_THREAD_RATE, 0.75);
    uint32_t cpu_count = 1;
    CommonUtil::GetSystemAvailableThreads(cpu_count);
    float thread_count = omp_thread_rate*(float)cpu_count;
    int32_t omp_thread = (int32_t)round(thread_count);
    omp_set_num_threads(omp_thread);
    SERVER_LOG_DEBUG << "Openmp thread number = " << omp_thread;

G
groot 已提交
73 74
    //set archive config
    engine::ArchiveConf::CriteriaT criterial;
S
starlord 已提交
75 76
    int64_t disk = db_config.GetInt64Value(CONFIG_DB_ARCHIVE_DISK, 0);
    int64_t days = db_config.GetInt64Value(CONFIG_DB_ARCHIVE_DAYS, 0);
G
groot 已提交
77 78 79 80 81 82 83 84 85
    if(disk > 0) {
        criterial[engine::ARCHIVE_CONF_DISK] = disk;
    }
    if(days > 0) {
        criterial[engine::ARCHIVE_CONF_DAYS] = days;
    }
    opt.meta.archive_conf.SetCriterias(criterial);

    //create db root folder
G
groot 已提交
86 87 88 89 90
    ServerError err = CommonUtil::CreateDirectory(opt.meta.path);
    if(err != SERVER_SUCCESS) {
        std::cout << "ERROR! Failed to create database root path: " << opt.meta.path << std::endl;
        kill(0, SIGUSR1);
    }
G
groot 已提交
91

S
starlord 已提交
92 93 94 95 96 97 98 99
    for(auto& path : opt.meta.slave_paths) {
        err = CommonUtil::CreateDirectory(path);
        if(err != SERVER_SUCCESS) {
            std::cout << "ERROR! Failed to create database slave path: " << path << std::endl;
            kill(0, SIGUSR1);
        }
    }

G
groot 已提交
100 101 102 103 104 105 106
    std::string msg = opt.meta.path;
    try {
        zilliz::milvus::engine::DB::Open(opt, &db_);
    } catch(std::exception& ex) {
        msg = ex.what();
    }

G
groot 已提交
107
    if(db_ == nullptr) {
G
groot 已提交
108
        std::cout << "ERROR! Failed to open database: " << msg << std::endl;
G
groot 已提交
109
        kill(0, SIGUSR1);
G
groot 已提交
110 111 112 113 114 115 116 117 118 119
    }
}

DBWrapper::~DBWrapper() {
    delete db_;
}

}
}
}