add ut .
This commit is contained in:
parent
eb710ebc5f
commit
bc95f82373
|
@ -160,8 +160,6 @@ int32_t cfgGetApollUrl(const char **envCmd, const char *envFile, char *apolloUrl
|
|||
SArray *taosGetLocalCfg(SConfig *pCfg);
|
||||
SArray *taosGetGlobalCfg(SConfig *pCfg);
|
||||
|
||||
void taosSetLocalCfg(SConfig *pCfg, SArray *pArray);
|
||||
void taosSetGlobalCfg(SConfig *pCfg, SArray *pArray);
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -160,6 +160,7 @@ int32_t walRollImpl(SWal* pWal);
|
|||
int32_t walRollFileInfo(SWal* pWal);
|
||||
int32_t walScanLogGetLastVer(SWal* pWal, int32_t fileIdx, int64_t* lastVer);
|
||||
int32_t walCheckAndRepairMeta(SWal* pWal);
|
||||
int64_t walChangeWrite(SWal* pWal, int64_t ver);
|
||||
|
||||
int32_t walCheckAndRepairIdx(SWal* pWal);
|
||||
|
||||
|
|
|
@ -92,18 +92,15 @@ void walApplyVer(SWal *pWal, int64_t ver) {
|
|||
}
|
||||
|
||||
int32_t walCommit(SWal *pWal, int64_t ver) {
|
||||
if (ver < pWal->vers.commitVer) {
|
||||
TAOS_RETURN(TSDB_CODE_SUCCESS);
|
||||
}
|
||||
if (ver > pWal->vers.lastVer || pWal->vers.commitVer < pWal->vers.snapshotVer) {
|
||||
TAOS_RETURN(TSDB_CODE_WAL_INVALID_VER);
|
||||
}
|
||||
if (ver < pWal->vers.commitVer) TAOS_RETURN(TSDB_CODE_SUCCESS);
|
||||
if (ver > pWal->vers.lastVer || pWal->vers.commitVer < pWal->vers.snapshotVer) TAOS_RETURN(TSDB_CODE_WAL_INVALID_VER);
|
||||
|
||||
pWal->vers.commitVer = ver;
|
||||
|
||||
TAOS_RETURN(TSDB_CODE_SUCCESS);
|
||||
}
|
||||
|
||||
static int64_t walChangeWrite(SWal *pWal, int64_t ver) {
|
||||
int64_t walChangeWrite(SWal *pWal, int64_t ver) {
|
||||
int code;
|
||||
TdFilePtr pIdxTFile, pLogTFile;
|
||||
char fnameStr[WAL_FILE_LEN];
|
||||
|
@ -161,6 +158,7 @@ int32_t walRollback(SWal *pWal, int64_t ver) {
|
|||
TAOS_UNUSED(taosThreadRwlockWrlock(&pWal->mutex));
|
||||
wInfo("vgId:%d, wal rollback for version %" PRId64, pWal->cfg.vgId, ver);
|
||||
int32_t code = 0;
|
||||
int32_t lino = 0;
|
||||
int64_t ret;
|
||||
char fnameStr[WAL_FILE_LEN];
|
||||
TdFilePtr pIdxFile = NULL, pLogFile = NULL;
|
||||
|
@ -172,11 +170,7 @@ int32_t walRollback(SWal *pWal, int64_t ver) {
|
|||
// find correct file
|
||||
if (ver < walGetLastFileFirstVer(pWal)) {
|
||||
// change current files
|
||||
ret = walChangeWrite(pWal, ver);
|
||||
if (ret < 0) {
|
||||
code = terrno;
|
||||
goto _exit;
|
||||
}
|
||||
TAOS_CHECK_EXIT_SET_CODE(walChangeWrite(pWal, ver), code, terrno);
|
||||
|
||||
// delete files in descending order
|
||||
int fileSetSize = taosArrayGetSize(pWal->fileInfoSet);
|
||||
|
@ -198,10 +192,7 @@ int32_t walRollback(SWal *pWal, int64_t ver) {
|
|||
|
||||
walBuildIdxName(pWal, walGetCurFileFirstVer(pWal), fnameStr);
|
||||
pIdxFile = taosOpenFile(fnameStr, TD_FILE_WRITE | TD_FILE_READ | TD_FILE_APPEND);
|
||||
if (pIdxFile == NULL) {
|
||||
code = terrno;
|
||||
goto _exit;
|
||||
}
|
||||
TSDB_CHECK_NULL(pIdxFile, code, lino, _exit, terrno);
|
||||
int64_t idxOff = walGetVerIdxOffset(pWal, ver);
|
||||
ret = taosLSeekFile(pIdxFile, idxOff, SEEK_SET);
|
||||
if (ret < 0) {
|
||||
|
@ -218,11 +209,8 @@ int32_t walRollback(SWal *pWal, int64_t ver) {
|
|||
walBuildLogName(pWal, walGetCurFileFirstVer(pWal), fnameStr);
|
||||
pLogFile = taosOpenFile(fnameStr, TD_FILE_WRITE | TD_FILE_READ | TD_FILE_APPEND);
|
||||
wDebug("vgId:%d, wal truncate file %s", pWal->cfg.vgId, fnameStr);
|
||||
if (pLogFile == NULL) {
|
||||
// TODO
|
||||
code = terrno;
|
||||
goto _exit;
|
||||
}
|
||||
TSDB_CHECK_NULL(pLogFile, code, lino, _exit, terrno);
|
||||
|
||||
ret = taosLSeekFile(pLogFile, entry.offset, SEEK_SET);
|
||||
if (ret < 0) {
|
||||
// TODO
|
||||
|
@ -238,35 +226,26 @@ int32_t walRollback(SWal *pWal, int64_t ver) {
|
|||
}
|
||||
code = walValidHeadCksum(&head);
|
||||
|
||||
if (code != 0) {
|
||||
code = TSDB_CODE_WAL_FILE_CORRUPTED;
|
||||
goto _exit;
|
||||
}
|
||||
if (head.head.version != ver) {
|
||||
if (code != 0 || head.head.version != ver) {
|
||||
code = TSDB_CODE_WAL_FILE_CORRUPTED;
|
||||
goto _exit;
|
||||
}
|
||||
|
||||
// truncate old files
|
||||
code = taosFtruncateFile(pLogFile, entry.offset);
|
||||
if (code < 0) {
|
||||
goto _exit;
|
||||
}
|
||||
code = taosFtruncateFile(pIdxFile, idxOff);
|
||||
if (code < 0) {
|
||||
goto _exit;
|
||||
}
|
||||
if ((code = taosFtruncateFile(pLogFile, entry.offset)) < 0) goto _exit;
|
||||
|
||||
if ((code = taosFtruncateFile(pIdxFile, idxOff)) < 0) goto _exit;
|
||||
|
||||
pWal->vers.lastVer = ver - 1;
|
||||
((SWalFileInfo *)taosArrayGetLast(pWal->fileInfoSet))->lastVer = ver - 1;
|
||||
((SWalFileInfo *)taosArrayGetLast(pWal->fileInfoSet))->fileSize = entry.offset;
|
||||
|
||||
code = walSaveMeta(pWal);
|
||||
if (code < 0) {
|
||||
wError("vgId:%d, failed to save meta since %s", pWal->cfg.vgId, terrstr());
|
||||
goto _exit;
|
||||
}
|
||||
TAOS_CHECK_EXIT(walSaveMeta(pWal));
|
||||
|
||||
_exit:
|
||||
if (code != 0) {
|
||||
wError("vgId:%d, %s failed at line %d since %s", pWal->cfg.vgId, __func__, lino, tstrerror(code));
|
||||
}
|
||||
TAOS_UNUSED(taosCloseFile(&pIdxFile));
|
||||
TAOS_UNUSED(taosCloseFile(&pLogFile));
|
||||
TAOS_UNUSED(taosThreadRwlockUnlock(&pWal->mutex));
|
||||
|
@ -306,15 +285,12 @@ int32_t walRollImpl(SWal *pWal) {
|
|||
char fnameStr[WAL_FILE_LEN];
|
||||
walBuildIdxName(pWal, newFileFirstVer, fnameStr);
|
||||
pIdxFile = taosOpenFile(fnameStr, TD_FILE_CREATE | TD_FILE_WRITE | TD_FILE_APPEND);
|
||||
if (pIdxFile == NULL) {
|
||||
TAOS_CHECK_GOTO(terrno, &lino, _exit);
|
||||
}
|
||||
TSDB_CHECK_NULL(pIdxFile, code, lino, _exit, terrno);
|
||||
|
||||
walBuildLogName(pWal, newFileFirstVer, fnameStr);
|
||||
pLogFile = taosOpenFile(fnameStr, TD_FILE_CREATE | TD_FILE_WRITE | TD_FILE_APPEND);
|
||||
wDebug("vgId:%d, wal create new file for write:%s", pWal->cfg.vgId, fnameStr);
|
||||
if (pLogFile == NULL) {
|
||||
TAOS_CHECK_GOTO(terrno, &lino, _exit);
|
||||
}
|
||||
TSDB_CHECK_NULL(pLogFile, code, lino, _exit, terrno);
|
||||
|
||||
TAOS_CHECK_GOTO(walRollFileInfo(pWal), &lino, _exit);
|
||||
|
||||
|
@ -358,6 +334,7 @@ static FORCE_INLINE int32_t walCheckAndRoll(SWal *pWal) {
|
|||
|
||||
int32_t walBeginSnapshot(SWal *pWal, int64_t ver, int64_t logRetention) {
|
||||
int32_t code = 0;
|
||||
int32_t lino = 0;
|
||||
|
||||
if (pWal->cfg.level == TAOS_WAL_SKIP) {
|
||||
TAOS_RETURN(TSDB_CODE_SUCCESS);
|
||||
|
@ -375,16 +352,13 @@ int32_t walBeginSnapshot(SWal *pWal, int64_t ver, int64_t logRetention) {
|
|||
", last ver %" PRId64,
|
||||
pWal->cfg.vgId, ver, pWal->vers.logRetention, pWal->vers.firstVer, pWal->vers.lastVer);
|
||||
// check file rolling
|
||||
if (walGetLastFileSize(pWal) != 0) {
|
||||
if ((code = walRollImpl(pWal)) < 0) {
|
||||
wError("vgId:%d, failed to roll wal files since %s", pWal->cfg.vgId, terrstr());
|
||||
goto _exit;
|
||||
}
|
||||
}
|
||||
if (walGetLastFileSize(pWal) != 0 && (code = walRollImpl(pWal)) < 0) goto _exit;
|
||||
|
||||
_exit:
|
||||
if (code) {
|
||||
wError("vgId:%d, %s failed since %s at line %d", pWal->cfg.vgId, __func__, tstrerror(code), lino);
|
||||
}
|
||||
TAOS_UNUSED(taosThreadRwlockUnlock(&pWal->mutex));
|
||||
|
||||
TAOS_RETURN(code);
|
||||
}
|
||||
|
||||
|
@ -515,6 +489,13 @@ _exit:
|
|||
return code;
|
||||
}
|
||||
|
||||
static void walStopDnode(SWal *pWal) {
|
||||
if (pWal->stopDnode != NULL) {
|
||||
wWarn("vgId:%d, set stop dnode flag", pWal->cfg.vgId);
|
||||
pWal->stopDnode();
|
||||
}
|
||||
}
|
||||
|
||||
static int32_t walWriteIndex(SWal *pWal, int64_t ver, int64_t offset) {
|
||||
int32_t code = 0;
|
||||
|
||||
|
@ -528,12 +509,7 @@ static int32_t walWriteIndex(SWal *pWal, int64_t ver, int64_t offset) {
|
|||
int64_t size = taosWriteFile(pWal->pIdxFile, &entry, sizeof(SWalIdxEntry));
|
||||
if (size != sizeof(SWalIdxEntry)) {
|
||||
wError("vgId:%d, failed to write idx entry due to %s. ver:%" PRId64, pWal->cfg.vgId, strerror(errno), ver);
|
||||
|
||||
if (pWal->stopDnode != NULL) {
|
||||
wWarn("vgId:%d, set stop dnode flag", pWal->cfg.vgId);
|
||||
pWal->stopDnode();
|
||||
}
|
||||
|
||||
walStopDnode(pWal);
|
||||
TAOS_RETURN(terrno);
|
||||
}
|
||||
|
||||
|
@ -579,12 +555,7 @@ static FORCE_INLINE int32_t walWriteImpl(SWal *pWal, int64_t index, tmsg_t msgTy
|
|||
code = terrno;
|
||||
wError("vgId:%d, file:%" PRId64 ".log, failed to write since %s", pWal->cfg.vgId, walGetLastFileFirstVer(pWal),
|
||||
strerror(errno));
|
||||
|
||||
if (pWal->stopDnode != NULL) {
|
||||
wWarn("vgId:%d, set stop dnode flag", pWal->cfg.vgId);
|
||||
pWal->stopDnode();
|
||||
}
|
||||
|
||||
walStopDnode(pWal);
|
||||
TAOS_CHECK_GOTO(code, &lino, _exit);
|
||||
}
|
||||
|
||||
|
@ -597,12 +568,8 @@ static FORCE_INLINE int32_t walWriteImpl(SWal *pWal, int64_t index, tmsg_t msgTy
|
|||
cyptedBodyLen = ENCRYPTED_LEN(cyptedBodyLen);
|
||||
|
||||
newBody = taosMemoryMalloc(cyptedBodyLen);
|
||||
if (newBody == NULL) {
|
||||
wError("vgId:%d, file:%" PRId64 ".log, failed to malloc since %s", pWal->cfg.vgId, walGetLastFileFirstVer(pWal),
|
||||
strerror(errno));
|
||||
TSDB_CHECK_NULL(newBody, code, lino, _exit, terrno);
|
||||
|
||||
TAOS_CHECK_GOTO(terrno, &lino, _exit);
|
||||
}
|
||||
(void)memset(newBody, 0, cyptedBodyLen);
|
||||
(void)memcpy(newBody, body, plainBodyLen);
|
||||
|
||||
|
@ -641,10 +608,7 @@ static FORCE_INLINE int32_t walWriteImpl(SWal *pWal, int64_t index, tmsg_t msgTy
|
|||
taosMemoryFreeClear(newBodyEncrypted);
|
||||
}
|
||||
|
||||
if (pWal->stopDnode != NULL) {
|
||||
wWarn("vgId:%d, set stop dnode flag", pWal->cfg.vgId);
|
||||
pWal->stopDnode();
|
||||
}
|
||||
walStopDnode(pWal);
|
||||
|
||||
TAOS_CHECK_GOTO(code, &lino, _exit);
|
||||
}
|
||||
|
@ -652,8 +616,6 @@ static FORCE_INLINE int32_t walWriteImpl(SWal *pWal, int64_t index, tmsg_t msgTy
|
|||
if (pWal->cfg.encryptAlgorithm == DND_CA_SM4) {
|
||||
taosMemoryFreeClear(newBody);
|
||||
taosMemoryFreeClear(newBodyEncrypted);
|
||||
// wInfo("vgId:%d, free newBody newBodyEncrypted %s",
|
||||
// pWal->cfg.vgId, __FUNCTION__);
|
||||
}
|
||||
|
||||
// set status
|
||||
|
@ -668,6 +630,10 @@ static FORCE_INLINE int32_t walWriteImpl(SWal *pWal, int64_t index, tmsg_t msgTy
|
|||
return 0;
|
||||
|
||||
_exit:
|
||||
if (code) {
|
||||
wError("vgId:%d, %s failed at line %d since %s", pWal->cfg.vgId, __func__, lino, tstrerror(code));
|
||||
}
|
||||
|
||||
// recover in a reverse order
|
||||
if (taosFtruncateFile(pWal->pLogFile, offset) < 0) {
|
||||
wFatal("vgId:%d, failed to recover WAL logfile from write error since %s, offset:%" PRId64, pWal->cfg.vgId,
|
||||
|
|
|
@ -627,6 +627,23 @@ TEST_F(WalKeepEnv, walRollback) {
|
|||
ASSERT_EQ(code, 0);
|
||||
}
|
||||
|
||||
TEST_F(WalKeepEnv, walChangeWrite) {
|
||||
walResetEnv();
|
||||
int code;
|
||||
|
||||
int i;
|
||||
for (i = 0; i < 100; i++) {
|
||||
char newStr[100];
|
||||
sprintf(newStr, "%s-%d", ranStr, i);
|
||||
int len = strlen(newStr);
|
||||
code = walAppendLog(pWal, i, 0, syncMeta, newStr, len);
|
||||
ASSERT_EQ(code, 0);
|
||||
}
|
||||
|
||||
code = walChangeWrite(pWal, 50);
|
||||
ASSERT_EQ(code, 0);
|
||||
}
|
||||
|
||||
TEST_F(WalCleanEnv, walRepairLogFileTs2) {
|
||||
int code;
|
||||
|
||||
|
|
|
@ -46,24 +46,29 @@ int32_t cfgSetItemVal(SConfigItem *pItem, const char *name, const char *value, E
|
|||
extern char **environ;
|
||||
|
||||
int32_t cfgInit(SConfig **ppCfg) {
|
||||
SConfig *pCfg = taosMemoryCalloc(1, sizeof(SConfig));
|
||||
if (pCfg == NULL) {
|
||||
TAOS_RETURN(terrno);
|
||||
}
|
||||
int32_t code = 0;
|
||||
int32_t lino = 0;
|
||||
SConfig *pCfg = NULL;
|
||||
|
||||
pCfg = taosMemoryCalloc(1, sizeof(SConfig));
|
||||
if (pCfg == NULL) return terrno;
|
||||
|
||||
pCfg->localArray = NULL, pCfg->globalArray = NULL;
|
||||
pCfg->localArray = taosArrayInit(64, sizeof(SConfigItem));
|
||||
if (pCfg->localArray == NULL) {
|
||||
taosMemoryFree(pCfg);
|
||||
TAOS_RETURN(terrno);
|
||||
}
|
||||
TSDB_CHECK_NULL(pCfg->localArray, code, lino, _exit, terrno);
|
||||
|
||||
pCfg->globalArray = taosArrayInit(64, sizeof(SConfigItem));
|
||||
if (pCfg->globalArray == NULL) {
|
||||
taosMemoryFree(pCfg);
|
||||
TAOS_RETURN(terrno);
|
||||
}
|
||||
TSDB_CHECK_NULL(pCfg->globalArray, code, lino, _exit, terrno);
|
||||
|
||||
TAOS_CHECK_RETURN(taosThreadMutexInit(&pCfg->lock, NULL));
|
||||
*ppCfg = pCfg;
|
||||
|
||||
_exit:
|
||||
if (code != 0) {
|
||||
uError("failed to init config, since %s ,at line %d", tstrerror(code), lino);
|
||||
cfgCleanup(pCfg);
|
||||
}
|
||||
|
||||
TAOS_RETURN(TSDB_CODE_SUCCESS);
|
||||
}
|
||||
|
||||
|
@ -187,14 +192,11 @@ int32_t cfgGetGlobalSize(SConfig *pCfg) { return taosArrayGetSize(pCfg->globalAr
|
|||
|
||||
static int32_t cfgCheckAndSetConf(SConfigItem *pItem, const char *conf) {
|
||||
cfgItemFreeVal(pItem);
|
||||
if (!(pItem->str == NULL)) {
|
||||
return TSDB_CODE_INVALID_PARA;
|
||||
}
|
||||
if (!(pItem->str == NULL)) return TSDB_CODE_INVALID_PARA;
|
||||
|
||||
pItem->str = taosStrdup(conf);
|
||||
if (pItem->str == NULL) {
|
||||
TAOS_RETURN(terrno);
|
||||
}
|
||||
|
||||
if (pItem->str == NULL) return terrno;
|
||||
|
||||
TAOS_RETURN(TSDB_CODE_SUCCESS);
|
||||
}
|
||||
|
@ -209,9 +211,8 @@ static int32_t cfgCheckAndSetDir(SConfigItem *pItem, const char *inputDir) {
|
|||
|
||||
taosMemoryFreeClear(pItem->str);
|
||||
pItem->str = taosStrdup(fullDir);
|
||||
if (pItem->str == NULL) {
|
||||
TAOS_RETURN(terrno);
|
||||
}
|
||||
|
||||
if (pItem->str == NULL) return terrno;
|
||||
|
||||
TAOS_RETURN(TSDB_CODE_SUCCESS);
|
||||
}
|
||||
|
@ -219,9 +220,8 @@ static int32_t cfgCheckAndSetDir(SConfigItem *pItem, const char *inputDir) {
|
|||
static int32_t cfgSetBool(SConfigItem *pItem, const char *value, ECfgSrcType stype) {
|
||||
int32_t code = 0;
|
||||
bool tmp = false;
|
||||
if (strcasecmp(value, "true") == 0) {
|
||||
tmp = true;
|
||||
}
|
||||
if (strcasecmp(value, "true") == 0) tmp = true;
|
||||
|
||||
int32_t val = 0;
|
||||
if ((code = taosStr2int32(value, &val)) == 0 && val > 0) {
|
||||
tmp = true;
|
||||
|
@ -441,9 +441,7 @@ static int32_t cfgUpdateDebugFlagItem(SConfig *pCfg, const char *name, bool rese
|
|||
// logflag names that should 'not' be set by 'debugFlag'
|
||||
if (pDebugFlagItem->array == NULL) {
|
||||
pDebugFlagItem->array = taosArrayInit(16, sizeof(SLogVar));
|
||||
if (pDebugFlagItem->array == NULL) {
|
||||
TAOS_RETURN(terrno);
|
||||
}
|
||||
if (pDebugFlagItem->array == NULL) return terrno;
|
||||
}
|
||||
taosArrayClear(pDebugFlagItem->array);
|
||||
TAOS_RETURN(TSDB_CODE_SUCCESS);
|
||||
|
@ -454,9 +452,7 @@ static int32_t cfgUpdateDebugFlagItem(SConfig *pCfg, const char *name, bool rese
|
|||
if (pDebugFlagItem->array != NULL) {
|
||||
SLogVar logVar = {0};
|
||||
tstrncpy(logVar.name, name, TSDB_LOG_VAR_LEN);
|
||||
if (NULL == taosArrayPush(pDebugFlagItem->array, &logVar)) {
|
||||
TAOS_RETURN(terrno);
|
||||
}
|
||||
if (NULL == taosArrayPush(pDebugFlagItem->array, &logVar)) return terrno;
|
||||
}
|
||||
TAOS_RETURN(TSDB_CODE_SUCCESS);
|
||||
}
|
||||
|
@ -518,9 +514,8 @@ _exit:
|
|||
int32_t cfgSetItemVal(SConfigItem *pItem, const char *name, const char *value, ECfgSrcType stype) {
|
||||
int32_t code = TSDB_CODE_SUCCESS;
|
||||
|
||||
if (pItem == NULL) {
|
||||
TAOS_RETURN(TSDB_CODE_CFG_NOT_FOUND);
|
||||
}
|
||||
if (pItem == NULL) return TSDB_CODE_CFG_NOT_FOUND;
|
||||
|
||||
switch (pItem->dtype) {
|
||||
case CFG_DTYPE_BOOL: {
|
||||
code = cfgSetBool(pItem, value, stype);
|
||||
|
@ -589,10 +584,7 @@ SConfigItem *cfgGetItem(SConfig *pCfg, const char *pName) {
|
|||
}
|
||||
|
||||
void cfgLock(SConfig *pCfg) {
|
||||
if (pCfg == NULL) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (pCfg == NULL) return;
|
||||
(void)taosThreadMutexLock(&pCfg->lock);
|
||||
}
|
||||
|
||||
|
@ -600,7 +592,7 @@ void cfgUnLock(SConfig *pCfg) { (void)taosThreadMutexUnlock(&pCfg->lock); }
|
|||
|
||||
int32_t checkItemDyn(SConfigItem *pItem, bool isServer) {
|
||||
if (pItem->dynScope == CFG_DYN_NONE) {
|
||||
return TSDB_CODE_SUCCESS;
|
||||
return TSDB_CODE_INVALID_CFG;
|
||||
}
|
||||
if (isServer) {
|
||||
if (pItem->dynScope == CFG_DYN_CLIENT || pItem->dynScope == CFG_DYN_CLIENT_LAZY) {
|
||||
|
@ -617,39 +609,33 @@ int32_t checkItemDyn(SConfigItem *pItem, bool isServer) {
|
|||
|
||||
int32_t cfgCheckRangeForDynUpdate(SConfig *pCfg, const char *name, const char *pVal, bool isServer,
|
||||
CfgAlterType alterType) {
|
||||
int32_t code = TSDB_CODE_SUCCESS;
|
||||
int32_t lino = 0;
|
||||
cfgLock(pCfg);
|
||||
|
||||
SConfigItem *pItem = cfgGetItem(pCfg, name);
|
||||
if (pItem == NULL) {
|
||||
cfgUnLock(pCfg);
|
||||
TAOS_RETURN(TSDB_CODE_CFG_NOT_FOUND);
|
||||
}
|
||||
int32_t code = checkItemDyn(pItem, isServer);
|
||||
if (code != TSDB_CODE_SUCCESS) {
|
||||
cfgUnLock(pCfg);
|
||||
TAOS_RETURN(code);
|
||||
}
|
||||
TSDB_CHECK_NULL(pItem, code, lino, _exit, TSDB_CODE_CFG_NOT_FOUND);
|
||||
|
||||
TAOS_CHECK_EXIT(checkItemDyn(pItem, isServer));
|
||||
|
||||
if ((pItem->category == CFG_CATEGORY_GLOBAL) && alterType == CFG_ALTER_DNODE) {
|
||||
uError("failed to config:%s, not support update global config on only one dnode", name);
|
||||
cfgUnLock(pCfg);
|
||||
TAOS_RETURN(TSDB_CODE_INVALID_CFG);
|
||||
code = TSDB_CODE_INVALID_CFG;
|
||||
goto _exit;
|
||||
}
|
||||
switch (pItem->dtype) {
|
||||
case CFG_DTYPE_STRING: {
|
||||
if (strcasecmp(name, "slowLogScope") == 0) {
|
||||
char *tmp = taosStrdup(pVal);
|
||||
if (!tmp) {
|
||||
cfgUnLock(pCfg);
|
||||
uError("failed to config:%s since %s", name, terrstr());
|
||||
TAOS_RETURN(terrno);
|
||||
code = terrno;
|
||||
goto _exit;
|
||||
}
|
||||
int32_t scope = 0;
|
||||
int32_t code = taosSetSlowLogScope(tmp, &scope);
|
||||
code = taosSetSlowLogScope(tmp, &scope);
|
||||
if (TSDB_CODE_SUCCESS != code) {
|
||||
cfgUnLock(pCfg);
|
||||
taosMemoryFree(tmp);
|
||||
TAOS_RETURN(code);
|
||||
goto _exit;
|
||||
}
|
||||
taosMemoryFree(tmp);
|
||||
}
|
||||
|
@ -659,13 +645,13 @@ int32_t cfgCheckRangeForDynUpdate(SConfig *pCfg, const char *name, const char *p
|
|||
code = taosStr2int32(pVal, &ival);
|
||||
if (code != 0 || (ival != 0 && ival != 1)) {
|
||||
uError("cfg:%s, type:%s value:%d out of range[0, 1]", pItem->name, cfgDtypeStr(pItem->dtype), ival);
|
||||
cfgUnLock(pCfg);
|
||||
TAOS_RETURN(TSDB_CODE_OUT_OF_RANGE);
|
||||
code = TSDB_CODE_OUT_OF_RANGE;
|
||||
goto _exit;
|
||||
}
|
||||
} break;
|
||||
case CFG_DTYPE_INT32: {
|
||||
int32_t ival;
|
||||
int32_t code = (int32_t)taosStrHumanToInt32(pVal, &ival);
|
||||
code = (int32_t)taosStrHumanToInt32(pVal, &ival);
|
||||
if (code != TSDB_CODE_SUCCESS) {
|
||||
cfgUnLock(pCfg);
|
||||
return code;
|
||||
|
@ -673,13 +659,13 @@ int32_t cfgCheckRangeForDynUpdate(SConfig *pCfg, const char *name, const char *p
|
|||
if (ival < pItem->imin || ival > pItem->imax) {
|
||||
uError("cfg:%s, type:%s value:%d out of range[%" PRId64 ", %" PRId64 "]", pItem->name,
|
||||
cfgDtypeStr(pItem->dtype), ival, pItem->imin, pItem->imax);
|
||||
cfgUnLock(pCfg);
|
||||
TAOS_RETURN(TSDB_CODE_OUT_OF_RANGE);
|
||||
code = TSDB_CODE_OUT_OF_RANGE;
|
||||
goto _exit;
|
||||
}
|
||||
} break;
|
||||
case CFG_DTYPE_INT64: {
|
||||
int64_t ival;
|
||||
int32_t code = taosStrHumanToInt64(pVal, &ival);
|
||||
code = taosStrHumanToInt64(pVal, &ival);
|
||||
if (code != TSDB_CODE_SUCCESS) {
|
||||
cfgUnLock(pCfg);
|
||||
TAOS_RETURN(code);
|
||||
|
@ -687,31 +673,32 @@ int32_t cfgCheckRangeForDynUpdate(SConfig *pCfg, const char *name, const char *p
|
|||
if (ival < pItem->imin || ival > pItem->imax) {
|
||||
uError("cfg:%s, type:%s value:%" PRId64 " out of range[%" PRId64 ", %" PRId64 "]", pItem->name,
|
||||
cfgDtypeStr(pItem->dtype), ival, pItem->imin, pItem->imax);
|
||||
cfgUnLock(pCfg);
|
||||
TAOS_RETURN(TSDB_CODE_OUT_OF_RANGE);
|
||||
code = TSDB_CODE_OUT_OF_RANGE;
|
||||
goto _exit;
|
||||
}
|
||||
} break;
|
||||
case CFG_DTYPE_FLOAT:
|
||||
case CFG_DTYPE_DOUBLE: {
|
||||
float dval = 0;
|
||||
int32_t code = parseCfgReal(pVal, &dval);
|
||||
if (code != TSDB_CODE_SUCCESS) {
|
||||
cfgUnLock(pCfg);
|
||||
TAOS_RETURN(code);
|
||||
}
|
||||
float dval = 0;
|
||||
TAOS_CHECK_EXIT(parseCfgReal(pVal, &dval));
|
||||
|
||||
if (dval < pItem->fmin || dval > pItem->fmax) {
|
||||
uError("cfg:%s, type:%s value:%g out of range[%g, %g]", pItem->name, cfgDtypeStr(pItem->dtype), dval,
|
||||
pItem->fmin, pItem->fmax);
|
||||
cfgUnLock(pCfg);
|
||||
TAOS_RETURN(TSDB_CODE_OUT_OF_RANGE);
|
||||
code = TSDB_CODE_OUT_OF_RANGE;
|
||||
goto _exit;
|
||||
}
|
||||
} break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
_exit:
|
||||
if (code != TSDB_CODE_SUCCESS) {
|
||||
uError("failed to check range for cfg:%s, value:%s, since %s at line:%d", name, pVal, tstrerror(code), __LINE__);
|
||||
}
|
||||
cfgUnLock(pCfg);
|
||||
TAOS_RETURN(TSDB_CODE_SUCCESS);
|
||||
TAOS_RETURN(code);
|
||||
}
|
||||
|
||||
static int32_t cfgAddItem(SConfig *pCfg, SConfigItem *pItem, const char *name) {
|
||||
|
@ -720,9 +707,7 @@ static int32_t cfgAddItem(SConfig *pCfg, SConfigItem *pItem, const char *name) {
|
|||
|
||||
pItem->stype = CFG_STYPE_DEFAULT;
|
||||
pItem->name = taosStrdup(name);
|
||||
if (pItem->name == NULL) {
|
||||
TAOS_RETURN(terrno);
|
||||
}
|
||||
if (pItem->name == NULL) return terrno;
|
||||
|
||||
int32_t size = taosArrayGetSize(array);
|
||||
for (int32_t i = 0; i < size; ++i) {
|
||||
|
@ -819,9 +804,8 @@ int32_t cfgAddString(SConfig *pCfg, const char *name, const char *defaultVal, in
|
|||
int8_t category) {
|
||||
SConfigItem item = {.dtype = CFG_DTYPE_STRING, .scope = scope, .dynScope = dynScope, .category = category};
|
||||
item.str = taosStrdup(defaultVal);
|
||||
if (item.str == NULL) {
|
||||
TAOS_RETURN(terrno);
|
||||
}
|
||||
if (item.str == NULL) return terrno;
|
||||
|
||||
return cfgAddItem(pCfg, &item, name);
|
||||
}
|
||||
|
||||
|
@ -943,13 +927,9 @@ int32_t cfgDumpItemValue(SConfigItem *pItem, char *buf, int32_t bufSize, int32_t
|
|||
break;
|
||||
}
|
||||
|
||||
if (len < 0) {
|
||||
TAOS_RETURN(TAOS_SYSTEM_ERROR(errno));
|
||||
}
|
||||
if (len < 0) return terrno;
|
||||
|
||||
if (len > bufSize) {
|
||||
len = bufSize;
|
||||
}
|
||||
if (len > bufSize) len = bufSize;
|
||||
|
||||
*pLen = len;
|
||||
TAOS_RETURN(TSDB_CODE_SUCCESS);
|
||||
|
@ -1310,9 +1290,7 @@ int32_t cfgLoadFromEnvFile(SConfig *pConfig, const char *envFile) {
|
|||
}
|
||||
|
||||
TdFilePtr pFile = taosOpenFile(filepath, TD_FILE_READ | TD_FILE_STREAM);
|
||||
if (pFile == NULL) {
|
||||
TAOS_RETURN(terrno);
|
||||
}
|
||||
if (pFile == NULL) return terrno;
|
||||
|
||||
while (!taosEOFFile(pFile)) {
|
||||
name = value = value2 = value3 = value4 = NULL;
|
||||
|
@ -1466,8 +1444,10 @@ int32_t cfgLoadFromCfgFile(SConfig *pConfig, const char *filepath) {
|
|||
}
|
||||
|
||||
int32_t cfgLoadFromApollUrl(SConfig *pConfig, const char *url) {
|
||||
char *cfgLineBuf = NULL, *name, *value, *value2, *value3, *value4;
|
||||
SJson *pJson = NULL;
|
||||
char *cfgLineBuf = NULL, *buf = NULL, *name, *value, *value2, *value3, *value4;
|
||||
SJson *pJson = NULL;
|
||||
TdFilePtr pFile = NULL;
|
||||
|
||||
int32_t olen, vlen, vlen2, vlen3, vlen4;
|
||||
int32_t code = 0, lino = 0;
|
||||
if (url == NULL || strlen(url) == 0) {
|
||||
|
@ -1490,36 +1470,28 @@ int32_t cfgLoadFromApollUrl(SConfig *pConfig, const char *url) {
|
|||
}
|
||||
|
||||
TdFilePtr pFile = taosOpenFile(filepath, TD_FILE_READ);
|
||||
if (pFile == NULL) {
|
||||
TAOS_CHECK_EXIT(terrno);
|
||||
}
|
||||
TSDB_CHECK_NULL(pFile, code, lino, _exit, terrno);
|
||||
|
||||
size_t fileSize = taosLSeekFile(pFile, 0, SEEK_END);
|
||||
if (fileSize <= 0) {
|
||||
(void)taosCloseFile(&pFile);
|
||||
(void)printf("load json file error: %s\n", filepath);
|
||||
TAOS_CHECK_EXIT(terrno);
|
||||
}
|
||||
char *buf = taosMemoryMalloc(fileSize + 1);
|
||||
if (!buf) {
|
||||
(void)taosCloseFile(&pFile);
|
||||
(void)printf("load json file error: %s, failed to alloc memory\n", filepath);
|
||||
TAOS_RETURN(terrno);
|
||||
code = terrno;
|
||||
goto _exit;
|
||||
}
|
||||
|
||||
buf = taosMemoryMalloc(fileSize + 1);
|
||||
TSDB_CHECK_NULL(buf, code, lino, _exit, terrno);
|
||||
|
||||
buf[fileSize] = 0;
|
||||
if (taosLSeekFile(pFile, 0, SEEK_SET) < 0) {
|
||||
(void)taosCloseFile(&pFile);
|
||||
(void)printf("load json file error: %s\n", filepath);
|
||||
taosMemoryFreeClear(buf);
|
||||
TAOS_RETURN(terrno);
|
||||
code = terrno;
|
||||
goto _exit;
|
||||
}
|
||||
|
||||
if (taosReadFile(pFile, buf, fileSize) <= 0) {
|
||||
(void)taosCloseFile(&pFile);
|
||||
(void)printf("load json file error: %s\n", filepath);
|
||||
taosMemoryFreeClear(buf);
|
||||
TAOS_RETURN(TSDB_CODE_INVALID_DATA_FMT);
|
||||
code = TSDB_CODE_INVALID_DATA_FMT;
|
||||
goto _exit;
|
||||
}
|
||||
(void)taosCloseFile(&pFile);
|
||||
|
||||
pJson = tjsonParse(buf);
|
||||
if (NULL == pJson) {
|
||||
const char *jsonParseError = tjsonGetError();
|
||||
|
@ -1529,7 +1501,6 @@ int32_t cfgLoadFromApollUrl(SConfig *pConfig, const char *url) {
|
|||
taosMemoryFreeClear(buf);
|
||||
TAOS_CHECK_EXIT(TSDB_CODE_INVALID_DATA_FMT);
|
||||
}
|
||||
taosMemoryFreeClear(buf);
|
||||
|
||||
int32_t jsonArraySize = tjsonGetArraySize(pJson);
|
||||
for (int32_t i = 0; i < jsonArraySize; i++) {
|
||||
|
@ -1596,12 +1567,13 @@ int32_t cfgLoadFromApollUrl(SConfig *pConfig, const char *url) {
|
|||
TAOS_RETURN(TSDB_CODE_INVALID_PARA);
|
||||
}
|
||||
|
||||
taosMemoryFree(cfgLineBuf);
|
||||
uInfo("load from apoll url not implemented yet");
|
||||
TAOS_RETURN(TSDB_CODE_SUCCESS);
|
||||
|
||||
_exit:
|
||||
taosMemoryFree(cfgLineBuf);
|
||||
taosMemoryFree(buf);
|
||||
(void)taosCloseFile(&pFile);
|
||||
|
||||
tjsonDelete(pJson);
|
||||
if (code != 0) {
|
||||
(void)printf("failed to load from apollo url:%s at line %d since %s\n", url, lino, tstrerror(code));
|
||||
|
@ -1701,9 +1673,7 @@ struct SConfigIter {
|
|||
|
||||
int32_t cfgCreateIter(SConfig *pConf, SConfigIter **ppIter) {
|
||||
SConfigIter *pIter = taosMemoryCalloc(1, sizeof(SConfigIter));
|
||||
if (pIter == NULL) {
|
||||
TAOS_RETURN(terrno);
|
||||
}
|
||||
if (pIter == NULL) return terrno;
|
||||
|
||||
pIter->pConf = pConf;
|
||||
|
||||
|
@ -1721,14 +1691,10 @@ SConfigItem *cfgNextIter(SConfigIter *pIter) {
|
|||
}
|
||||
|
||||
void cfgDestroyIter(SConfigIter *pIter) {
|
||||
if (pIter == NULL) {
|
||||
return;
|
||||
}
|
||||
if (pIter == NULL) return;
|
||||
|
||||
taosMemoryFree(pIter);
|
||||
}
|
||||
|
||||
SArray *taosGetLocalCfg(SConfig *pCfg) { return pCfg->localArray; }
|
||||
SArray *taosGetGlobalCfg(SConfig *pCfg) { return pCfg->globalArray; }
|
||||
void taosSetLocalCfg(SConfig *pCfg, SArray *pArray) { pCfg->localArray = pArray; };
|
||||
void taosSetGlobalCfg(SConfig *pCfg, SArray *pArray) { pCfg->globalArray = pArray; };
|
|
@ -337,6 +337,12 @@ TEST_F(CfgTest, cfgLoadFromEnvFile) {
|
|||
ASSERT_EQ(code, TSDB_CODE_SUCCESS);
|
||||
ASSERT_NE(pConfig, nullptr);
|
||||
|
||||
EXPECT_EQ(cfgAddBool(pConfig, "test_bool", 0, 0, 0, 0), 0);
|
||||
EXPECT_EQ(cfgAddInt32(pConfig, "test_int32", 1, 0, 16, 0, 0, 0), 0);
|
||||
EXPECT_EQ(cfgAddInt64(pConfig, "test_int64", 2, 0, 16, 0, 0, 0), 0);
|
||||
EXPECT_EQ(cfgAddFloat(pConfig, "test_float", 3, 0, 16, 0, 0, 0), 0);
|
||||
EXPECT_EQ(cfgAddString(pConfig, "test_string", "4", 0, 0, 0), 0);
|
||||
|
||||
TdFilePtr envFile = NULL;
|
||||
const char *envFilePath = TD_TMP_DIR_PATH "envFile";
|
||||
envFile = taosOpenFile(envFilePath, TD_FILE_CREATE | TD_FILE_WRITE | TD_FILE_APPEND);
|
||||
|
@ -355,6 +361,12 @@ TEST_F(CfgTest, cfgLoadFromApollUrl) {
|
|||
ASSERT_EQ(code, TSDB_CODE_SUCCESS);
|
||||
ASSERT_NE(pConfig, nullptr);
|
||||
|
||||
EXPECT_EQ(cfgAddBool(pConfig, "test_bool", 0, 0, 0, 0), 0);
|
||||
EXPECT_EQ(cfgAddInt32(pConfig, "test_int32", 1, 0, 16, 0, 0, 0), 0);
|
||||
EXPECT_EQ(cfgAddInt64(pConfig, "test_int64", 2, 0, 16, 0, 0, 0), 0);
|
||||
EXPECT_EQ(cfgAddFloat(pConfig, "test_float", 3, 0, 16, 0, 0, 0), 0);
|
||||
EXPECT_EQ(cfgAddString(pConfig, "test_string", "4", 0, 0, 0), 0);
|
||||
|
||||
TdFilePtr jsonFile = NULL;
|
||||
const char *jsonFilePath = TD_TMP_DIR_PATH "envJson.json";
|
||||
jsonFile = taosOpenFile(jsonFilePath, TD_FILE_CREATE | TD_FILE_WRITE | TD_FILE_APPEND);
|
||||
|
|
|
@ -2298,23 +2298,4 @@ TEST(functionsTest, internalFunc) {
|
|||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
int main(int argc, char** argv) {
|
||||
taosSeedRand(taosGetTimestampSec());
|
||||
mptInit();
|
||||
testing::InitGoogleTest(&argc, argv);
|
||||
return RUN_ALL_TESTS();
|
||||
}
|
||||
|
||||
|
||||
|
||||
#pragma GCC diagnosti
|
||||
|
|
Loading…
Reference in New Issue