tglobal.c 22.2 KB
Newer Older
S
slguan 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
/*
 * 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
S
common  
Shengliang Guan 已提交
17
#include "tglobal.h"
S
Shengliang Guan 已提交
18
#include "tcompare.h"
S
Shengliang Guan 已提交
19
#include "tconfig.h"
S
Shengliang Guan 已提交
20 21
#include "tep.h"
#include "tlog.h"
S
slguan 已提交
22

S
config  
Shengliang Guan 已提交
23 24
SConfig *tsCfg = NULL;

S
Shengliang Guan 已提交
25
// cluster
S
Shengliang Guan 已提交
26 27 28 29 30 31 32 33
char     tsFirst[TSDB_EP_LEN] = {0};
char     tsSecond[TSDB_EP_LEN] = {0};
char     tsLocalFqdn[TSDB_FQDN_LEN] = {0};
char     tsLocalEp[TSDB_EP_LEN] = {0};  // Local End Point, hostname:port
uint16_t tsServerPort = 6030;
int32_t  tsVersion = 30000000;
int32_t  tsStatusInterval = 1;  // second
bool     tsEnableTelemetryReporting = 0;
H
Hui Li 已提交
34

S
Shengliang Guan 已提交
35
// common
S
Shengliang Guan 已提交
36 37 38 39 40 41 42 43 44
int32_t tsRpcTimer = 300;
int32_t tsRpcMaxTime = 600;  // seconds;
bool    tsRpcForceTcp = 1;   // disable this, means query, show command use udp protocol as default
int32_t tsMaxShellConns = 50000;
int32_t tsMaxConnections = 50000;
int32_t tsShellActivityTimer = 3;  // second
float   tsNumOfThreadsPerCore = 1.0f;
int32_t tsNumOfCommitThreads = 4;
float   tsRatioOfQueryCores = 1.0f;
S
Shengliang Guan 已提交
45
int32_t tsMaxBinaryDisplayWidth = 30;
S
Shengliang Guan 已提交
46 47 48
bool    tsEnableSlaveQuery = 1;
bool    tsPrintAuth = 0;

S
Shengliang Guan 已提交
49 50 51 52 53 54 55 56
/*
 * denote if the server needs to compress response message at the application layer to client, including query rsp,
 * metricmeta rsp, and multi-meter query rsp message body. The client compress the submit message to server.
 *
 * 0: all data are compressed
 * -1: all data are not compressed
 * other values: if the message payload size is greater than the tsCompressMsgSize, the message will be compressed.
 */
D
dapan1121 已提交
57
int32_t tsCompressMsgSize = -1;
S
Shengliang Guan 已提交
58

59
/* denote if server needs to compress the retrieved column data before adding to the rpc response message body.
60 61
 * 0: all data are compressed
 * -1: all data are not compressed
62
 * other values: if any retrieved column size is greater than the tsCompressColData, all data will be compressed.
63
 */
64
int32_t tsCompressColData = -1;
65

66 67 68 69 70
/*
 * denote if 3.0 query pattern compatible for 2.0
 */
int32_t tsCompatibleModel = 1;

S
Shengliang Guan 已提交
71
// client
72
int32_t tsMaxWildCardsLen = TSDB_PATTERN_STRING_DEFAULT_LEN;
73 74
int32_t tsMaxRegexStringLen = TSDB_REGEX_STRING_DEFAULT_LEN;

S
Shengliang Guan 已提交
75 76 77 78 79 80 81
// the maximum number of results for projection query on super table that are returned from
// one virtual node, to order according to timestamp
int32_t tsMaxNumOfOrderedResults = 100000;

// 10 ms for sliding time, the value will changed in case of time precision changed
int32_t tsMinSlidingTime = 10;

82
// the maxinum number of distict query result
S
Shengliang Guan 已提交
83
int32_t tsMaxNumOfDistinctResults = 1000 * 10000;
84

85 86
// 1 us for interval time range, changed accordingly
int32_t tsMinIntervalTime = 1;
S
Shengliang Guan 已提交
87 88 89 90 91 92 93 94

// 20sec, the maximum value of stream computing delay, changed accordingly
int32_t tsMaxStreamComputDelay = 20000;

// 10sec, the first stream computing delay time after system launched successfully, changed accordingly
int32_t tsStreamCompStartDelay = 10000;

// the stream computing delay time after executing failed, change accordingly
S
Shengliang Guan 已提交
95
int32_t tsRetryStreamCompDelay = 10 * 1000;
S
Shengliang Guan 已提交
96 97

// The delayed computing ration. 10% of the whole computing time window by default.
98
float tsStreamComputDelayRatio = 0.1f;
S
Shengliang Guan 已提交
99 100 101 102

int32_t tsProjectExecInterval = 10000;   // every 10sec, the projection will be executed once
int64_t tsMaxRetentWindow = 24 * 3600L;  // maximum time window tolerance

H
Haojun Liao 已提交
103 104 105 106 107
// the maximum allowed query buffer size during query processing for each data node.
// -1 no limit (default)
// 0  no query allowed, queries are disabled
// positive value (in MB)
int32_t tsQueryBufferSize = -1;
108
int64_t tsQueryBufferSizeBytes = -1;
H
Haojun Liao 已提交
109

H
Haojun Liao 已提交
110
// in retrieve blocking model, the retrieve threads will wait for the completion of the query processing.
S
Shengliang Guan 已提交
111
bool tsRetrieveBlockingModel = 0;
112

113
// last_row(*), first(*), last_row(ts, col1, col2) query, the result fields will be the original column name
S
Shengliang Guan 已提交
114
bool tsKeepOriginalColumnName = 0;
S
Shengliang Guan 已提交
115 116

// long query death-lock
S
Shengliang Guan 已提交
117
bool tsDeadLockKillQuery = 0;
118

S
Shengliang Guan 已提交
119
// tsdb config
Y
yihaoDeng 已提交
120 121 122
// For backward compatibility
bool tsdbForceKeepFile = false;

S
Shengliang Guan 已提交
123 124 125
int32_t  tsDiskCfgNum = 0;
SDiskCfg tsDiskCfg[TFS_MAX_DISKS] = {0};

S
Shengliang Guan 已提交
126 127 128 129 130 131
/*
 * minimum scale for whole system, millisecond by default
 * for TSDB_TIME_PRECISION_MILLI: 86400000L
 *     TSDB_TIME_PRECISION_MICRO: 86400000000L
 *     TSDB_TIME_PRECISION_NANO:  86400000000000L
 */
132
int64_t tsTickPerDay[] = {86400000L, 86400000000L, 86400000000000L};
S
Shengliang Guan 已提交
133

S
Shengliang Guan 已提交
134 135 136 137 138 139 140 141 142
// lossy compress 6
char tsLossyColumns[32] = "";  // "float|double" means all float and double columns can be lossy compressed.  set empty
                               // can close lossy compress.
// below option can take effect when tsLossyColumns not empty
double   tsFPrecision = 1E-8;                   // float column precision
double   tsDPrecision = 1E-16;                  // double column precision
uint32_t tsMaxRange = 500;                      // max range
uint32_t tsCurRange = 100;                      // range
char     tsCompressor[32] = "ZSTD_COMPRESSOR";  // ZSTD_COMPRESSOR or GZIP_COMPRESSOR
143

S
config  
Shengliang Guan 已提交
144
static void taosAddDataDir(int32_t index, char *v1, int32_t level, int32_t primary) {
S
Shengliang Guan 已提交
145 146 147 148 149
  tstrncpy(tsDiskCfg[index].dir, v1, TSDB_FILENAME_LEN);
  tsDiskCfg[index].level = level;
  tsDiskCfg[index].primary = primary;
  uTrace("dataDir:%s, level:%d primary:%d is configured", v1, level, primary);
}
S
Shengliang Guan 已提交
150

S
Shengliang Guan 已提交
151 152 153 154 155 156 157 158 159 160 161 162 163 164
static void taosSetTfsCfg(SConfig *pCfg) {
  SConfigItem *pItem = cfgGetItem(pCfg, "dataDir");
  if (pItem == NULL) return;

  int32_t size = taosArrayGetSize(pItem->array);
  if (size <= 0) {
    tsDiskCfgNum = 1;
    taosAddDataDir(0, pItem->str, 0, 1);
  } else {
    tsDiskCfgNum = size < TFS_MAX_DISKS ? size : TFS_MAX_DISKS;
    for (int32_t index = 0; index < tsDiskCfgNum; ++index) {
      SDiskCfg *pCfg = taosArrayGet(pItem->array, index);
      memcpy(&tsDiskCfg[index], pCfg, sizeof(SDiskCfg));
    }
S
Shengliang Guan 已提交
165 166
  }
}
S
config  
Shengliang Guan 已提交
167

S
Shengliang Guan 已提交
168 169 170 171
struct SConfig *taosGetCfg() {
  return tsCfg;
}

S
Shengliang Guan 已提交
172 173 174
static int32_t taosLoadCfg(SConfig *pCfg, const char *inputCfgDir, const char *envFile, const char *apolloUrl) {
  char cfgDir[PATH_MAX] = {0};
  char cfgFile[PATH_MAX + 100] = {0};
S
TD-1767  
Shengliang Guan 已提交
175

S
Shengliang Guan 已提交
176 177
  taosExpandDir(inputCfgDir, cfgDir, PATH_MAX);
  snprintf(cfgFile, sizeof(cfgFile), "%s" TD_DIRSEP "taos.cfg", cfgDir);
S
config  
Shengliang Guan 已提交
178

S
Shengliang Guan 已提交
179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201
  if (cfgLoad(pCfg, CFG_STYPE_APOLLO_URL, apolloUrl) != 0) {
    uError("failed to load from apollo url:%s since %s\n", apolloUrl, terrstr());
    return -1;
  }

  if (cfgLoad(pCfg, CFG_STYPE_CFG_FILE, cfgFile) != 0) {
    if (cfgLoad(pCfg, CFG_STYPE_CFG_FILE, cfgDir) != 0) {
      uError("failed to load from config file:%s since %s\n", cfgFile, terrstr());
      return -1;
    }
  }

  if (cfgLoad(pCfg, CFG_STYPE_ENV_FILE, envFile) != 0) {
    uError("failed to load from env file:%s since %s\n", envFile, terrstr());
    return -1;
  }

  if (cfgLoad(pCfg, CFG_STYPE_ENV_VAR, NULL) != 0) {
    uError("failed to load from global env variables since %s\n", terrstr());
    return -1;
  }

  return 0;
S
slguan 已提交
202 203
}

S
Shengliang Guan 已提交
204
static int32_t taosAddClientLogCfg(SConfig *pCfg) {
S
Shengliang Guan 已提交
205 206
  if (cfgAddDir(pCfg, "configDir", configDir, 1) != 0) return -1;
  if (cfgAddDir(pCfg, "scriptDir", configDir, 1) != 0) return -1;
S
Shengliang Guan 已提交
207 208 209 210 211 212 213 214 215 216 217 218 219
  if (cfgAddDir(pCfg, "logDir", tsLogDir, 1) != 0) return -1;
  if (cfgAddFloat(pCfg, "minimalLogDirGB", 1.0f, 0.001f, 10000000, 1) != 0) return -1;
  if (cfgAddInt32(pCfg, "numOfLogLines", tsNumOfLogLines, 1000, 2000000000, 1) != 0) return -1;
  if (cfgAddBool(pCfg, "asyncLog", tsAsyncLog, 1) != 0) return -1;
  if (cfgAddInt32(pCfg, "logKeepDays", 0, -365000, 365000, 1) != 0) return -1;
  if (cfgAddInt32(pCfg, "cDebugFlag", cDebugFlag, 0, 255, 1) != 0) return -1;
  if (cfgAddInt32(pCfg, "uDebugFlag", uDebugFlag, 0, 255, 1) != 0) return -1;
  if (cfgAddInt32(pCfg, "rpcDebugFlag", rpcDebugFlag, 0, 255, 1) != 0) return -1;
  if (cfgAddInt32(pCfg, "tmrDebugFlag", tmrDebugFlag, 0, 255, 1) != 0) return -1;
  if (cfgAddInt32(pCfg, "jniDebugFlag", jniDebugFlag, 0, 255, 1) != 0) return -1;
  if (cfgAddInt32(pCfg, "simDebugFlag", 143, 0, 255, 1) != 0) return -1;
  if (cfgAddInt32(pCfg, "debugFlag", 0, 0, 255, 1) != 0) return -1;
  return 0;
S
Shengliang Guan 已提交
220 221
}

S
Shengliang Guan 已提交
222 223 224 225 226 227 228 229 230 231 232
static int32_t taosAddServerLogCfg(SConfig *pCfg) {
  if (cfgAddInt32(pCfg, "dDebugFlag", dDebugFlag, 0, 255, 0) != 0) return -1;
  if (cfgAddInt32(pCfg, "vDebugFlag", vDebugFlag, 0, 255, 0) != 0) return -1;
  if (cfgAddInt32(pCfg, "mDebugFlag", mDebugFlag, 0, 255, 0) != 0) return -1;
  if (cfgAddInt32(pCfg, "qDebugFlag", qDebugFlag, 0, 255, 0) != 0) return -1;
  if (cfgAddInt32(pCfg, "wDebugFlag", wDebugFlag, 0, 255, 0) != 0) return -1;
  if (cfgAddInt32(pCfg, "sDebugFlag", sDebugFlag, 0, 255, 0) != 0) return -1;
  if (cfgAddInt32(pCfg, "tsdbDebugFlag", tsdbDebugFlag, 0, 255, 0) != 0) return -1;
  if (cfgAddInt32(pCfg, "tqDebugFlag", tqDebugFlag, 0, 255, 0) != 0) return -1;
  if (cfgAddInt32(pCfg, "fsDebugFlag", fsDebugFlag, 0, 255, 0) != 0) return -1;
  return 0;
S
Shengliang Guan 已提交
233 234
}

S
Shengliang Guan 已提交
235
static int32_t taosAddClientCfg(SConfig *pCfg) {
S
Shengliang Guan 已提交
236 237 238 239
  char    defaultFqdn[TSDB_FQDN_LEN] = {0};
  int32_t defaultServerPort = 6030;
  char    defaultFirstEp[TSDB_EP_LEN] = {0};
  char    defaultSecondEp[TSDB_EP_LEN] = {0};
S
Shengliang Guan 已提交
240 241

  if (taosGetFqdn(defaultFqdn) != 0) return -1;
S
Shengliang Guan 已提交
242 243 244
  snprintf(defaultFirstEp, TSDB_EP_LEN, "%s:%d", defaultFqdn, defaultServerPort);
  snprintf(defaultSecondEp, TSDB_EP_LEN, "%s:%d", defaultFqdn, defaultServerPort);

S
Shengliang Guan 已提交
245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265
  if (cfgAddString(pCfg, "firstEp", defaultFirstEp, 1) != 0) return -1;
  if (cfgAddString(pCfg, "secondEp", defaultSecondEp, 1) != 0) return -1;
  if (cfgAddString(pCfg, "fqdn", defaultFqdn, 1) != 0) return -1;
  if (cfgAddInt32(pCfg, "serverPort", defaultServerPort, 1, 65056, 1) != 0) return -1;
  if (cfgAddDir(pCfg, "tempDir", tsTempDir, 1) != 0) return -1;
  if (cfgAddFloat(pCfg, "minimalTempDirGB", 1.0f, 0.001f, 10000000, 1) != 0) return -1;
  if (cfgAddFloat(pCfg, "numOfThreadsPerCore", tsNumOfThreadsPerCore, 0, 10, 1) != 0) return -1;
  if (cfgAddInt32(pCfg, "maxTmrCtrl", tsMaxTmrCtrl, 8, 2048, 1) != 0) return -1;
  if (cfgAddInt32(pCfg, "rpcTimer", tsRpcTimer, 100, 3000, 1) != 0) return -1;
  if (cfgAddInt32(pCfg, "rpcMaxTime", tsRpcMaxTime, 100, 7200, 1) != 0) return -1;
  if (cfgAddBool(pCfg, "rpcForceTcp", tsRpcForceTcp, 1) != 0) return -1;
  if (cfgAddInt32(pCfg, "shellActivityTimer", tsShellActivityTimer, 1, 120, 1) != 0) return -1;
  if (cfgAddInt32(pCfg, "compressMsgSize", tsCompressMsgSize, -1, 100000000, 1) != 0) return -1;
  if (cfgAddInt32(pCfg, "compressColData", tsCompressColData, -1, 100000000, 1) != 0) return -1;
  if (cfgAddInt32(pCfg, "maxWildCardsLength", tsMaxWildCardsLen, 0, TSDB_MAX_FIELD_LEN, 1) != 0) return -1;
  if (cfgAddInt32(pCfg, "maxRegexStringLen", tsMaxRegexStringLen, 0, TSDB_MAX_FIELD_LEN, 1) != 0) return -1;
  if (cfgAddInt32(pCfg, "maxNumOfOrderedRes", tsMaxNumOfOrderedResults, 128, TSDB_MAX_ALLOWED_SQL_LEN, 1) != 0)
    return -1;
  if (cfgAddBool(pCfg, "keepColumnName", tsKeepOriginalColumnName, 1) != 0) return -1;
  if (cfgAddInt32(pCfg, "maxBinaryDisplayWidth", tsMaxBinaryDisplayWidth, 1, 65536, 1) != 0) return -1;
  return 0;
S
os  
Shengliang Guan 已提交
266 267
}

S
Shengliang Guan 已提交
268
static int32_t taosAddSystemCfg(SConfig *pCfg) {
S
os  
Shengliang Guan 已提交
269 270
  SysNameInfo info = taosGetSysNameInfo();

S
Shengliang Guan 已提交
271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292
  if (cfgAddTimezone(pCfg, "timezone", tsTimezone) != 0) return -1;
  if (cfgAddLocale(pCfg, "locale", tsLocale) != 0) return -1;
  if (cfgAddCharset(pCfg, "charset", tsCharset) != 0) return -1;
  if (cfgAddBool(pCfg, "enableCoreFile", 0, 1) != 0) return -1;
  if (cfgAddInt32(pCfg, "numOfCores", tsNumOfCores, 1, 100000, 1) != 0) return -1;
  if (cfgAddInt32(pCfg, "pageSize(KB)", tsPageSize, 0, INT64_MAX, 1) != 0) return -1;
  if (cfgAddInt64(pCfg, "openMax", tsOpenMax, 0, INT64_MAX, 1) != 0) return -1;
  if (cfgAddInt64(pCfg, "streamMax", tsStreamMax, 0, INT64_MAX, 1) != 0) return -1;
  if (cfgAddInt32(pCfg, "totalMemory(MB)", tsTotalMemoryMB, 0, INT32_MAX, 1) != 0) return -1;
  if (cfgAddString(pCfg, "os sysname", info.sysname, 1) != 0) return -1;
  if (cfgAddString(pCfg, "os nodename", info.nodename, 1) != 0) return -1;
  if (cfgAddString(pCfg, "os release", info.release, 1) != 0) return -1;
  if (cfgAddString(pCfg, "os version", info.version, 1) != 0) return -1;
  if (cfgAddString(pCfg, "os machine", info.machine, 1) != 0) return -1;
  if (cfgAddString(pCfg, "os sysname", info.sysname, 1) != 0) return -1;

  if (cfgAddString(pCfg, "version", version, 1) != 0) return -1;
  if (cfgAddString(pCfg, "compatible_version", compatible_version, 1) != 0) return -1;
  if (cfgAddString(pCfg, "gitinfo", gitinfo, 1) != 0) return -1;
  if (cfgAddString(pCfg, "gitinfoOfInternal", gitinfoOfInternal, 1) != 0) return -1;
  if (cfgAddString(pCfg, "buildinfo", buildinfo, 1) != 0) return -1;
  return 0;
S
Shengliang Guan 已提交
293 294
}

S
Shengliang Guan 已提交
295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317
static int32_t taosAddServerCfg(SConfig *pCfg) {
  if (cfgAddInt32(pCfg, "supportVnodes", 256, 0, 65536, 0) != 0) return -1;
  if (cfgAddDir(pCfg, "dataDir", tsDataDir, 0) != 0) return -1;
  if (cfgAddFloat(pCfg, "minimalDataDirGB", 2.0f, 0.001f, 10000000, 0) != 0) return -1;
  if (cfgAddInt32(pCfg, "numOfCommitThreads", tsNumOfCommitThreads, 1, 100, 0) != 0) return -1;
  if (cfgAddFloat(pCfg, "ratioOfQueryCores", tsRatioOfQueryCores, 0, 2, 0) != 0) return -1;
  if (cfgAddInt32(pCfg, "maxNumOfDistinctRes", tsMaxNumOfDistinctResults, 10 * 10000, 10000 * 10000, 0) != 0) return -1;
  if (cfgAddBool(pCfg, "telemetryReporting", tsEnableTelemetryReporting, 0) != 0) return -1;
  if (cfgAddInt32(pCfg, "maxConnections", tsMaxConnections, 1, 100000, 0) != 0) return -1;
  if (cfgAddInt32(pCfg, "maxShellConns", tsMaxShellConns, 10, 50000000, 0) != 0) return -1;
  if (cfgAddInt32(pCfg, "statusInterval", tsStatusInterval, 1, 30, 0) != 0) return -1;
  if (cfgAddInt32(pCfg, "minSlidingTime", tsMinSlidingTime, 10, 1000000, 0) != 0) return -1;
  if (cfgAddInt32(pCfg, "minIntervalTime", tsMinIntervalTime, 1, 1000000, 0) != 0) return -1;
  if (cfgAddInt32(pCfg, "maxStreamCompDelay", tsMaxStreamComputDelay, 10, 1000000000, 0) != 0) return -1;
  if (cfgAddInt32(pCfg, "maxFirstStreamCompDelay", tsStreamCompStartDelay, 1000, 1000000000, 0) != 0) return -1;
  if (cfgAddInt32(pCfg, "retryStreamCompDelay", tsRetryStreamCompDelay, 10, 1000000000, 0) != 0) return -1;
  if (cfgAddFloat(pCfg, "streamCompDelayRatio", tsStreamComputDelayRatio, 0.1, 0.9, 0) != 0) return -1;
  if (cfgAddInt32(pCfg, "queryBufferSize", tsQueryBufferSize, -1, 500000000000, 0) != 0) return -1;
  if (cfgAddBool(pCfg, "retrieveBlockingModel", tsRetrieveBlockingModel, 0) != 0) return -1;
  if (cfgAddBool(pCfg, "printAuth", tsPrintAuth, 0) != 0) return -1;
  if (cfgAddBool(pCfg, "slaveQuery", tsEnableSlaveQuery, 0) != 0) return -1;
  if (cfgAddBool(pCfg, "deadLockKillQuery", tsDeadLockKillQuery, 0) != 0) return -1;
  return 0;
S
Shengliang Guan 已提交
318 319 320
}

static void taosSetClientLogCfg(SConfig *pCfg) {
S
Shengliang Guan 已提交
321
  SConfigItem *pItem = cfgGetItem(pCfg, "logDir");
S
os env  
Shengliang Guan 已提交
322
  tstrncpy(tsLogDir, cfgGetItem(pCfg, "logDir")->str, PATH_MAX);
S
Shengliang Guan 已提交
323
  taosExpandDir(tsLogDir, tsLogDir, PATH_MAX);
S
os env  
Shengliang Guan 已提交
324
  tsLogSpace.reserved = cfgGetItem(pCfg, "minimalLogDirGB")->fval;
S
Shengliang Guan 已提交
325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347
  tsNumOfLogLines = cfgGetItem(pCfg, "numOfLogLines")->i32;
  tsAsyncLog = cfgGetItem(pCfg, "asyncLog")->bval;
  tsLogKeepDays = cfgGetItem(pCfg, "logKeepDays")->i32;
  cDebugFlag = cfgGetItem(pCfg, "cDebugFlag")->i32;
  uDebugFlag = cfgGetItem(pCfg, "uDebugFlag")->i32;
  rpcDebugFlag = cfgGetItem(pCfg, "rpcDebugFlag")->i32;
  tmrDebugFlag = cfgGetItem(pCfg, "tmrDebugFlag")->i32;
  jniDebugFlag = cfgGetItem(pCfg, "jniDebugFlag")->i32;
}

static void taosSetServerLogCfg(SConfig *pCfg) {
  dDebugFlag = cfgGetItem(pCfg, "dDebugFlag")->i32;
  vDebugFlag = cfgGetItem(pCfg, "vDebugFlag")->i32;
  mDebugFlag = cfgGetItem(pCfg, "mDebugFlag")->i32;
  qDebugFlag = cfgGetItem(pCfg, "qDebugFlag")->i32;
  wDebugFlag = cfgGetItem(pCfg, "wDebugFlag")->i32;
  sDebugFlag = cfgGetItem(pCfg, "sDebugFlag")->i32;
  tsdbDebugFlag = cfgGetItem(pCfg, "tsdbDebugFlag")->i32;
  tqDebugFlag = cfgGetItem(pCfg, "tqDebugFlag")->i32;
  fsDebugFlag = cfgGetItem(pCfg, "fsDebugFlag")->i32;
}

static void taosSetClientCfg(SConfig *pCfg) {
S
Shengliang Guan 已提交
348 349 350
  tstrncpy(tsLocalFqdn, cfgGetItem(pCfg, "fqdn")->str, TSDB_EP_LEN);
  tsServerPort = (uint16_t)cfgGetItem(pCfg, "serverPort")->i32;
  snprintf(tsLocalEp, sizeof(tsLocalEp), "%s:%u", tsLocalFqdn, tsServerPort);
351 352 353 354 355 356 357 358 359 360 361 362 363

  SConfigItem *pFirstEpItem = cfgGetItem(pCfg, "firstEp");
  SEp          firstEp = {0};
  taosGetFqdnPortFromEp(pFirstEpItem->str, &firstEp);
  snprintf(tsFirst, sizeof(tsFirst), "%s:%u", firstEp.fqdn, firstEp.port);
  cfgSetItem(pCfg, "firstEp", tsFirst, pFirstEpItem->stype);

  SConfigItem *pSecondpItem = cfgGetItem(pCfg, "secondEp");
  SEp          secondEp = {0};
  taosGetFqdnPortFromEp(pSecondpItem->str, &secondEp);
  snprintf(tsSecond, sizeof(tsSecond), "%s:%u", secondEp.fqdn, secondEp.port);
  cfgSetItem(pCfg, "secondEp", tsSecond, pSecondpItem->stype);

S
os env  
Shengliang Guan 已提交
364
  tstrncpy(tsLogDir, cfgGetItem(pCfg, "tempDir")->str, PATH_MAX);
S
Shengliang Guan 已提交
365
  taosExpandDir(tsLogDir, tsLogDir, PATH_MAX);
S
os env  
Shengliang Guan 已提交
366
  tsTempSpace.reserved = cfgGetItem(pCfg, "minimalTempDirGB")->fval;
S
Shengliang Guan 已提交
367 368 369 370 371 372 373 374 375 376 377 378 379 380

  tsNumOfThreadsPerCore = cfgGetItem(pCfg, "maxTmrCtrl")->fval;
  tsMaxTmrCtrl = cfgGetItem(pCfg, "maxTmrCtrl")->i32;
  tsRpcTimer = cfgGetItem(pCfg, "rpcTimer")->i32;
  tsRpcMaxTime = cfgGetItem(pCfg, "rpcMaxTime")->i32;
  tsRpcForceTcp = cfgGetItem(pCfg, "rpcForceTcp")->i32;
  tsShellActivityTimer = cfgGetItem(pCfg, "shellActivityTimer")->bval;
  tsCompressMsgSize = cfgGetItem(pCfg, "compressMsgSize")->i32;
  tsCompressColData = cfgGetItem(pCfg, "compressColData")->i32;
  tsMaxWildCardsLen = cfgGetItem(pCfg, "maxWildCardsLength")->i32;
  tsMaxRegexStringLen = cfgGetItem(pCfg, "maxRegexStringLen")->i32;
  tsMaxNumOfOrderedResults = cfgGetItem(pCfg, "maxNumOfOrderedRes")->i32;
  tsKeepOriginalColumnName = cfgGetItem(pCfg, "keepColumnName")->bval;
  tsMaxBinaryDisplayWidth = cfgGetItem(pCfg, "maxBinaryDisplayWidth")->i32;
S
os  
Shengliang Guan 已提交
381
}
S
config  
Shengliang Guan 已提交
382

S
os  
Shengliang Guan 已提交
383
static void taosSetSystemCfg(SConfig *pCfg) {
S
Shengliang Guan 已提交
384 385
  SConfigItem *pItem = cfgGetItem(pCfg, "timezone");
  osSetTimezone(pItem->str);
S
os env  
Shengliang Guan 已提交
386 387
  uDebug("timezone format changed from %s to %s", pItem->str, tsTimezone);
  cfgSetItem(pCfg, "timezone", tsTimezone, pItem->stype);
S
Shengliang Guan 已提交
388

S
Shengliang Guan 已提交
389 390
  const char *locale = cfgGetItem(pCfg, "locale")->str;
  const char *charset = cfgGetItem(pCfg, "charset")->str;
S
os env  
Shengliang Guan 已提交
391
  taosSetSystemLocale(locale, charset);
S
Shengliang Guan 已提交
392

S
config  
Shengliang Guan 已提交
393 394
  if (tsNumOfCores <= 1) {
    tsNumOfCores = 2;
S
config  
Shengliang Guan 已提交
395
  }
S
Shengliang Guan 已提交
396 397

  bool enableCore = cfgGetItem(pCfg, "enableCoreFile")->bval;
S
os env  
Shengliang Guan 已提交
398
  taosSetConsoleEcho(enableCore);
S
config  
Shengliang Guan 已提交
399 400 401

  // todo
  tsVersion = 30000000;
S
Shengliang Guan 已提交
402
}
403

S
Shengliang Guan 已提交
404
static void taosSetServerCfg(SConfig *pCfg) {
S
os env  
Shengliang Guan 已提交
405
  tstrncpy(tsDataDir, cfgGetItem(pCfg, "dataDir")->str, PATH_MAX);
S
Shengliang Guan 已提交
406 407
  taosExpandDir(tsDataDir, tsDataDir, PATH_MAX);

S
os env  
Shengliang Guan 已提交
408
  tsTempSpace.reserved = cfgGetItem(pCfg, "minimalDataDirGB")->fval;
S
Shengliang Guan 已提交
409 410 411 412 413 414 415 416 417 418 419 420 421
  tsNumOfCommitThreads = cfgGetItem(pCfg, "numOfCommitThreads")->i32;
  tsRatioOfQueryCores = cfgGetItem(pCfg, "ratioOfQueryCores")->fval;
  tsMaxNumOfDistinctResults = cfgGetItem(pCfg, "maxNumOfDistinctRes")->i32;
  tsEnableTelemetryReporting = cfgGetItem(pCfg, "telemetryReporting")->bval;
  tsMaxConnections = cfgGetItem(pCfg, "maxConnections")->i32;
  tsMaxShellConns = cfgGetItem(pCfg, "maxShellConns")->i32;
  tsStatusInterval = cfgGetItem(pCfg, "statusInterval")->i32;
  tsMinSlidingTime = cfgGetItem(pCfg, "minSlidingTime")->i32;
  tsMinIntervalTime = cfgGetItem(pCfg, "minIntervalTime")->i32;
  tsMaxStreamComputDelay = cfgGetItem(pCfg, "maxStreamCompDelay")->i32;
  tsStreamCompStartDelay = cfgGetItem(pCfg, "maxFirstStreamCompDelay")->i32;
  tsRetryStreamCompDelay = cfgGetItem(pCfg, "retryStreamCompDelay")->i32;
  tsStreamComputDelayRatio = cfgGetItem(pCfg, "streamCompDelayRatio")->fval;
S
config  
Shengliang Guan 已提交
422
  tsQueryBufferSize = cfgGetItem(pCfg, "queryBufferSize")->i32;
S
Shengliang Guan 已提交
423 424 425 426 427
  tsRetrieveBlockingModel = cfgGetItem(pCfg, "retrieveBlockingModel")->bval;
  tsPrintAuth = cfgGetItem(pCfg, "printAuth")->bval;
  tsEnableSlaveQuery = cfgGetItem(pCfg, "slaveQuery")->bval;
  tsDeadLockKillQuery = cfgGetItem(pCfg, "deadLockKillQuery")->bval;

S
config  
Shengliang Guan 已提交
428 429 430
  if (tsQueryBufferSize >= 0) {
    tsQueryBufferSizeBytes = tsQueryBufferSize * 1048576UL;
  }
S
Shengliang Guan 已提交
431 432 433
}

int32_t taosCreateLog(const char *logname, int32_t logFileNum, const char *cfgDir, const char *envFile,
S
Shengliang Guan 已提交
434
                      const char *apolloUrl, SArray *pArgs, bool tsc) {
S
Shengliang Guan 已提交
435 436
  osInit();

S
Shengliang Guan 已提交
437
  SConfig *pCfg = cfgInit();
S
config  
Shengliang Guan 已提交
438
  if (pCfg == NULL) return -1;
S
Shengliang Guan 已提交
439 440

  if (tsc) {
S
Shengliang Guan 已提交
441
    if (taosAddClientLogCfg(pCfg) != 0) return -1;
S
Shengliang Guan 已提交
442
  } else {
S
Shengliang Guan 已提交
443 444
    if (taosAddClientLogCfg(pCfg) != 0) return -1;
    if (taosAddServerLogCfg(pCfg) != 0) return -1;
S
Shengliang Guan 已提交
445 446
  }

S
config  
Shengliang Guan 已提交
447
  if (taosLoadCfg(pCfg, cfgDir, envFile, apolloUrl) != 0) {
S
config  
Shengliang Guan 已提交
448
    uError("failed to load cfg since %s", terrstr());
S
Shengliang Guan 已提交
449 450 451 452
    cfgCleanup(pCfg);
    return -1;
  }

S
Shengliang Guan 已提交
453 454 455 456 457 458
  if (cfgLoadArray(pCfg, pArgs) != 0) {
    uError("failed to load cfg from array since %s", terrstr());
    cfgCleanup(pCfg);
    return -1;
  }

S
Shengliang Guan 已提交
459 460 461
  if (tsc) {
    taosSetClientLogCfg(pCfg);
  } else {
S
config  
Shengliang Guan 已提交
462
    taosSetClientLogCfg(pCfg);
S
Shengliang Guan 已提交
463 464 465
    taosSetServerLogCfg(pCfg);
  }

S
Shengliang Guan 已提交
466 467
  taosSetAllDebugFlag(cfgGetItem(pCfg, "debugFlag")->i32);

S
Shengliang Guan 已提交
468 469 470 471
  if (taosInitLog(logname, logFileNum) != 0) {
    printf("failed to init log file since %s\n", terrstr());
    cfgCleanup(pCfg);
    return -1;
472 473
  }

S
Shengliang Guan 已提交
474 475 476 477
  cfgCleanup(pCfg);
  return 0;
}

S
Shengliang Guan 已提交
478
int32_t taosInitCfg(const char *cfgDir, const char *envFile, const char *apolloUrl, SArray *pArgs, bool tsc) {
S
Shengliang Guan 已提交
479 480 481 482
  if (tsCfg != NULL) return 0;
  tsCfg = cfgInit();

  if (tsc) {
S
Shengliang Guan 已提交
483 484
    if (taosAddClientLogCfg(tsCfg) != 0) return -1;
    if (taosAddClientCfg(tsCfg) != 0) return -1;
S
Shengliang Guan 已提交
485
  } else {
S
Shengliang Guan 已提交
486 487
    if (taosAddClientCfg(tsCfg) != 0) return -1;
    if (taosAddServerCfg(tsCfg) != 0) return -1;
S
Shengliang Guan 已提交
488 489
    if (taosAddClientLogCfg(tsCfg) != 0) return -1;
    if (taosAddServerLogCfg(tsCfg) != 0) return -1;
490
  }
S
Shengliang Guan 已提交
491
  taosAddSystemCfg(tsCfg);
492

S
Shengliang Guan 已提交
493
  if (taosLoadCfg(tsCfg, cfgDir, envFile, apolloUrl) != 0) {
S
config  
Shengliang Guan 已提交
494
    uError("failed to load cfg since %s", terrstr());
S
Shengliang Guan 已提交
495 496 497
    cfgCleanup(tsCfg);
    tsCfg = NULL;
    return -1;
498 499
  }

S
Shengliang Guan 已提交
500 501 502 503 504 505
  if (cfgLoadArray(tsCfg, pArgs) != 0) {
    uError("failed to load cfg from array since %s", terrstr());
    cfgCleanup(tsCfg);
    return -1;
  }

S
Shengliang Guan 已提交
506 507 508
  if (tsc) {
    taosSetClientCfg(tsCfg);
  } else {
S
config  
Shengliang Guan 已提交
509
    taosSetClientCfg(tsCfg);
S
Shengliang Guan 已提交
510
    taosSetServerCfg(tsCfg);
S
Shengliang Guan 已提交
511
    taosSetTfsCfg(tsCfg);
512
  }
S
os  
Shengliang Guan 已提交
513
  taosSetSystemCfg(tsCfg);
514

S
Shengliang Guan 已提交
515
  cfgDumpCfg(tsCfg, tsc, false);
S
Shengliang Guan 已提交
516 517 518
  return 0;
}

S
config  
Shengliang Guan 已提交
519 520 521 522 523 524 525
void taosCleanupCfg() {
  if (tsCfg) {
    cfgCleanup(tsCfg);
    tsCfg = NULL;
  }
}

S
Shengliang Guan 已提交
526 527 528 529 530 531 532 533
void taosCfgDynamicOptions(const char *option, const char *value) {
  if (strcasecmp(option, "debugFlag") == 0) {
    int32_t debugFlag = atoi(value);
    taosSetAllDebugFlag(debugFlag);
  }

  if (strcasecmp(option, "resetlog") == 0) {
    taosResetLog();
S
config  
Shengliang Guan 已提交
534
    cfgDumpCfg(tsCfg, 1, false);
S
Shengliang Guan 已提交
535
  }
S
Shengliang Guan 已提交
536
}