tglobal.c 28.0 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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

L
Liu Jicong 已提交
151 152 153
// stream scheduler
bool tsStreamSchedV = true;

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

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

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

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

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

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

  return 0;
S
Shengliang Guan 已提交
217
}
S
config  
Shengliang Guan 已提交
218

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

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

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

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

235 236 237 238
  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 已提交
239 240 241 242
    }
  }

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

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

  return 0;
S
slguan 已提交
253 254
}

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

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

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

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

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

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

S
Shengliang Guan 已提交
320
  return 0;
S
os  
Shengliang Guan 已提交
321 322
}

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

wafwerar's avatar
wafwerar 已提交
326
  if (cfgAddTimezone(pCfg, "timezone", tsTimezoneStr) != 0) return -1;
S
Shengliang Guan 已提交
327 328
  if (cfgAddLocale(pCfg, "locale", tsLocale) != 0) return -1;
  if (cfgAddCharset(pCfg, "charset", tsCharset) != 0) return -1;
329
  if (cfgAddBool(pCfg, "enableCoreFile", 1, 1) != 0) return -1;
S
Shengliang Guan 已提交
330
  if (cfgAddFloat(pCfg, "numOfCores", tsNumOfCores, 0, 100000, 1) != 0) return -1;
S
Shengliang Guan 已提交
331 332
  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 已提交
333 334
  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 已提交
335 336 337 338 339 340 341 342 343 344 345
  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 已提交
346 347
}

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

S
Shengliang Guan 已提交
369
  if (cfgAddBool(pCfg, "multiProcess", tsMultiProcess, 0) != 0) return -1;
S
Shengliang Guan 已提交
370 371 372 373
  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 已提交
374 375 376 377 378 379
  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 已提交
380
  tsNumOfCommitThreads = tsNumOfCores / 2;
S
Shengliang Guan 已提交
381
  tsNumOfCommitThreads = TRANGE(tsNumOfCommitThreads, 2, 4);
S
Shengliang Guan 已提交
382 383 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
  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 已提交
411 412 413 414 415

  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 已提交
416
  if (cfgAddInt32(pCfg, "monitorMaxLogs", tsMonitorMaxLogs, 1, 1000000, 0) != 0) return -1;
S
Shengliang Guan 已提交
417
  if (cfgAddBool(pCfg, "monitorComp", tsMonitorComp, 0) != 0) return -1;
S
monitor  
Shengliang Guan 已提交
418

S
Shengliang Guan 已提交
419
  return 0;
S
Shengliang Guan 已提交
420 421 422
}

static void taosSetClientLogCfg(SConfig *pCfg) {
S
Shengliang Guan 已提交
423
  SConfigItem *pItem = cfgGetItem(pCfg, "logDir");
S
os env  
Shengliang Guan 已提交
424
  tstrncpy(tsLogDir, cfgGetItem(pCfg, "logDir")->str, PATH_MAX);
S
Shengliang Guan 已提交
425
  taosExpandDir(tsLogDir, tsLogDir, PATH_MAX);
S
os env  
Shengliang Guan 已提交
426
  tsLogSpace.reserved = cfgGetItem(pCfg, "minimalLogDirGB")->fval;
S
Shengliang Guan 已提交
427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448
  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 已提交
449
static int32_t taosSetClientCfg(SConfig *pCfg) {
S
monitor  
Shengliang Guan 已提交
450
  tstrncpy(tsLocalFqdn, cfgGetItem(pCfg, "fqdn")->str, TSDB_FQDN_LEN);
S
Shengliang Guan 已提交
451 452
  tsServerPort = (uint16_t)cfgGetItem(pCfg, "serverPort")->i32;
  snprintf(tsLocalEp, sizeof(tsLocalEp), "%s:%u", tsLocalFqdn, tsServerPort);
453 454 455 456 457 458 459 460 461 462 463 464 465

  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 已提交
466 467
  tstrncpy(tsTempDir, cfgGetItem(pCfg, "tempDir")->str, PATH_MAX);
  taosExpandDir(tsTempDir, tsTempDir, PATH_MAX);
S
os env  
Shengliang Guan 已提交
468
  tsTempSpace.reserved = cfgGetItem(pCfg, "minimalTempDirGB")->fval;
S
Shengliang Guan 已提交
469 470 471 472
  if (taosMkDir(tsTempDir) != 0) {
    uError("failed to create tempDir:%s since %s", tsTempDir, terrstr());
    return -1;
  }
S
Shengliang Guan 已提交
473 474 475 476 477 478 479 480 481 482 483 484 485

  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 已提交
486
  tsNumOfTaskQueueThreads = cfgGetItem(pCfg, "numOfTaskQueueThreads")->i32;
S
Shengliang Guan 已提交
487
  return 0;
S
os  
Shengliang Guan 已提交
488
}
S
config  
Shengliang Guan 已提交
489

S
os  
Shengliang Guan 已提交
490
static void taosSetSystemCfg(SConfig *pCfg) {
S
Shengliang Guan 已提交
491 492
  SConfigItem *pItem = cfgGetItem(pCfg, "timezone");
  osSetTimezone(pItem->str);
wafwerar's avatar
wafwerar 已提交
493 494
  uDebug("timezone format changed from %s to %s", pItem->str, tsTimezoneStr);
  cfgSetItem(pCfg, "timezone", tsTimezoneStr, pItem->stype);
S
Shengliang Guan 已提交
495

S
Shengliang Guan 已提交
496 497
  const char *locale = cfgGetItem(pCfg, "locale")->str;
  const char *charset = cfgGetItem(pCfg, "charset")->str;
S
os env  
Shengliang Guan 已提交
498
  taosSetSystemLocale(locale, charset);
wafwerar's avatar
wafwerar 已提交
499
  osSetSystemLocale(locale, charset);
S
Shengliang Guan 已提交
500

S
Shengliang Guan 已提交
501
  bool enableCore = cfgGetItem(pCfg, "enableCoreFile")->bval;
S
os env  
Shengliang Guan 已提交
502
  taosSetConsoleEcho(enableCore);
S
config  
Shengliang Guan 已提交
503 504 505

  // todo
  tsVersion = 30000000;
S
Shengliang Guan 已提交
506
}
507

S
Shengliang Guan 已提交
508 509
static int32_t taosSetServerCfg(SConfig *pCfg) {
  tsDataSpace.reserved = cfgGetItem(pCfg, "minimalDataDirGB")->fval;
S
Shengliang Guan 已提交
510 511 512 513 514 515 516 517 518 519 520
  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 已提交
521
  tsQueryBufferSize = cfgGetItem(pCfg, "queryBufferSize")->i32;
S
Shengliang Guan 已提交
522 523 524 525
  tsRetrieveBlockingModel = cfgGetItem(pCfg, "retrieveBlockingModel")->bval;
  tsPrintAuth = cfgGetItem(pCfg, "printAuth")->bval;
  tsEnableSlaveQuery = cfgGetItem(pCfg, "slaveQuery")->bval;
  tsDeadLockKillQuery = cfgGetItem(pCfg, "deadLockKillQuery")->bval;
S
Shengliang Guan 已提交
526

S
Shengliang Guan 已提交
527
  tsMultiProcess = cfgGetItem(pCfg, "multiProcess")->bval;
S
Shengliang Guan 已提交
528 529 530 531
  tsMnodeShmSize = cfgGetItem(pCfg, "mnodeShmSize")->i32;
  tsVnodeShmSize = cfgGetItem(pCfg, "vnodeShmSize")->i32;
  tsQnodeShmSize = cfgGetItem(pCfg, "qnodeShmSize")->i32;
  tsSnodeShmSize = cfgGetItem(pCfg, "snodeShmSize")->i32;
S
Shengliang Guan 已提交
532 533 534 535
  tsBnodeShmSize = cfgGetItem(pCfg, "bnodeShmSize")->i32;

  tsNumOfRpcThreads = cfgGetItem(pCfg, "numOfRpcThreads")->i32;
  tsNumOfCommitThreads = cfgGetItem(pCfg, "numOfCommitThreads")->i32;
S
Shengliang Guan 已提交
536 537 538 539 540 541 542
  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 已提交
543

S
monitor  
Shengliang Guan 已提交
544 545 546 547
  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 已提交
548
  tsMonitorMaxLogs = cfgGetItem(pCfg, "monitorMaxLogs")->i32;
S
Shengliang Guan 已提交
549
  tsMonitorComp = cfgGetItem(pCfg, "monitorComp")->bval;
S
monitor  
Shengliang Guan 已提交
550

S
config  
Shengliang Guan 已提交
551 552 553
  if (tsQueryBufferSize >= 0) {
    tsQueryBufferSizeBytes = tsQueryBufferSize * 1048576UL;
  }
S
Shengliang Guan 已提交
554 555

  return 0;
S
Shengliang Guan 已提交
556 557 558
}

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

S
Shengliang Guan 已提交
562
  SConfig *pCfg = cfgInit();
S
config  
Shengliang Guan 已提交
563
  if (pCfg == NULL) return -1;
S
Shengliang Guan 已提交
564 565

  if (tsc) {
S
Shengliang Guan 已提交
566
    tsLogEmbedded = 0;
S
Shengliang Guan 已提交
567
    if (taosAddClientLogCfg(pCfg) != 0) return -1;
S
Shengliang Guan 已提交
568
  } else {
S
Shengliang Guan 已提交
569
    tsLogEmbedded = 1;
S
Shengliang Guan 已提交
570 571
    if (taosAddClientLogCfg(pCfg) != 0) return -1;
    if (taosAddServerLogCfg(pCfg) != 0) return -1;
S
Shengliang Guan 已提交
572 573
  }

S
config  
Shengliang Guan 已提交
574
  if (taosLoadCfg(pCfg, cfgDir, envFile, apolloUrl) != 0) {
S
config  
Shengliang Guan 已提交
575
    uError("failed to load cfg since %s", terrstr());
S
Shengliang Guan 已提交
576 577 578 579
    cfgCleanup(pCfg);
    return -1;
  }

580
  if (cfgLoadFromArray(pCfg, pArgs) != 0) {
S
Shengliang Guan 已提交
581 582 583 584 585
    uError("failed to load cfg from array since %s", terrstr());
    cfgCleanup(pCfg);
    return -1;
  }

S
Shengliang Guan 已提交
586 587 588
  if (tsc) {
    taosSetClientLogCfg(pCfg);
  } else {
S
config  
Shengliang Guan 已提交
589
    taosSetClientLogCfg(pCfg);
S
Shengliang Guan 已提交
590 591 592
    taosSetServerLogCfg(pCfg);
  }

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

595 596 597 598 599 600
  if (taosMkDir(tsLogDir) != 0) {
    uError("failed to create dir:%s since %s", tsLogDir, terrstr());
    cfgCleanup(pCfg);
    return -1;
  }

S
Shengliang Guan 已提交
601
  if (taosInitLog(logname, logFileNum) != 0) {
602
    uError("failed to init log file since %s", terrstr());
S
Shengliang Guan 已提交
603 604
    cfgCleanup(pCfg);
    return -1;
605 606
  }

S
Shengliang Guan 已提交
607 608 609 610
  cfgCleanup(pCfg);
  return 0;
}

S
Shengliang Guan 已提交
611
int32_t taosInitCfg(const char *cfgDir, const char *envFile, const char *apolloUrl, SArray *pArgs, bool tsc) {
S
Shengliang Guan 已提交
612 613 614 615
  if (tsCfg != NULL) return 0;
  tsCfg = cfgInit();

  if (tsc) {
S
Shengliang Guan 已提交
616
    if (taosAddClientCfg(tsCfg) != 0) return -1;
S
Shengliang Guan 已提交
617
    if (taosAddClientLogCfg(tsCfg) != 0) return -1;
S
Shengliang Guan 已提交
618
  } else {
S
Shengliang Guan 已提交
619 620
    if (taosAddClientCfg(tsCfg) != 0) return -1;
    if (taosAddServerCfg(tsCfg) != 0) return -1;
S
Shengliang Guan 已提交
621 622
    if (taosAddClientLogCfg(tsCfg) != 0) return -1;
    if (taosAddServerLogCfg(tsCfg) != 0) return -1;
623
  }
S
Shengliang Guan 已提交
624
  taosAddSystemCfg(tsCfg);
625

S
Shengliang Guan 已提交
626
  if (taosLoadCfg(tsCfg, cfgDir, envFile, apolloUrl) != 0) {
S
config  
Shengliang Guan 已提交
627
    uError("failed to load cfg since %s", terrstr());
S
Shengliang Guan 已提交
628 629 630
    cfgCleanup(tsCfg);
    tsCfg = NULL;
    return -1;
631 632
  }

633
  if (cfgLoadFromArray(tsCfg, pArgs) != 0) {
S
Shengliang Guan 已提交
634 635 636 637 638
    uError("failed to load cfg from array since %s", terrstr());
    cfgCleanup(tsCfg);
    return -1;
  }

S
Shengliang Guan 已提交
639
  if (tsc) {
S
Shengliang Guan 已提交
640
    if (taosSetClientCfg(tsCfg)) return -1;
S
Shengliang Guan 已提交
641
  } else {
S
Shengliang Guan 已提交
642 643 644
    if (taosSetClientCfg(tsCfg)) return -1;
    if (taosSetServerCfg(tsCfg)) return -1;
    if (taosSetTfsCfg(tsCfg) != 0) return -1;
645
  }
S
os  
Shengliang Guan 已提交
646
  taosSetSystemCfg(tsCfg);
647

S
Shengliang Guan 已提交
648
  cfgDumpCfg(tsCfg, tsc, false);
S
Shengliang Guan 已提交
649 650 651
  return 0;
}

S
config  
Shengliang Guan 已提交
652 653 654 655 656 657 658
void taosCleanupCfg() {
  if (tsCfg) {
    cfgCleanup(tsCfg);
    tsCfg = NULL;
  }
}

S
Shengliang Guan 已提交
659 660 661 662 663 664 665 666
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 已提交
667
    cfgDumpCfg(tsCfg, 1, false);
S
Shengliang Guan 已提交
668
  }
L
Liu Jicong 已提交
669
}