dmnCfg.c 7.4 KB
Newer Older
S
Shengliang Guan 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
/*
 * Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
 *
 * This program is free software: you can use, redistribute, and/or modify
 * it under the terms of the GNU Affero General Public License, version 3
 * or later ("AGPL"), as published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program. If not, see <http://www.gnu.org/licenses/>.
 */

#define _DEFAULT_SOURCE
#include "dmnInt.h"
S
config  
Shengliang Guan 已提交
18 19
#include "tlocale.h"
#include "ttimezone.h"
S
Shengliang Guan 已提交
20

S
Shengliang Guan 已提交
21 22 23 24 25 26 27
static int32_t dmnAddEpCfg(SConfig *pCfg) {
  char defaultFqdn[TSDB_FQDN_LEN] = {0};
  if (taosGetFqdn(defaultFqdn) != 0) {
    terrno = TAOS_SYSTEM_ERROR(errno);
    return -1;
  }
  if (cfgAddString(pCfg, "fqdn", defaultFqdn) != 0) return -1;
S
config  
Shengliang Guan 已提交
28

S
Shengliang Guan 已提交
29 30 31 32 33 34 35 36 37 38 39 40 41
  int32_t defaultServerPort = 6030;
  if (cfgAddInt32(pCfg, "serverPort", defaultServerPort, 1, 65056) != 0) return -1;

  char defaultFirstEp[TSDB_EP_LEN] = {0};
  char defaultSecondEp[TSDB_EP_LEN] = {0};
  snprintf(defaultFirstEp, TSDB_EP_LEN, "%s:%d", defaultFqdn, defaultServerPort);
  snprintf(defaultSecondEp, TSDB_EP_LEN, "%s:%d", defaultFqdn, defaultServerPort);
  if (cfgAddString(pCfg, "firstEp", defaultFirstEp) != 0) return -1;
  if (cfgAddString(pCfg, "secondEp", defaultSecondEp) != 0) return -1;

  return 0;
}

S
config  
Shengliang Guan 已提交
42 43 44 45 46 47 48 49 50 51 52 53 54 55
static int32_t dmnAddDirCfg(SConfig *pCfg) {
  if (cfgAddDir(pCfg, "dataDir", tsDataDir) != 0) return -1;
  if (cfgAddDir(pCfg, "tmpDir", tsTempDir) != 0) return -1;
  return 0;
}
static int32_t dmnCheckDirCfg(SConfig *pCfg) {
  SConfigItem *pItem = NULL;

  pItem = cfgGetItem(pCfg, "dataDir");
  if (tsDiskCfgNum <= 0) {
    taosAddDataDir(0, pItem->str, 0, 1);
    tsDiskCfgNum = 1;
    uTrace("dataDir:%s, level:0 primary:1 is configured by default", pItem->str);
  }
S
Shengliang Guan 已提交
56

S
config  
Shengliang Guan 已提交
57 58 59 60 61 62 63
  pItem = cfgGetItem(pCfg, "tmpDir");
  if (taosDirExist(pItem->str) != 0) {
    return -1;
  }

  return 0;
}
S
Shengliang Guan 已提交
64

S
config  
Shengliang Guan 已提交
65
static int32_t dmnAddVersionCfg(SConfig *pCfg) {
S
Shengliang Guan 已提交
66 67 68
  if (cfgAddString(pCfg, "buildinfo", buildinfo) != 0) return -1;
  if (cfgAddString(pCfg, "gitinfo", gitinfo) != 0) return -1;
  if (cfgAddString(pCfg, "version", version) != 0) return -1;
S
config  
Shengliang Guan 已提交
69 70 71 72 73 74 75 76
  return 0;
}

static int32_t dmnAddDnodeCfg(SConfig *pCfg) {
  if (dmnAddEpCfg(pCfg) != 0) return -1;
  if (dmnAddDirCfg(pCfg) != 0) return -1;
  if (dmnAddVersionCfg(pCfg) != 0) return -1;

S
Shengliang Guan 已提交
77 78 79 80 81 82 83 84 85 86 87 88 89
  if (cfgAddTimezone(pCfg, "timezone", "") != 0) return -1;
  if (cfgAddLocale(pCfg, "locale", "") != 0) return -1;
  if (cfgAddCharset(pCfg, "charset", "") != 0) return -1;
  if (cfgAddInt32(pCfg, "numOfCores", 1, 1, 100000) != 0) return -1;
  if (cfgAddInt32(pCfg, "numOfCommitThreads", 4, 1, 1000) != 0) return -1;
  if (cfgAddBool(pCfg, "telemetryReporting", 0) != 0) return -1;
  if (cfgAddBool(pCfg, "enableCoreFile", 0) != 0) return -1;
  if (cfgAddInt32(pCfg, "supportVnodes", 256, 0, 65536) != 0) return -1;
  if (cfgAddInt32(pCfg, "statusInterval", 1, 1, 30) != 0) return -1;
  if (cfgAddFloat(pCfg, "numOfThreadsPerCore", 1, 0, 10) != 0) return -1;
  if (cfgAddFloat(pCfg, "ratioOfQueryCores", 1, 0, 5) != 0) return -1;
  if (cfgAddInt32(pCfg, "maxShellConns", 50000, 10, 50000000) != 0) return -1;
  if (cfgAddInt32(pCfg, "shellActivityTimer", 3, 1, 120) != 0) return -1;
S
Shengliang Guan 已提交
90
  return 0;
S
Shengliang Guan 已提交
91 92
}

S
config  
Shengliang Guan 已提交
93
static int32_t dmnCheckCfg(SConfig *pCfg) {
S
Shengliang Guan 已提交
94 95
  bool enableCore = cfgGetItem(pCfg, "enableCoreFile")->bval;
  taosSetCoreDump(enableCore);
S
config  
Shengliang Guan 已提交
96

S
config  
Shengliang Guan 已提交
97 98 99 100 101 102 103 104
  if (dmnCheckDirCfg(pCfg) != 0) {
    return -1;
  }

  taosGetSystemInfo();

  tsSetTimeZone();
  tsSetLocale();
S
Shengliang Guan 已提交
105

S
config  
Shengliang Guan 已提交
106 107 108 109 110 111 112
  if (tsNumOfCores <= 0) {
    tsNumOfCores = 1;
  }

  if (tsQueryBufferSize >= 0) {
    tsQueryBufferSizeBytes = tsQueryBufferSize * 1048576UL;
  }
S
config  
Shengliang Guan 已提交
113

S
Shengliang Guan 已提交
114
  return 0;
S
config  
Shengliang Guan 已提交
115 116
}

S
Shengliang Guan 已提交
117
SConfig *dmnReadCfg(const char *cfgDir, const char *envFile, const char *apolloUrl) {
S
Shengliang Guan 已提交
118 119
  SConfig *pCfg = cfgInit();
  if (pCfg == NULL) return NULL;
S
config  
Shengliang Guan 已提交
120

S
Shengliang Guan 已提交
121
  if (dmnAddLogCfg(pCfg) != 0) {
S
Shengliang Guan 已提交
122
    uError("failed to add log cfg since %s", terrstr());
S
Shengliang Guan 已提交
123
    cfgCleanup(pCfg);
S
Shengliang Guan 已提交
124 125
    return NULL;
  }
S
config  
Shengliang Guan 已提交
126

S
Shengliang Guan 已提交
127
  if (dmnAddDnodeCfg(pCfg) != 0) {
S
Shengliang Guan 已提交
128
    uError("failed to init dnode cfg since %s", terrstr());
S
Shengliang Guan 已提交
129
    cfgCleanup(pCfg);
S
Shengliang Guan 已提交
130 131
    return NULL;
  }
S
config  
Shengliang Guan 已提交
132

S
Shengliang Guan 已提交
133
  if (dmnLoadCfg(pCfg, cfgDir, envFile, apolloUrl) != 0) {
S
Shengliang Guan 已提交
134
    uError("failed to load cfg since %s", terrstr());
S
Shengliang Guan 已提交
135
    cfgCleanup(pCfg);
S
Shengliang Guan 已提交
136 137
    return NULL;
  }
S
config  
Shengliang Guan 已提交
138

S
Shengliang Guan 已提交
139 140
  if (dmnCheckCfg(pCfg) != 0) {
    uError("failed to check cfg since %s", terrstr());
S
Shengliang Guan 已提交
141
    cfgCleanup(pCfg);
S
Shengliang Guan 已提交
142
    return NULL;
S
config  
Shengliang Guan 已提交
143 144
  }

S
Shengliang Guan 已提交
145
  cfgDumpCfg(pCfg);
S
Shengliang Guan 已提交
146
  return pCfg;
S
config  
Shengliang Guan 已提交
147 148
}

S
Shengliang Guan 已提交
149 150 151
void dmnDumpCfg(SConfig *pCfg) {
  printf("taos global config:\n");
  printf("==================================\n");
S
config  
Shengliang Guan 已提交
152

S
Shengliang Guan 已提交
153 154 155 156 157
  SConfigItem *pItem = cfgIterate(pCfg, NULL);
  while (pItem != NULL) {
    switch (pItem->dtype) {
      case CFG_DTYPE_BOOL:
        printf("cfg:%s, value:%u src:%s\n", pItem->name, pItem->bval, cfgStypeStr(pItem->stype));
S
config  
Shengliang Guan 已提交
158
        break;
S
Shengliang Guan 已提交
159 160
      case CFG_DTYPE_INT32:
        printf("cfg:%s, value:%d src:%s\n", pItem->name, pItem->i32, cfgStypeStr(pItem->stype));
S
config  
Shengliang Guan 已提交
161
        break;
S
Shengliang Guan 已提交
162 163
      case CFG_DTYPE_INT64:
        printf("cfg:%s, value:%" PRId64 " src:%s\n", pItem->name, pItem->i64, cfgStypeStr(pItem->stype));
S
config  
Shengliang Guan 已提交
164
        break;
S
Shengliang Guan 已提交
165 166
      case CFG_DTYPE_FLOAT:
        printf("cfg:%s, value:%f src:%s\n", pItem->name, pItem->fval, cfgStypeStr(pItem->stype));
S
config  
Shengliang Guan 已提交
167
        break;
S
Shengliang Guan 已提交
168 169 170 171 172 173 174
      case CFG_DTYPE_STRING:
      case CFG_DTYPE_IPSTR:
      case CFG_DTYPE_DIR:
      case CFG_DTYPE_LOCALE:
      case CFG_DTYPE_CHARSET:
      case CFG_DTYPE_TIMEZONE:
        printf("cfg:%s, value:%s src:%s\n", pItem->name, pItem->str, cfgStypeStr(pItem->stype));
S
config  
Shengliang Guan 已提交
175 176
        break;
    }
S
Shengliang Guan 已提交
177
    pItem = cfgIterate(pCfg, pItem);
S
config  
Shengliang Guan 已提交
178 179 180
  }
}

S
Shengliang Guan 已提交
181 182 183 184 185 186 187 188 189 190 191
SDnodeEnvCfg dmnGetEnvCfg(SConfig *pCfg) {
  SDnodeEnvCfg envCfg = {0};

  const char *vstr = cfgGetItem(pCfg, "version")->str;
  envCfg.sver = 30000000;
  tstrncpy(envCfg.buildinfo, cfgGetItem(pCfg, "buildinfo")->str, sizeof(envCfg.buildinfo));
  tstrncpy(envCfg.gitinfo, cfgGetItem(pCfg, "gitinfo")->str, sizeof(envCfg.gitinfo));
  tstrncpy(envCfg.timezone, cfgGetItem(pCfg, "timezone")->str, sizeof(envCfg.timezone));
  tstrncpy(envCfg.locale, cfgGetItem(pCfg, "locale")->str, sizeof(envCfg.locale));
  tstrncpy(envCfg.charset, cfgGetItem(pCfg, "charset")->str, sizeof(envCfg.charset));
  envCfg.numOfCores = cfgGetItem(pCfg, "numOfCores")->i32;
S
Shengliang Guan 已提交
192
  envCfg.numOfCommitThreads = (uint16_t)cfgGetItem(pCfg, "numOfCommitThreads")->i32;
S
Shengliang Guan 已提交
193 194 195
  envCfg.enableTelem = cfgGetItem(pCfg, "telemetryReporting")->bval;

  return envCfg;
S
config  
Shengliang Guan 已提交
196 197
}

S
Shengliang Guan 已提交
198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214
SDnodeObjCfg dmnGetObjCfg(SConfig *pCfg) {
  SDnodeObjCfg objCfg = {0};

  objCfg.numOfSupportVnodes = cfgGetItem(pCfg, "supportVnodes")->i32;
  objCfg.statusInterval = cfgGetItem(pCfg, "statusInterval")->i32;
  objCfg.numOfThreadsPerCore = cfgGetItem(pCfg, "numOfThreadsPerCore")->fval;
  objCfg.ratioOfQueryCores = cfgGetItem(pCfg, "ratioOfQueryCores")->fval;
  objCfg.maxShellConns = cfgGetItem(pCfg, "maxShellConns")->i32;
  objCfg.shellActivityTimer = cfgGetItem(pCfg, "shellActivityTimer")->i32;
  objCfg.serverPort = (uint16_t)cfgGetItem(pCfg, "serverPort")->i32;
  tstrncpy(objCfg.dataDir, cfgGetItem(pCfg, "dataDir")->str, sizeof(objCfg.dataDir));
  tstrncpy(objCfg.localEp, cfgGetItem(pCfg, "localEp")->str, sizeof(objCfg.localEp));
  tstrncpy(objCfg.localFqdn, cfgGetItem(pCfg, "localFqdn")->str, sizeof(objCfg.localFqdn, cfgGetItem));
  tstrncpy(objCfg.firstEp, cfgGetItem(pCfg, "firstEp")->str, sizeof(objCfg.firstEp));
  tstrncpy(objCfg.secondEp, cfgGetItem(pCfg, "secondEp")->str, sizeof(objCfg.firstEp));

  return objCfg;
S
Shengliang Guan 已提交
215
}