tglobal.c 28.6 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"
H
Haojun Liao 已提交
20
#include "tdatablock.h"
S
Shengliang Guan 已提交
21
#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
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
S
Shengliang Guan 已提交
33
bool     tsEnableTelemetryReporting = false;
H
Hui Li 已提交
34

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

// multi process
bool    tsMultiProcess = false;
S
Shengliang Guan 已提交
48
int32_t tsMnodeShmSize = TSDB_MAX_WAL_SIZE * 2;
S
Shengliang Guan 已提交
49 50 51 52
int32_t tsVnodeShmSize = TSDB_MAX_WAL_SIZE * 10;
int32_t tsQnodeShmSize = TSDB_MAX_WAL_SIZE * 4;
int32_t tsSnodeShmSize = TSDB_MAX_WAL_SIZE * 4;
int32_t tsBnodeShmSize = TSDB_MAX_WAL_SIZE * 4;
S
Shengliang Guan 已提交
53

S
Shengliang Guan 已提交
54 55 56 57
// queue & threads
int32_t tsNumOfRpcThreads = 1;
int32_t tsNumOfCommitThreads = 2;
int32_t tsNumOfTaskQueueThreads = 1;
S
Shengliang Guan 已提交
58 59 60 61 62 63 64
int32_t tsNumOfMnodeQueryThreads = 1;
int32_t tsNumOfMnodeReadThreads = 1;
int32_t tsNumOfVnodeQueryThreads = 2;
int32_t tsNumOfVnodeFetchThreads = 2;
int32_t tsNumOfVnodeWriteThreads = 2;
int32_t tsNumOfVnodeSyncThreads = 2;
int32_t tsNumOfVnodeMergeThreads = 2;
S
Shengliang Guan 已提交
65 66
int32_t tsNumOfQnodeQueryThreads = 2;
int32_t tsNumOfQnodeFetchThreads = 2;
S
Shengliang Guan 已提交
67

S
monitor  
Shengliang Guan 已提交
68
// monitor
S
Shengliang Guan 已提交
69
bool     tsEnableMonitor = true;
S
Shengliang Guan 已提交
70
int32_t  tsMonitorInterval = 30;
S
monitor  
Shengliang Guan 已提交
71 72
char     tsMonitorFqdn[TSDB_FQDN_LEN] = {0};
uint16_t tsMonitorPort = 6043;
S
monitor  
Shengliang Guan 已提交
73
int32_t  tsMonitorMaxLogs = 100;
S
Shengliang Guan 已提交
74
bool     tsMonitorComp = false;
S
monitor  
Shengliang Guan 已提交
75

S
Shengliang Guan 已提交
76 77 78 79 80 81 82 83
/*
 * 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 已提交
84
int32_t tsCompressMsgSize = -1;
S
Shengliang Guan 已提交
85

86
/* denote if server needs to compress the retrieved column data before adding to the rpc response message body.
87 88
 * 0: all data are compressed
 * -1: all data are not compressed
89
 * other values: if any retrieved column size is greater than the tsCompressColData, all data will be compressed.
90
 */
91
int32_t tsCompressColData = -1;
92

93 94 95 96 97
/*
 * denote if 3.0 query pattern compatible for 2.0
 */
int32_t tsCompatibleModel = 1;

S
Shengliang Guan 已提交
98
// client
99
int32_t tsMaxWildCardsLen = TSDB_PATTERN_STRING_DEFAULT_LEN;
100 101
int32_t tsMaxRegexStringLen = TSDB_REGEX_STRING_DEFAULT_LEN;

S
Shengliang Guan 已提交
102 103 104 105 106 107 108
// 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;

109
// the maxinum number of distict query result
S
Shengliang Guan 已提交
110
int32_t tsMaxNumOfDistinctResults = 1000 * 10000;
111

112 113
// 1 us for interval time range, changed accordingly
int32_t tsMinIntervalTime = 1;
S
Shengliang Guan 已提交
114 115 116 117 118 119 120 121

// 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 已提交
122
int32_t tsRetryStreamCompDelay = 10 * 1000;
S
Shengliang Guan 已提交
123 124

// The delayed computing ration. 10% of the whole computing time window by default.
125
float tsStreamComputDelayRatio = 0.1f;
S
Shengliang Guan 已提交
126 127 128 129

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

H
Haojun Liao 已提交
130 131 132 133 134
// 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;
135
int64_t tsQueryBufferSizeBytes = -1;
H
Haojun Liao 已提交
136

H
Haojun Liao 已提交
137
// in retrieve blocking model, the retrieve threads will wait for the completion of the query processing.
S
Shengliang Guan 已提交
138
bool tsRetrieveBlockingModel = false;
139

140
// last_row(*), first(*), last_row(ts, col1, col2) query, the result fields will be the original column name
S
Shengliang Guan 已提交
141
bool tsKeepOriginalColumnName = false;
S
Shengliang Guan 已提交
142

L
Liu Jicong 已提交
143
// kill long query
S
Shengliang Guan 已提交
144
bool tsDeadLockKillQuery = false;
145

S
Shengliang Guan 已提交
146
// tsdb config
Y
yihaoDeng 已提交
147 148 149
// For backward compatibility
bool tsdbForceKeepFile = false;

S
Shengliang Guan 已提交
150 151 152
int32_t  tsDiskCfgNum = 0;
SDiskCfg tsDiskCfg[TFS_MAX_DISKS] = {0};

L
Liu Jicong 已提交
153 154 155
// stream scheduler
bool tsStreamSchedV = true;

S
Shengliang Guan 已提交
156 157 158 159 160 161
/*
 * minimum scale for whole system, millisecond by default
 * for TSDB_TIME_PRECISION_MILLI: 86400000L
 *     TSDB_TIME_PRECISION_MICRO: 86400000000L
 *     TSDB_TIME_PRECISION_NANO:  86400000000000L
 */
162
int64_t tsTickPerDay[] = {86400000L, 86400000000L, 86400000000000L};
S
Shengliang Guan 已提交
163

S
Shengliang Guan 已提交
164 165 166 167 168 169 170 171 172
// 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
173

S
config  
Shengliang Guan 已提交
174
static void taosAddDataDir(int32_t index, char *v1, int32_t level, int32_t primary) {
S
Shengliang Guan 已提交
175 176 177 178 179
  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 已提交
180

S
Shengliang Guan 已提交
181
static int32_t taosSetTfsCfg(SConfig *pCfg) {
S
Shengliang Guan 已提交
182
  SConfigItem *pItem = cfgGetItem(pCfg, "dataDir");
S
Shengliang Guan 已提交
183
  memset(tsDataDir, 0, PATH_MAX);
S
Shengliang Guan 已提交
184 185 186 187 188

  int32_t size = taosArrayGetSize(pItem->array);
  if (size <= 0) {
    tsDiskCfgNum = 1;
    taosAddDataDir(0, pItem->str, 0, 1);
S
Shengliang Guan 已提交
189 190 191 192 193
    tstrncpy(tsDataDir, pItem->str, PATH_MAX);
    if (taosMkDir(tsDataDir) != 0) {
      uError("failed to create dataDir:%s since %s", tsDataDir, terrstr());
      return -1;
    }
S
Shengliang Guan 已提交
194 195 196 197 198
  } 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 已提交
199 200
      if (pCfg->level == 0 && pCfg->primary == 1) {
        tstrncpy(tsDataDir, pCfg->dir, PATH_MAX);
S
Shengliang Guan 已提交
201 202 203 204
        if (taosMkDir(tsDataDir) != 0) {
          uError("failed to create dataDir:%s since %s", tsDataDir, terrstr());
          return -1;
        }
S
Shengliang Guan 已提交
205 206 207 208 209
      }
      if (taosMkDir(pCfg->dir) != 0) {
        uError("failed to create tfsDir:%s since %s", tsDataDir, terrstr());
        return -1;
      }
S
Shengliang Guan 已提交
210
    }
S
Shengliang Guan 已提交
211
  }
S
Shengliang Guan 已提交
212 213 214 215 216 217 218

  if (tsDataDir[0] == 0) {
    uError("datadir not set");
    return -1;
  }

  return 0;
S
Shengliang Guan 已提交
219
}
S
config  
Shengliang Guan 已提交
220

S
Shengliang Guan 已提交
221 222 223 224
struct SConfig *taosGetCfg() {
  return tsCfg;
}

S
Shengliang Guan 已提交
225 226 227
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 已提交
228

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

S
Shengliang Guan 已提交
232
  if (cfgLoad(pCfg, CFG_STYPE_APOLLO_URL, apolloUrl) != 0) {
233
    uError("failed to load from apollo url:%s since %s", apolloUrl, terrstr());
S
Shengliang Guan 已提交
234 235 236
    return -1;
  }

237 238 239 240
  if (cfgLoad(pCfg, CFG_STYPE_CFG_FILE, cfgDir) != 0) {
    if (cfgLoad(pCfg, CFG_STYPE_CFG_FILE, cfgFile) != 0) {
      uError("failed to load from config file:%s since %s", cfgFile, terrstr());
      return 0;
S
Shengliang Guan 已提交
241 242 243 244
    }
  }

  if (cfgLoad(pCfg, CFG_STYPE_ENV_FILE, envFile) != 0) {
245
    uError("failed to load from env file:%s since %s", envFile, terrstr());
S
Shengliang Guan 已提交
246 247 248 249
    return -1;
  }

  if (cfgLoad(pCfg, CFG_STYPE_ENV_VAR, NULL) != 0) {
250
    uError("failed to load from global env variables since %s", terrstr());
S
Shengliang Guan 已提交
251 252 253 254
    return -1;
  }

  return 0;
S
slguan 已提交
255 256
}

S
Shengliang Guan 已提交
257
static int32_t taosAddClientLogCfg(SConfig *pCfg) {
S
Shengliang Guan 已提交
258 259
  if (cfgAddDir(pCfg, "configDir", configDir, 1) != 0) return -1;
  if (cfgAddDir(pCfg, "scriptDir", configDir, 1) != 0) return -1;
S
Shengliang Guan 已提交
260 261 262 263 264 265 266 267 268 269 270 271 272
  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 已提交
273 274
}

S
Shengliang Guan 已提交
275 276 277 278 279 280 281 282 283 284 285
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 已提交
286 287
}

S
Shengliang Guan 已提交
288
static int32_t taosAddClientCfg(SConfig *pCfg) {
S
Shengliang Guan 已提交
289 290 291 292
  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 已提交
293 294

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

S
Shengliang Guan 已提交
298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316
  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 (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;
S
Shengliang Guan 已提交
317 318 319 320 321

  tsNumOfTaskQueueThreads = tsNumOfCores / 4;
  tsNumOfTaskQueueThreads = TRANGE(tsNumOfTaskQueueThreads, 1, 2);
  if (cfgAddInt32(pCfg, "numOfTaskQueueThreads", tsNumOfTaskQueueThreads, 1, 1024, 0) != 0) return -1;

S
Shengliang Guan 已提交
322
  return 0;
S
os  
Shengliang Guan 已提交
323 324
}

S
Shengliang Guan 已提交
325
static int32_t taosAddSystemCfg(SConfig *pCfg) {
S
os  
Shengliang Guan 已提交
326 327
  SysNameInfo info = taosGetSysNameInfo();

wafwerar's avatar
wafwerar 已提交
328
  if (cfgAddTimezone(pCfg, "timezone", tsTimezoneStr) != 0) return -1;
S
Shengliang Guan 已提交
329 330
  if (cfgAddLocale(pCfg, "locale", tsLocale) != 0) return -1;
  if (cfgAddCharset(pCfg, "charset", tsCharset) != 0) return -1;
331
  if (cfgAddBool(pCfg, "enableCoreFile", 1, 1) != 0) return -1;
S
Shengliang Guan 已提交
332
  if (cfgAddFloat(pCfg, "numOfCores", tsNumOfCores, 0, 100000, 1) != 0) return -1;
S
Shengliang Guan 已提交
333 334
  if (cfgAddInt64(pCfg, "openMax", tsOpenMax, 0, INT64_MAX, 1) != 0) return -1;
  if (cfgAddInt64(pCfg, "streamMax", tsStreamMax, 0, INT64_MAX, 1) != 0) return -1;
S
Shengliang Guan 已提交
335 336
  if (cfgAddInt32(pCfg, "pageSize(KB)", tsPageSizeKB, 0, INT64_MAX, 1) != 0) return -1;
  if (cfgAddInt64(pCfg, "totalMemory(KB)", tsTotalMemoryKB, 0, INT64_MAX, 1) != 0) return -1;
S
Shengliang Guan 已提交
337 338 339 340 341 342 343 344 345 346 347
  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, "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, "buildinfo", buildinfo, 1) != 0) return -1;
  return 0;
S
Shengliang Guan 已提交
348 349
}

S
Shengliang Guan 已提交
350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369
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, "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;
S
Shengliang Guan 已提交
370

S
Shengliang Guan 已提交
371
  if (cfgAddBool(pCfg, "multiProcess", tsMultiProcess, 0) != 0) return -1;
S
Shengliang Guan 已提交
372 373 374 375
  if (cfgAddInt32(pCfg, "mnodeShmSize", tsMnodeShmSize, 4096, INT32_MAX, 0) != 0) return -1;
  if (cfgAddInt32(pCfg, "vnodeShmSize", tsVnodeShmSize, 4096, INT32_MAX, 0) != 0) return -1;
  if (cfgAddInt32(pCfg, "qnodeShmSize", tsQnodeShmSize, 4096, INT32_MAX, 0) != 0) return -1;
  if (cfgAddInt32(pCfg, "snodeShmSize", tsSnodeShmSize, 4096, INT32_MAX, 0) != 0) return -1;
S
Shengliang Guan 已提交
376 377 378 379 380 381
  if (cfgAddInt32(pCfg, "bnodeShmSize", tsBnodeShmSize, 4096, INT32_MAX, 0) != 0) return -1;

  tsNumOfRpcThreads = tsNumOfCores / 2;
  tsNumOfRpcThreads = TRANGE(tsNumOfRpcThreads, 1, 4);
  if (cfgAddInt32(pCfg, "numOfRpcThreads", tsNumOfRpcThreads, 1, 1024, 0) != 0) return -1;

S
Shengliang Guan 已提交
382
  tsNumOfCommitThreads = tsNumOfCores / 2;
S
Shengliang Guan 已提交
383
  tsNumOfCommitThreads = TRANGE(tsNumOfCommitThreads, 2, 4);
S
Shengliang Guan 已提交
384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412
  if (cfgAddInt32(pCfg, "numOfCommitThreads", tsNumOfCommitThreads, 1, 1024, 0) != 0) return -1;

  tsNumOfMnodeQueryThreads = tsNumOfCores / 8;
  tsNumOfMnodeQueryThreads = TRANGE(tsNumOfMnodeQueryThreads, 1, 4);
  if (cfgAddInt32(pCfg, "numOfMnodeQueryThreads", tsNumOfMnodeQueryThreads, 1, 1024, 0) != 0) return -1;

  tsNumOfMnodeReadThreads = tsNumOfCores / 8;
  tsNumOfMnodeReadThreads = TRANGE(tsNumOfMnodeReadThreads, 1, 4);
  if (cfgAddInt32(pCfg, "numOfMnodeReadThreads", tsNumOfMnodeReadThreads, 1, 1024, 0) != 0) return -1;

  tsNumOfVnodeQueryThreads = tsNumOfCores / 2;
  tsNumOfVnodeQueryThreads = TMIN(tsNumOfVnodeQueryThreads, 1);
  if (cfgAddInt32(pCfg, "numOfVnodeQueryThreads", tsNumOfVnodeQueryThreads, 1, 1024, 0) != 0) return -1;

  tsNumOfVnodeFetchThreads = tsNumOfCores / 2;
  tsNumOfVnodeFetchThreads = TRANGE(tsNumOfVnodeFetchThreads, 2, 4);
  if (cfgAddInt32(pCfg, "numOfVnodeFetchThreads", tsNumOfVnodeFetchThreads, 1, 1024, 0) != 0) return -1;

  tsNumOfVnodeWriteThreads = tsNumOfCores;
  tsNumOfVnodeWriteThreads = TMIN(tsNumOfVnodeWriteThreads, 1);
  if (cfgAddInt32(pCfg, "numOfVnodeWriteThreads", tsNumOfVnodeWriteThreads, 1, 1024, 0) != 0) return -1;

  tsNumOfVnodeSyncThreads = tsNumOfCores / 2;
  tsNumOfVnodeSyncThreads = TMIN(tsNumOfVnodeSyncThreads, 1);
  if (cfgAddInt32(pCfg, "numOfVnodeSyncThreads", tsNumOfVnodeSyncThreads, 1, 1024, 0) != 0) return -1;

  tsNumOfVnodeMergeThreads = tsNumOfCores / 8;
  tsNumOfVnodeMergeThreads = TRANGE(tsNumOfVnodeMergeThreads, 1, 1);
  if (cfgAddInt32(pCfg, "numOfVnodeMergeThreads", tsNumOfVnodeMergeThreads, 1, 1024, 0) != 0) return -1;
S
monitor  
Shengliang Guan 已提交
413

S
Shengliang Guan 已提交
414 415 416 417 418 419 420 421
  tsNumOfQnodeQueryThreads = tsNumOfCores / 2;
  tsNumOfQnodeQueryThreads = TMIN(tsNumOfQnodeQueryThreads, 1);
  if (cfgAddInt32(pCfg, "numOfQnodeQueryThreads", tsNumOfQnodeQueryThreads, 1, 1024, 0) != 0) return -1;

  tsNumOfQnodeFetchThreads = tsNumOfCores / 2;
  tsNumOfQnodeFetchThreads = TRANGE(tsNumOfQnodeFetchThreads, 2, 4);
  if (cfgAddInt32(pCfg, "numOfQnodeFetchThreads", tsNumOfQnodeFetchThreads, 1, 1024, 0) != 0) return -1;

S
monitor  
Shengliang Guan 已提交
422 423 424 425
  if (cfgAddBool(pCfg, "monitor", tsEnableMonitor, 0) != 0) return -1;
  if (cfgAddInt32(pCfg, "monitorInterval", tsMonitorInterval, 1, 360000, 0) != 0) return -1;
  if (cfgAddString(pCfg, "monitorFqdn", tsMonitorFqdn, 0) != 0) return -1;
  if (cfgAddInt32(pCfg, "monitorPort", tsMonitorPort, 1, 65056, 0) != 0) return -1;
S
monitor  
Shengliang Guan 已提交
426
  if (cfgAddInt32(pCfg, "monitorMaxLogs", tsMonitorMaxLogs, 1, 1000000, 0) != 0) return -1;
S
Shengliang Guan 已提交
427
  if (cfgAddBool(pCfg, "monitorComp", tsMonitorComp, 0) != 0) return -1;
S
monitor  
Shengliang Guan 已提交
428

S
Shengliang Guan 已提交
429
  return 0;
S
Shengliang Guan 已提交
430 431 432
}

static void taosSetClientLogCfg(SConfig *pCfg) {
S
Shengliang Guan 已提交
433
  SConfigItem *pItem = cfgGetItem(pCfg, "logDir");
S
os env  
Shengliang Guan 已提交
434
  tstrncpy(tsLogDir, cfgGetItem(pCfg, "logDir")->str, PATH_MAX);
S
Shengliang Guan 已提交
435
  taosExpandDir(tsLogDir, tsLogDir, PATH_MAX);
S
os env  
Shengliang Guan 已提交
436
  tsLogSpace.reserved = cfgGetItem(pCfg, "minimalLogDirGB")->fval;
S
Shengliang Guan 已提交
437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458
  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;
}

S
Shengliang Guan 已提交
459
static int32_t taosSetClientCfg(SConfig *pCfg) {
S
monitor  
Shengliang Guan 已提交
460
  tstrncpy(tsLocalFqdn, cfgGetItem(pCfg, "fqdn")->str, TSDB_FQDN_LEN);
S
Shengliang Guan 已提交
461 462
  tsServerPort = (uint16_t)cfgGetItem(pCfg, "serverPort")->i32;
  snprintf(tsLocalEp, sizeof(tsLocalEp), "%s:%u", tsLocalFqdn, tsServerPort);
463 464 465 466 467 468 469 470 471 472 473 474 475

  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
Shengliang Guan 已提交
476 477
  tstrncpy(tsTempDir, cfgGetItem(pCfg, "tempDir")->str, PATH_MAX);
  taosExpandDir(tsTempDir, tsTempDir, PATH_MAX);
S
os env  
Shengliang Guan 已提交
478
  tsTempSpace.reserved = cfgGetItem(pCfg, "minimalTempDirGB")->fval;
S
Shengliang Guan 已提交
479 480 481 482
  if (taosMkDir(tsTempDir) != 0) {
    uError("failed to create tempDir:%s since %s", tsTempDir, terrstr());
    return -1;
  }
S
Shengliang Guan 已提交
483 484 485 486 487 488 489 490 491 492 493 494 495

  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
Shengliang Guan 已提交
496
  tsNumOfTaskQueueThreads = cfgGetItem(pCfg, "numOfTaskQueueThreads")->i32;
S
Shengliang Guan 已提交
497
  return 0;
S
os  
Shengliang Guan 已提交
498
}
S
config  
Shengliang Guan 已提交
499

S
os  
Shengliang Guan 已提交
500
static void taosSetSystemCfg(SConfig *pCfg) {
S
Shengliang Guan 已提交
501 502
  SConfigItem *pItem = cfgGetItem(pCfg, "timezone");
  osSetTimezone(pItem->str);
wafwerar's avatar
wafwerar 已提交
503 504
  uDebug("timezone format changed from %s to %s", pItem->str, tsTimezoneStr);
  cfgSetItem(pCfg, "timezone", tsTimezoneStr, pItem->stype);
S
Shengliang Guan 已提交
505

S
Shengliang Guan 已提交
506 507
  const char *locale = cfgGetItem(pCfg, "locale")->str;
  const char *charset = cfgGetItem(pCfg, "charset")->str;
S
os env  
Shengliang Guan 已提交
508
  taosSetSystemLocale(locale, charset);
wafwerar's avatar
wafwerar 已提交
509
  osSetSystemLocale(locale, charset);
S
Shengliang Guan 已提交
510

S
Shengliang Guan 已提交
511
  bool enableCore = cfgGetItem(pCfg, "enableCoreFile")->bval;
S
os env  
Shengliang Guan 已提交
512
  taosSetConsoleEcho(enableCore);
S
config  
Shengliang Guan 已提交
513 514 515

  // todo
  tsVersion = 30000000;
S
Shengliang Guan 已提交
516
}
517

S
Shengliang Guan 已提交
518 519
static int32_t taosSetServerCfg(SConfig *pCfg) {
  tsDataSpace.reserved = cfgGetItem(pCfg, "minimalDataDirGB")->fval;
S
Shengliang Guan 已提交
520 521 522 523 524 525 526 527 528 529 530
  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 已提交
531
  tsQueryBufferSize = cfgGetItem(pCfg, "queryBufferSize")->i32;
S
Shengliang Guan 已提交
532 533 534 535
  tsRetrieveBlockingModel = cfgGetItem(pCfg, "retrieveBlockingModel")->bval;
  tsPrintAuth = cfgGetItem(pCfg, "printAuth")->bval;
  tsEnableSlaveQuery = cfgGetItem(pCfg, "slaveQuery")->bval;
  tsDeadLockKillQuery = cfgGetItem(pCfg, "deadLockKillQuery")->bval;
S
Shengliang Guan 已提交
536

S
Shengliang Guan 已提交
537
  tsMultiProcess = cfgGetItem(pCfg, "multiProcess")->bval;
S
Shengliang Guan 已提交
538 539 540 541
  tsMnodeShmSize = cfgGetItem(pCfg, "mnodeShmSize")->i32;
  tsVnodeShmSize = cfgGetItem(pCfg, "vnodeShmSize")->i32;
  tsQnodeShmSize = cfgGetItem(pCfg, "qnodeShmSize")->i32;
  tsSnodeShmSize = cfgGetItem(pCfg, "snodeShmSize")->i32;
S
Shengliang Guan 已提交
542 543 544 545
  tsBnodeShmSize = cfgGetItem(pCfg, "bnodeShmSize")->i32;

  tsNumOfRpcThreads = cfgGetItem(pCfg, "numOfRpcThreads")->i32;
  tsNumOfCommitThreads = cfgGetItem(pCfg, "numOfCommitThreads")->i32;
S
Shengliang Guan 已提交
546 547 548 549 550 551 552
  tsNumOfMnodeQueryThreads = cfgGetItem(pCfg, "numOfMnodeQueryThreads")->i32;
  tsNumOfMnodeReadThreads = cfgGetItem(pCfg, "numOfMnodeReadThreads")->i32;
  tsNumOfVnodeQueryThreads = cfgGetItem(pCfg, "numOfVnodeQueryThreads")->i32;
  tsNumOfVnodeFetchThreads = cfgGetItem(pCfg, "numOfVnodeFetchThreads")->i32;
  tsNumOfVnodeWriteThreads = cfgGetItem(pCfg, "numOfVnodeWriteThreads")->i32;
  tsNumOfVnodeSyncThreads = cfgGetItem(pCfg, "numOfVnodeSyncThreads")->i32;
  tsNumOfVnodeMergeThreads = cfgGetItem(pCfg, "numOfVnodeMergeThreads")->i32;
S
Shengliang Guan 已提交
553 554
  tsNumOfQnodeQueryThreads = cfgGetItem(pCfg, "numOfQnodeQueryThreads")->i32;
  tsNumOfQnodeFetchThreads = cfgGetItem(pCfg, "numOfQnodeFetchThreads")->i32;
S
Shengliang Guan 已提交
555

S
monitor  
Shengliang Guan 已提交
556 557 558 559
  tsEnableMonitor = cfgGetItem(pCfg, "monitor")->bval;
  tsMonitorInterval = cfgGetItem(pCfg, "monitorInterval")->i32;
  tstrncpy(tsMonitorFqdn, cfgGetItem(pCfg, "monitorFqdn")->str, TSDB_FQDN_LEN);
  tsMonitorPort = (uint16_t)cfgGetItem(pCfg, "monitorPort")->i32;
S
monitor  
Shengliang Guan 已提交
560
  tsMonitorMaxLogs = cfgGetItem(pCfg, "monitorMaxLogs")->i32;
S
Shengliang Guan 已提交
561
  tsMonitorComp = cfgGetItem(pCfg, "monitorComp")->bval;
S
monitor  
Shengliang Guan 已提交
562

S
config  
Shengliang Guan 已提交
563 564 565
  if (tsQueryBufferSize >= 0) {
    tsQueryBufferSizeBytes = tsQueryBufferSize * 1048576UL;
  }
S
Shengliang Guan 已提交
566 567

  return 0;
S
Shengliang Guan 已提交
568 569 570
}

int32_t taosCreateLog(const char *logname, int32_t logFileNum, const char *cfgDir, const char *envFile,
S
Shengliang Guan 已提交
571
                      const char *apolloUrl, SArray *pArgs, bool tsc) {
wafwerar's avatar
wafwerar 已提交
572
  osDefaultInit();
S
Shengliang Guan 已提交
573

S
Shengliang Guan 已提交
574
  SConfig *pCfg = cfgInit();
S
config  
Shengliang Guan 已提交
575
  if (pCfg == NULL) return -1;
S
Shengliang Guan 已提交
576 577

  if (tsc) {
S
Shengliang Guan 已提交
578
    tsLogEmbedded = 0;
S
Shengliang Guan 已提交
579
    if (taosAddClientLogCfg(pCfg) != 0) return -1;
S
Shengliang Guan 已提交
580
  } else {
S
Shengliang Guan 已提交
581
    tsLogEmbedded = 1;
S
Shengliang Guan 已提交
582 583
    if (taosAddClientLogCfg(pCfg) != 0) return -1;
    if (taosAddServerLogCfg(pCfg) != 0) return -1;
S
Shengliang Guan 已提交
584 585
  }

S
config  
Shengliang Guan 已提交
586
  if (taosLoadCfg(pCfg, cfgDir, envFile, apolloUrl) != 0) {
S
config  
Shengliang Guan 已提交
587
    uError("failed to load cfg since %s", terrstr());
S
Shengliang Guan 已提交
588 589 590 591
    cfgCleanup(pCfg);
    return -1;
  }

592
  if (cfgLoadFromArray(pCfg, pArgs) != 0) {
S
Shengliang Guan 已提交
593 594 595 596 597
    uError("failed to load cfg from array since %s", terrstr());
    cfgCleanup(pCfg);
    return -1;
  }

S
Shengliang Guan 已提交
598 599 600
  if (tsc) {
    taosSetClientLogCfg(pCfg);
  } else {
S
config  
Shengliang Guan 已提交
601
    taosSetClientLogCfg(pCfg);
S
Shengliang Guan 已提交
602 603 604
    taosSetServerLogCfg(pCfg);
  }

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

607 608 609 610 611 612
  if (taosMkDir(tsLogDir) != 0) {
    uError("failed to create dir:%s since %s", tsLogDir, terrstr());
    cfgCleanup(pCfg);
    return -1;
  }

S
Shengliang Guan 已提交
613
  if (taosInitLog(logname, logFileNum) != 0) {
614
    uError("failed to init log file since %s", terrstr());
S
Shengliang Guan 已提交
615 616
    cfgCleanup(pCfg);
    return -1;
617 618
  }

S
Shengliang Guan 已提交
619 620 621 622
  cfgCleanup(pCfg);
  return 0;
}

S
Shengliang Guan 已提交
623
int32_t taosInitCfg(const char *cfgDir, const char *envFile, const char *apolloUrl, SArray *pArgs, bool tsc) {
S
Shengliang Guan 已提交
624 625 626 627
  if (tsCfg != NULL) return 0;
  tsCfg = cfgInit();

  if (tsc) {
S
Shengliang Guan 已提交
628
    if (taosAddClientCfg(tsCfg) != 0) return -1;
S
Shengliang Guan 已提交
629
    if (taosAddClientLogCfg(tsCfg) != 0) return -1;
S
Shengliang Guan 已提交
630
  } else {
S
Shengliang Guan 已提交
631 632
    if (taosAddClientCfg(tsCfg) != 0) return -1;
    if (taosAddServerCfg(tsCfg) != 0) return -1;
S
Shengliang Guan 已提交
633 634
    if (taosAddClientLogCfg(tsCfg) != 0) return -1;
    if (taosAddServerLogCfg(tsCfg) != 0) return -1;
635
  }
S
Shengliang Guan 已提交
636
  taosAddSystemCfg(tsCfg);
637

S
Shengliang Guan 已提交
638
  if (taosLoadCfg(tsCfg, cfgDir, envFile, apolloUrl) != 0) {
S
config  
Shengliang Guan 已提交
639
    uError("failed to load cfg since %s", terrstr());
S
Shengliang Guan 已提交
640 641 642
    cfgCleanup(tsCfg);
    tsCfg = NULL;
    return -1;
643 644
  }

645
  if (cfgLoadFromArray(tsCfg, pArgs) != 0) {
S
Shengliang Guan 已提交
646 647 648 649 650
    uError("failed to load cfg from array since %s", terrstr());
    cfgCleanup(tsCfg);
    return -1;
  }

S
Shengliang Guan 已提交
651
  if (tsc) {
S
Shengliang Guan 已提交
652
    if (taosSetClientCfg(tsCfg)) return -1;
S
Shengliang Guan 已提交
653
  } else {
S
Shengliang Guan 已提交
654 655 656
    if (taosSetClientCfg(tsCfg)) return -1;
    if (taosSetServerCfg(tsCfg)) return -1;
    if (taosSetTfsCfg(tsCfg) != 0) return -1;
657
  }
S
os  
Shengliang Guan 已提交
658
  taosSetSystemCfg(tsCfg);
659

S
Shengliang Guan 已提交
660
  cfgDumpCfg(tsCfg, tsc, false);
S
Shengliang Guan 已提交
661 662 663
  return 0;
}

S
config  
Shengliang Guan 已提交
664 665 666 667 668 669 670
void taosCleanupCfg() {
  if (tsCfg) {
    cfgCleanup(tsCfg);
    tsCfg = NULL;
  }
}

S
Shengliang Guan 已提交
671 672 673 674 675 676 677 678
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 已提交
679
    cfgDumpCfg(tsCfg, 1, false);
S
Shengliang Guan 已提交
680
  }
L
Liu Jicong 已提交
681
}