diff --git a/source/dnode/mnode/impl/src/mndTrans.c b/source/dnode/mnode/impl/src/mndTrans.c index 49d1a4ca97..6417e6564e 100644 --- a/source/dnode/mnode/impl/src/mndTrans.c +++ b/source/dnode/mnode/impl/src/mndTrans.c @@ -548,8 +548,7 @@ static int32_t mndTransActionUpdate(SSdb *pSdb, STrans *pOld, STrans *pNew) { pOld->id, pOld, mndTransStr(pOld->stage), pOld->createdTime, pNew, mndTransStr(pNew->stage), pNew->createdTime); // only occured while sync timeout - terrno = TSDB_CODE_MND_TRANS_SYNC_TIMEOUT; - return -1; + TAOS_RETURN(TSDB_CODE_MND_TRANS_SYNC_TIMEOUT); } mndTransUpdateActions(pOld->prepareActions, pNew->prepareActions); @@ -667,8 +666,7 @@ static int32_t mndTransAppendAction(SArray *pArray, STransAction *pAction) { void *ptr = taosArrayPush(pArray, pAction); if (ptr == NULL) { - terrno = TSDB_CODE_OUT_OF_MEMORY; - return -1; + TAOS_RETURN(TSDB_CODE_OUT_OF_MEMORY); } return 0; @@ -779,26 +777,29 @@ void mndTransSetChangeless(STrans *pTrans) { pTrans->changeless = true; } void mndTransSetOper(STrans *pTrans, EOperType oper) { pTrans->oper = oper; } static int32_t mndTransSync(SMnode *pMnode, STrans *pTrans) { + int32_t code = 0; SSdbRaw *pRaw = mndTransEncode(pTrans); if (pRaw == NULL) { - mError("trans:%d, failed to encode while sync trans since %s", pTrans->id, terrstr()); - return -1; + code = TSDB_CODE_MND_RETURN_VALUE_NULL; + if (terrno != 0) code = terrno; + mError("trans:%d, failed to encode while sync trans since %s", pTrans->id, tstrerror(code)); + TAOS_RETURN(code); } (void)sdbSetRawStatus(pRaw, SDB_STATUS_READY); mInfo("trans:%d, sync to other mnodes, stage:%s createTime:%" PRId64, pTrans->id, mndTransStr(pTrans->stage), pTrans->createdTime); - int32_t code = mndSyncPropose(pMnode, pRaw, pTrans->id); + code = mndSyncPropose(pMnode, pRaw, pTrans->id); if (code != 0) { - mError("trans:%d, failed to sync, errno:%s code:0x%x createTime:%" PRId64 " saved trans:%d", pTrans->id, terrstr(), - code, pTrans->createdTime, pMnode->syncMgmt.transId); + mError("trans:%d, failed to sync, errno:%s code:0x%x createTime:%" PRId64 " saved trans:%d", pTrans->id, + tstrerror(code), code, pTrans->createdTime, pMnode->syncMgmt.transId); sdbFreeRaw(pRaw); - return -1; + TAOS_RETURN(code); } sdbFreeRaw(pRaw); mInfo("trans:%d, sync finished, createTime:%" PRId64, pTrans->id, pTrans->createdTime); - return 0; + TAOS_RETURN(code); } static bool mndCheckDbConflict(const char *conflict, STrans *pTrans) { @@ -890,24 +891,26 @@ static bool mndCheckTransConflict(SMnode *pMnode, STrans *pNew) { } int32_t mndTransCheckConflict(SMnode *pMnode, STrans *pTrans) { + int32_t code = 0; if (pTrans->conflict == TRN_CONFLICT_DB || pTrans->conflict == TRN_CONFLICT_DB_INSIDE) { if (strlen(pTrans->dbname) == 0 && strlen(pTrans->stbname) == 0) { - terrno = TSDB_CODE_MND_TRANS_CONFLICT; + code = TSDB_CODE_MND_TRANS_CONFLICT; mError("trans:%d, failed to prepare conflict db not set", pTrans->id); - return -1; + TAOS_RETURN(code); } } if (mndCheckTransConflict(pMnode, pTrans)) { - terrno = TSDB_CODE_MND_TRANS_CONFLICT; - mError("trans:%d, failed to prepare since %s", pTrans->id, terrstr()); - return terrno; + code = TSDB_CODE_MND_TRANS_CONFLICT; + mError("trans:%d, failed to prepare since %s", pTrans->id, tstrerror(code)); + TAOS_RETURN(code); } - return 0; + TAOS_RETURN(code); } int32_t mndTransCheckConflictWithCompact(SMnode *pMnode, STrans *pTrans) { + int32_t code = 0; void *pIter = NULL; bool conflict = false; SCompactObj *pCompact = NULL; @@ -934,12 +937,12 @@ int32_t mndTransCheckConflictWithCompact(SMnode *pMnode, STrans *pTrans) { } if (conflict) { - terrno = TSDB_CODE_MND_TRANS_CONFLICT_COMPACT; - mError("trans:%d, failed to prepare since %s", pTrans->id, terrstr()); - return terrno; + code = TSDB_CODE_MND_TRANS_CONFLICT_COMPACT; + mError("trans:%d, failed to prepare since %s", pTrans->id, tstrerror(code)); + TAOS_RETURN(code); } - return 0; + TAOS_RETURN(code); } static bool mndTransActionsOfSameType(SArray *pActions) { @@ -960,66 +963,65 @@ static bool mndTransActionsOfSameType(SArray *pActions) { } static int32_t mndTransCheckParallelActions(SMnode *pMnode, STrans *pTrans) { + int32_t code = 0; if (pTrans->exec == TRN_EXEC_PARALLEL) { if (mndTransActionsOfSameType(pTrans->redoActions) == false) { - terrno = TSDB_CODE_MND_TRANS_INVALID_STAGE; + code = TSDB_CODE_MND_TRANS_INVALID_STAGE; mError("trans:%d, types of parallel redo actions are not the same", pTrans->id); - return -1; + TAOS_RETURN(code); } if (pTrans->policy == TRN_POLICY_ROLLBACK) { if (mndTransActionsOfSameType(pTrans->undoActions) == false) { - terrno = TSDB_CODE_MND_TRANS_INVALID_STAGE; + code = TSDB_CODE_MND_TRANS_INVALID_STAGE; mError("trans:%d, types of parallel undo actions are not the same", pTrans->id); - return -1; + TAOS_RETURN(code); } } } - return 0; + TAOS_RETURN(code); } static int32_t mndTransCheckCommitActions(SMnode *pMnode, STrans *pTrans) { + int32_t code = 0; if (!pTrans->changeless && taosArrayGetSize(pTrans->commitActions) <= 0) { - terrno = TSDB_CODE_MND_TRANS_CLOG_IS_NULL; + code = TSDB_CODE_MND_TRANS_CLOG_IS_NULL; mError("trans:%d, commit actions of non-changeless trans are empty", pTrans->id); - return -1; + TAOS_RETURN(code); } if (mndTransActionsOfSameType(pTrans->commitActions) == false) { - terrno = TSDB_CODE_MND_TRANS_INVALID_STAGE; + code = TSDB_CODE_MND_TRANS_INVALID_STAGE; mError("trans:%d, types of commit actions are not the same", pTrans->id); - return -1; + TAOS_RETURN(code); } - return 0; + TAOS_RETURN(code); } int32_t mndTransPrepare(SMnode *pMnode, STrans *pTrans) { + int32_t code = 0; if (pTrans == NULL) return -1; - if (mndTransCheckConflict(pMnode, pTrans) != 0) { - return -1; - } + TAOS_CHECK_RETURN(mndTransCheckConflict(pMnode, pTrans)); - if (mndTransCheckParallelActions(pMnode, pTrans) != 0) { - return -1; - } + TAOS_CHECK_RETURN(mndTransCheckParallelActions(pMnode, pTrans)); - if (mndTransCheckCommitActions(pMnode, pTrans) != 0) { - return -1; - } + TAOS_CHECK_RETURN(mndTransCheckCommitActions(pMnode, pTrans)); mInfo("trans:%d, prepare transaction", pTrans->id); - if (mndTransSync(pMnode, pTrans) != 0) { - mError("trans:%d, failed to prepare since %s", pTrans->id, terrstr()); - return -1; + if ((code = mndTransSync(pMnode, pTrans)) != 0) { + mError("trans:%d, failed to prepare since %s", pTrans->id, tstrerror(code)); + TAOS_RETURN(code); } mInfo("trans:%d, prepare finished", pTrans->id); STrans *pNew = mndAcquireTrans(pMnode, pTrans->id); if (pNew == NULL) { - mError("trans:%d, failed to read from sdb since %s", pTrans->id, terrstr()); - return -1; + code = TSDB_CODE_MND_RETURN_VALUE_NULL; + if (terrno != 0) code = terrno; + mError("trans:%d, failed to read from sdb since %s", pTrans->id, tstrerror(code)); + TAOS_RETURN(code); } pNew->pRpcArray = pTrans->pRpcArray; @@ -1032,37 +1034,41 @@ int32_t mndTransPrepare(SMnode *pMnode, STrans *pTrans) { mndTransExecute(pMnode, pNew); mndReleaseTrans(pMnode, pNew); + // TDOD change to TAOS_RETURN(code); return 0; } static int32_t mndTransCommit(SMnode *pMnode, STrans *pTrans) { + int32_t code = 0; mInfo("trans:%d, commit transaction", pTrans->id); - if (mndTransSync(pMnode, pTrans) != 0) { - mError("trans:%d, failed to commit since %s", pTrans->id, terrstr()); - return -1; + if ((code = mndTransSync(pMnode, pTrans)) != 0) { + mError("trans:%d, failed to commit since %s", pTrans->id, tstrerror(code)); + TAOS_RETURN(code); } mInfo("trans:%d, commit finished", pTrans->id); - return 0; + TAOS_RETURN(code); } static int32_t mndTransRollback(SMnode *pMnode, STrans *pTrans) { + int32_t code = 0; mInfo("trans:%d, rollback transaction", pTrans->id); - if (mndTransSync(pMnode, pTrans) != 0) { - mError("trans:%d, failed to rollback since %s", pTrans->id, terrstr()); - return -1; + if ((code = mndTransSync(pMnode, pTrans)) != 0) { + mError("trans:%d, failed to rollback since %s", pTrans->id, tstrerror(code)); + TAOS_RETURN(code); } mInfo("trans:%d, rollback finished", pTrans->id); - return 0; + TAOS_RETURN(code); } static int32_t mndTransPreFinish(SMnode *pMnode, STrans *pTrans) { + int32_t code = 0; mInfo("trans:%d, pre-finish transaction", pTrans->id); - if (mndTransSync(pMnode, pTrans) != 0) { - mError("trans:%d, failed to pre-finish since %s", pTrans->id, terrstr()); - return -1; + if ((code = mndTransSync(pMnode, pTrans)) != 0) { + mError("trans:%d, failed to pre-finish since %s", pTrans->id, tstrerror(code)); + TAOS_RETURN(code); } mInfo("trans:%d, pre-finish finished", pTrans->id); - return 0; + TAOS_RETURN(code); } static void mndTransSendRpcRsp(SMnode *pMnode, STrans *pTrans) { @@ -1168,6 +1174,7 @@ static void mndTransSendRpcRsp(SMnode *pMnode, STrans *pTrans) { } int32_t mndTransProcessRsp(SRpcMsg *pRsp) { + int32_t code = 0; SMnode *pMnode = pRsp->info.node; int64_t signature = (int64_t)(pRsp->info.ahandle); int32_t transId = (int32_t)(signature >> 32); @@ -1175,7 +1182,9 @@ int32_t mndTransProcessRsp(SRpcMsg *pRsp) { STrans *pTrans = mndAcquireTrans(pMnode, transId); if (pTrans == NULL) { - mError("trans:%d, failed to get transId from vnode rsp since %s", transId, terrstr()); + code = TSDB_CODE_MND_RETURN_VALUE_NULL; + if (terrno != 0) code = terrno; + mError("trans:%d, failed to get transId from vnode rsp since %s", transId, tstrerror(code)); goto _OVER; } @@ -1216,7 +1225,7 @@ int32_t mndTransProcessRsp(SRpcMsg *pRsp) { _OVER: mndReleaseTrans(pMnode, pTrans); - return 0; + TAOS_RETURN(code); } static void mndTransResetAction(SMnode *pMnode, STrans *pTrans, STransAction *pAction) { @@ -1252,8 +1261,7 @@ static void mndTransResetActions(SMnode *pMnode, STrans *pTrans, SArray *pArray) static int32_t mndTransWriteSingleLog(SMnode *pMnode, STrans *pTrans, STransAction *pAction, bool topHalf) { if (pAction->rawWritten) return 0; if (topHalf) { - terrno = TSDB_CODE_MND_TRANS_CTX_SWITCH; - return TSDB_CODE_MND_TRANS_CTX_SWITCH; + TAOS_RETURN(TSDB_CODE_MND_TRANS_CTX_SWITCH); } int32_t code = sdbWriteWithoutFree(pMnode->pSdb, pAction->pRaw); @@ -1272,15 +1280,14 @@ static int32_t mndTransWriteSingleLog(SMnode *pMnode, STrans *pTrans, STransActi mndSetTransLastAction(pTrans, pAction); } - return code; + TAOS_RETURN(code); } // execute at top half static int32_t mndTransSendSingleMsg(SMnode *pMnode, STrans *pTrans, STransAction *pAction, bool topHalf) { if (pAction->msgSent) return 0; if (mndCannotExecuteTransAction(pMnode, topHalf)) { - terrno = TSDB_CODE_MND_TRANS_CTX_SWITCH; - return TSDB_CODE_MND_TRANS_CTX_SWITCH; + TAOS_RETURN(TSDB_CODE_MND_TRANS_CTX_SWITCH); } int64_t signature = pTrans->id; @@ -1324,7 +1331,7 @@ static int32_t mndTransSendSingleMsg(SMnode *pMnode, STrans *pTrans, STransActio mndSetTransLastAction(pTrans, pAction); } - return code; + TAOS_RETURN(code); } static int32_t mndTransExecNullMsg(SMnode *pMnode, STrans *pTrans, STransAction *pAction, bool topHalf) { @@ -1822,8 +1829,7 @@ int32_t mndKillTrans(SMnode *pMnode, STrans *pTrans) { } else if (pTrans->stage == TRN_STAGE_UNDO_ACTION) { pArray = pTrans->undoActions; } else { - terrno = TSDB_CODE_MND_TRANS_INVALID_STAGE; - return -1; + TAOS_RETURN(TSDB_CODE_MND_TRANS_INVALID_STAGE); } for (int32_t i = 0; i < taosArrayGetSize(pArray); ++i) { @@ -1846,17 +1852,19 @@ static int32_t mndProcessKillTransReq(SRpcMsg *pReq) { STrans *pTrans = NULL; if (tDeserializeSKillTransReq(pReq->pCont, pReq->contLen, &killReq) != 0) { - terrno = TSDB_CODE_INVALID_MSG; + code = TSDB_CODE_INVALID_MSG; goto _OVER; } mInfo("trans:%d, start to kill", killReq.transId); - if (mndCheckOperPrivilege(pMnode, pReq->info.conn.user, MND_OPER_KILL_TRANS) != 0) { + if ((code = mndCheckOperPrivilege(pMnode, pReq->info.conn.user, MND_OPER_KILL_TRANS)) != 0) { goto _OVER; } pTrans = mndAcquireTrans(pMnode, killReq.transId); if (pTrans == NULL) { + code = TSDB_CODE_MND_RETURN_VALUE_NULL; + if (terrno != 0) code = terrno; goto _OVER; } @@ -1868,7 +1876,7 @@ _OVER: } mndReleaseTrans(pMnode, pTrans); - return code; + TAOS_RETURN(code); } static int32_t mndCompareTransId(int32_t *pTransId1, int32_t *pTransId2) { return *pTransId1 >= *pTransId2 ? 1 : 0; } diff --git a/source/dnode/vnode/src/meta/metaQuery.c b/source/dnode/vnode/src/meta/metaQuery.c index 062c019d48..e4a04047f1 100644 --- a/source/dnode/vnode/src/meta/metaQuery.c +++ b/source/dnode/vnode/src/meta/metaQuery.c @@ -48,27 +48,23 @@ void metaReaderClear(SMetaReader *pReader) { } int metaGetTableEntryByVersion(SMetaReader *pReader, int64_t version, tb_uid_t uid) { + int32_t code = 0; SMeta *pMeta = pReader->pMeta; STbDbKey tbDbKey = {.version = version, .uid = uid}; // query table.db if (tdbTbGet(pMeta->pTbDb, &tbDbKey, sizeof(tbDbKey), &pReader->pBuf, &pReader->szBuf) < 0) { - terrno = TSDB_CODE_PAR_TABLE_NOT_EXIST; - goto _err; + return terrno = TSDB_CODE_PAR_TABLE_NOT_EXIST; } // decode the entry tDecoderInit(&pReader->coder, pReader->pBuf, pReader->szBuf); - if (metaDecodeEntry(&pReader->coder, &pReader->me) < 0) { - goto _err; - } + code = metaDecodeEntry(&pReader->coder, &pReader->me); + if (code) return code; // taosMemoryFreeClear(pReader->me.colCmpr.pColCmpr); return 0; - -_err: - return -1; } bool metaIsTableExist(void *pVnode, tb_uid_t uid) { @@ -90,8 +86,7 @@ int metaReaderGetTableEntryByUid(SMetaReader *pReader, tb_uid_t uid) { // query uid.idx if (tdbTbGet(pMeta->pUidIdx, &uid, sizeof(uid), &pReader->pBuf, &pReader->szBuf) < 0) { - terrno = TSDB_CODE_PAR_TABLE_NOT_EXIST; - return -1; + return terrno = TSDB_CODE_PAR_TABLE_NOT_EXIST; } version1 = ((SUidIdxVal *)pReader->pBuf)[0].version; @@ -103,8 +98,7 @@ int metaReaderGetTableEntryByUidCache(SMetaReader *pReader, tb_uid_t uid) { SMetaInfo info; if (metaGetInfo(pMeta, uid, &info, pReader) == TSDB_CODE_NOT_FOUND) { - terrno = TSDB_CODE_PAR_TABLE_NOT_EXIST; - return -1; + return terrno = TSDB_CODE_PAR_TABLE_NOT_EXIST; } return metaGetTableEntryByVersion(pReader, info.version, uid); @@ -116,8 +110,7 @@ int metaGetTableEntryByName(SMetaReader *pReader, const char *name) { // query name.idx if (tdbTbGet(pMeta->pNameIdx, name, strlen(name) + 1, &pReader->pBuf, &pReader->szBuf) < 0) { - terrno = TSDB_CODE_PAR_TABLE_NOT_EXIST; - return -1; + return terrno = TSDB_CODE_PAR_TABLE_NOT_EXIST; } uid = *(tb_uid_t *)pReader->pBuf; @@ -148,7 +141,7 @@ int metaGetTableNameByUid(void *pVnode, uint64_t uid, char *tbName) { code = metaReaderGetTableEntryByUid(&mr, uid); if (code < 0) { metaReaderClear(&mr); - return -1; + return code; } STR_TO_VARSTR(tbName, mr.me.name); @@ -164,7 +157,7 @@ int metaGetTableSzNameByUid(void *meta, uint64_t uid, char *tbName) { code = metaReaderGetTableEntryByUid(&mr, uid); if (code < 0) { metaReaderClear(&mr); - return -1; + return code; } strncpy(tbName, mr.me.name, TSDB_TABLE_NAME_LEN); metaReaderClear(&mr); @@ -181,9 +174,8 @@ int metaGetTableUidByName(void *pVnode, char *tbName, uint64_t *uid) { // query name.idx if (tdbTbGet(((SMeta *)pReader->pMeta)->pNameIdx, tbName, strlen(tbName) + 1, &pReader->pBuf, &pReader->szBuf) < 0) { - terrno = TSDB_CODE_PAR_TABLE_NOT_EXIST; metaReaderClear(&mr); - return -1; + return terrno = TSDB_CODE_PAR_TABLE_NOT_EXIST; } *uid = *(tb_uid_t *)pReader->pBuf; diff --git a/source/dnode/vnode/src/meta/metaSma.c b/source/dnode/vnode/src/meta/metaSma.c index c61725e834..371cc6ff21 100644 --- a/source/dnode/vnode/src/meta/metaSma.c +++ b/source/dnode/vnode/src/meta/metaSma.c @@ -13,9 +13,8 @@ * along with this program. If not, see . */ -#include "vnodeInt.h" #include "meta.h" - +#include "vnodeInt.h" static int metaHandleSmaEntry(SMeta *pMeta, const SMetaEntry *pME); static int metaSaveSmaToDB(SMeta *pMeta, const SMetaEntry *pME); @@ -34,15 +33,15 @@ int32_t metaCreateTSma(SMeta *pMeta, int64_t version, SSmaCfg *pCfg) { int32_t szBuf = 0; void *p = NULL; SMetaReader mr = {0}; + int32_t code = 0; // validate req // save smaIndex metaReaderDoInit(&mr, pMeta, META_READER_LOCK); if (metaReaderGetTableEntryByUidCache(&mr, pCfg->indexUid) == 0) { #if 1 - terrno = TSDB_CODE_TSMA_ALREADY_EXIST; metaReaderClear(&mr); - return -1; // don't goto _err; + return terrno = TSDB_CODE_TSMA_ALREADY_EXIST; #else metaReaderClear(&mr); return 0; @@ -57,7 +56,8 @@ int32_t metaCreateTSma(SMeta *pMeta, int64_t version, SSmaCfg *pCfg) { me.name = pCfg->indexName; me.smaEntry.tsma = pCfg; - if (metaHandleSmaEntry(pMeta, &me) < 0) goto _err; + code = metaHandleSmaEntry(pMeta, &me); + if (code) goto _err; metaDebug("vgId:%d, tsma is created, name:%s uid:%" PRId64, TD_VID(pMeta->pVnode), pCfg->indexName, pCfg->indexUid); @@ -66,7 +66,7 @@ int32_t metaCreateTSma(SMeta *pMeta, int64_t version, SSmaCfg *pCfg) { _err: metaError("vgId:%d, failed to create tsma:%s uid:%" PRId64 " since %s", TD_VID(pMeta->pVnode), pCfg->indexName, pCfg->indexUid, tstrerror(terrno)); - return -1; + return code; } int32_t metaDropTSma(SMeta *pMeta, int64_t indexUid) { @@ -147,24 +147,25 @@ static int metaUpdateSmaIdx(SMeta *pMeta, const SMetaEntry *pME) { } static int metaHandleSmaEntry(SMeta *pMeta, const SMetaEntry *pME) { + int32_t code = 0; metaWLock(pMeta); // save to table.db - if (metaSaveSmaToDB(pMeta, pME) < 0) goto _err; + if ((code = metaSaveSmaToDB(pMeta, pME)) < 0) goto _err; // update uid.idx - if (metaUpdateUidIdx(pMeta, pME) < 0) goto _err; + if ((code = metaUpdateUidIdx(pMeta, pME)) < 0) goto _err; // update name.idx - if (metaUpdateNameIdx(pMeta, pME) < 0) goto _err; + if ((code = metaUpdateNameIdx(pMeta, pME)) < 0) goto _err; // update sma.idx - if (metaUpdateSmaIdx(pMeta, pME) < 0) goto _err; + if ((code = metaUpdateSmaIdx(pMeta, pME)) < 0) goto _err; metaULock(pMeta); return 0; _err: metaULock(pMeta); - return -1; + return code; } diff --git a/source/dnode/vnode/src/meta/metaSnapshot.c b/source/dnode/vnode/src/meta/metaSnapshot.c index 1747e05848..b8043c00de 100644 --- a/source/dnode/vnode/src/meta/metaSnapshot.c +++ b/source/dnode/vnode/src/meta/metaSnapshot.c @@ -32,7 +32,7 @@ int32_t metaSnapReaderOpen(SMeta* pMeta, int64_t sver, int64_t ever, SMetaSnapRe // alloc pReader = (SMetaSnapReader*)taosMemoryCalloc(1, sizeof(*pReader)); if (pReader == NULL) { - TSDB_CHECK_CODE(code = TSDB_CODE_OUT_OF_MEMORY, lino, _exit); + TSDB_CHECK_CODE(code = terrno, lino, _exit); } pReader->pMeta = pMeta; pReader->sver = sver; diff --git a/source/dnode/vnode/src/meta/metaTable.c b/source/dnode/vnode/src/meta/metaTable.c index e40478eec2..52151e76d6 100644 --- a/source/dnode/vnode/src/meta/metaTable.c +++ b/source/dnode/vnode/src/meta/metaTable.c @@ -36,11 +36,15 @@ static int metaDeleteBtimeIdx(SMeta *pMeta, const SMetaEntry *pME); static int metaUpdateNcolIdx(SMeta *pMeta, const SMetaEntry *pME); static int metaDeleteNcolIdx(SMeta *pMeta, const SMetaEntry *pME); -int8_t updataTableColCmpr(SColCmprWrapper *pWp, SSchema *pSchema, int8_t add, uint32_t compress) { +static int32_t updataTableColCmpr(SColCmprWrapper *pWp, SSchema *pSchema, int8_t add, uint32_t compress) { int32_t nCols = pWp->nCols; int32_t ver = pWp->version; if (add) { SColCmpr *p = taosMemoryCalloc(1, sizeof(SColCmpr) * (nCols + 1)); + if (p == NULL) { + return terrno; + } + memcpy(p, pWp->pColCmpr, sizeof(SColCmpr) * nCols); SColCmpr *pCol = p + nCols; @@ -64,7 +68,7 @@ int8_t updataTableColCmpr(SColCmprWrapper *pWp, SSchema *pSchema, int8_t add, ui pWp->nCols = nCols; pWp->version = ver; } - return 1; + return 0; } static void metaGetEntryInfo(const SMetaEntry *pEntry, SMetaInfo *pInfo) { pInfo->uid = pEntry->uid; @@ -87,8 +91,7 @@ static int metaUpdateMetaRsp(tb_uid_t uid, char *tbName, SSchemaWrapper *pSchema pMetaRsp->pSchemas = taosMemoryMalloc(pSchema->nCols * sizeof(SSchema)); if (NULL == pMetaRsp->pSchemas) { - terrno = TSDB_CODE_OUT_OF_MEMORY; - return -1; + return terrno = TSDB_CODE_OUT_OF_MEMORY; } pMetaRsp->pSchemaExt = taosMemoryMalloc(pSchema->nCols * sizeof(SSchemaExt)); @@ -105,9 +108,11 @@ static int metaUpdateMetaRsp(tb_uid_t uid, char *tbName, SSchemaWrapper *pSchema } static int metaSaveJsonVarToIdx(SMeta *pMeta, const SMetaEntry *pCtbEntry, const SSchema *pSchema) { + int32_t code = 0; + #ifdef USE_INVERTED_INDEX if (pMeta->pTagIvtIdx == NULL || pCtbEntry == NULL) { - return -1; + return TSDB_CODE_INVALID_PARA; } void *data = pCtbEntry->ctbEntry.pTags; const char *tagName = pSchema->name; @@ -118,8 +123,9 @@ static int metaSaveJsonVarToIdx(SMeta *pMeta, const SMetaEntry *pCtbEntry, const int32_t nTagData = 0; SArray *pTagVals = NULL; - if (tTagToValArray((const STag *)data, &pTagVals) != 0) { - return -1; + code = tTagToValArray((const STag *)data, &pTagVals); + if (code) { + return code; } SIndexMultiTerm *terms = indexMultiTermCreate(); @@ -168,7 +174,7 @@ static int metaSaveJsonVarToIdx(SMeta *pMeta, const SMetaEntry *pCtbEntry, const int metaDelJsonVarFromIdx(SMeta *pMeta, const SMetaEntry *pCtbEntry, const SSchema *pSchema) { #ifdef USE_INVERTED_INDEX if (pMeta->pTagIvtIdx == NULL || pCtbEntry == NULL) { - return -1; + return TSDB_CODE_INVALID_PARA; } void *data = pCtbEntry->ctbEntry.pTags; const char *tagName = pSchema->name; @@ -179,8 +185,9 @@ int metaDelJsonVarFromIdx(SMeta *pMeta, const SMetaEntry *pCtbEntry, const SSche int32_t nTagData = 0; SArray *pTagVals = NULL; - if (tTagToValArray((const STag *)data, &pTagVals) != 0) { - return -1; + int32_t code = tTagToValArray((const STag *)data, &pTagVals); + if (code) { + return code; } SIndexMultiTerm *terms = indexMultiTermCreate(); @@ -247,6 +254,7 @@ int metaCreateSTable(SMeta *pMeta, int64_t version, SVCreateStbReq *pReq) { void *pBuf = NULL; int32_t szBuf = 0; void *p = NULL; + int32_t code = 0; // validate req void *pData = NULL; @@ -256,14 +264,12 @@ int metaCreateSTable(SMeta *pMeta, int64_t version, SVCreateStbReq *pReq) { tdbFree(pData); SMetaInfo info; if (metaGetInfo(pMeta, uid, &info, NULL) == TSDB_CODE_NOT_FOUND) { - terrno = TSDB_CODE_PAR_TABLE_NOT_EXIST; - return -1; + return terrno = TSDB_CODE_PAR_TABLE_NOT_EXIST; } if (info.uid == info.suid) { return 0; } else { - terrno = TSDB_CODE_TDB_TABLE_ALREADY_EXIST; - return -1; + return terrno = TSDB_CODE_TDB_TABLE_ALREADY_EXIST; } } @@ -283,7 +289,8 @@ int metaCreateSTable(SMeta *pMeta, int64_t version, SVCreateStbReq *pReq) { me.colCmpr = pReq->colCmpr; } - if (metaHandleEntry(pMeta, &me) < 0) goto _err; + code = metaHandleEntry(pMeta, &me); + if (code) goto _err; ++pMeta->pVnode->config.vndStats.numOfSTables; @@ -295,7 +302,7 @@ int metaCreateSTable(SMeta *pMeta, int64_t version, SVCreateStbReq *pReq) { _err: metaError("vgId:%d, failed to create stb:%s uid:%" PRId64 " since %s", TD_VID(pMeta->pVnode), pReq->name, pReq->suid, tstrerror(terrno)); - return -1; + return code; } int metaDropSTable(SMeta *pMeta, int64_t verison, SVDropStbReq *pReq, SArray *tbUidList) { @@ -310,8 +317,7 @@ int metaDropSTable(SMeta *pMeta, int64_t verison, SVDropStbReq *pReq, SArray *tb rc = tdbTbGet(pMeta->pNameIdx, pReq->name, strlen(pReq->name) + 1, &pData, &nData); if (rc < 0 || *(tb_uid_t *)pData != pReq->suid) { tdbFree(pData); - terrno = TSDB_CODE_TDB_STB_NOT_EXIST; - return -1; + return terrno = TSDB_CODE_TDB_STB_NOT_EXIST; } // drop all child tables @@ -424,16 +430,14 @@ int metaAlterSTable(SMeta *pMeta, int64_t version, SVCreateStbReq *pReq) { if (ret < 0 || c) { tdbTbcClose(pUidIdxc); - terrno = TSDB_CODE_TDB_STB_NOT_EXIST; - return -1; + return terrno = TSDB_CODE_TDB_STB_NOT_EXIST; } ret = tdbTbcGet(pUidIdxc, NULL, NULL, &pData, &nData); if (ret < 0) { tdbTbcClose(pUidIdxc); - terrno = TSDB_CODE_TDB_STB_NOT_EXIST; - return -1; + return terrno = TSDB_CODE_TDB_STB_NOT_EXIST; } oversion = ((SUidIdxVal *)pData)[0].version; @@ -444,9 +448,8 @@ int metaAlterSTable(SMeta *pMeta, int64_t version, SVCreateStbReq *pReq) { tdbTbcClose(pUidIdxc); tdbTbcClose(pTbDbc); - terrno = TSDB_CODE_TDB_STB_NOT_EXIST; metaError("meta/table: invalide ret: %" PRId32 " or c: %" PRId32 "alter stb failed.", ret, c); - return -1; + return terrno = TSDB_CODE_TDB_STB_NOT_EXIST; } ret = tdbTbcGet(pTbDbc, NULL, NULL, &pData, &nData); @@ -454,8 +457,7 @@ int metaAlterSTable(SMeta *pMeta, int64_t version, SVCreateStbReq *pReq) { tdbTbcClose(pUidIdxc); tdbTbcClose(pTbDbc); - terrno = TSDB_CODE_TDB_STB_NOT_EXIST; - return -1; + return terrno = TSDB_CODE_TDB_STB_NOT_EXIST; } oStbEntry.pBuf = taosMemoryMalloc(nData); @@ -870,8 +872,7 @@ int metaCreateTable(SMeta *pMeta, int64_t ver, SVCreateTbReq *pReq, STableMetaRs if (pReq->type == TSDB_CHILD_TABLE) { tb_uid_t suid = metaGetTableEntryUidByName(pMeta, pReq->ctb.stbName); if (suid != pReq->ctb.suid) { - terrno = TSDB_CODE_PAR_TABLE_NOT_EXIST; - return -1; + return terrno = TSDB_CODE_PAR_TABLE_NOT_EXIST; } } @@ -879,17 +880,15 @@ int metaCreateTable(SMeta *pMeta, int64_t ver, SVCreateTbReq *pReq, STableMetaRs metaReaderDoInit(&mr, pMeta, META_READER_LOCK); if (metaGetTableEntryByName(&mr, pReq->name) == 0) { if (pReq->type == TSDB_CHILD_TABLE && pReq->ctb.suid != mr.me.ctbEntry.suid) { - terrno = TSDB_CODE_TDB_TABLE_IN_OTHER_STABLE; metaReaderClear(&mr); - return -1; + return terrno = TSDB_CODE_TDB_TABLE_IN_OTHER_STABLE; } pReq->uid = mr.me.uid; if (pReq->type == TSDB_CHILD_TABLE) { pReq->ctb.suid = mr.me.ctbEntry.suid; } - terrno = TSDB_CODE_TDB_TABLE_ALREADY_EXIST; metaReaderClear(&mr); - return -1; + return terrno = TSDB_CODE_TDB_TABLE_ALREADY_EXIST; } else if (terrno == TSDB_CODE_PAR_TABLE_NOT_EXIST) { terrno = TSDB_CODE_SUCCESS; } @@ -1001,7 +1000,7 @@ int metaCreateTable(SMeta *pMeta, int64_t ver, SVCreateTbReq *pReq, STableMetaRs _err: metaError("vgId:%d, failed to create table:%s type:%s since %s", TD_VID(pMeta->pVnode), pReq->name, pReq->type == TSDB_CHILD_TABLE ? "child table" : "normal table", tstrerror(terrno)); - return -1; + return TSDB_CODE_FAILED; } int metaDropTable(SMeta *pMeta, int64_t version, SVDropTbReq *pReq, SArray *tbUids, tb_uid_t *tbUid) { @@ -1015,8 +1014,7 @@ int metaDropTable(SMeta *pMeta, int64_t version, SVDropTbReq *pReq, SArray *tbUi rc = tdbTbGet(pMeta->pNameIdx, pReq->name, strlen(pReq->name) + 1, &pData, &nData); if (rc < 0) { - terrno = TSDB_CODE_TDB_TABLE_NOT_EXIST; - return -1; + return terrno = TSDB_CODE_TDB_TABLE_NOT_EXIST; } uid = *(tb_uid_t *)pData; @@ -1154,7 +1152,7 @@ int32_t metaTrimTables(SMeta *pMeta) { SArray *tbUids = taosArrayInit(8, sizeof(int64_t)); if (tbUids == NULL) { - return TSDB_CODE_OUT_OF_MEMORY; + return terrno; } code = metaFilterTableByHash(pMeta, tbUids); @@ -1195,7 +1193,7 @@ static int metaBuildBtimeIdxKey(SBtimeIdxKey *btimeKey, const SMetaEntry *pME) { } else if (pME->type == TSDB_NORMAL_TABLE) { btime = pME->ntbEntry.btime; } else { - return -1; + return TSDB_CODE_FAILED; } btimeKey->btime = btime; @@ -1208,7 +1206,7 @@ static int metaBuildNColIdxKey(SNcolIdxKey *ncolKey, const SMetaEntry *pME) { ncolKey->ncol = pME->ntbEntry.schemaRow.nCols; ncolKey->uid = pME->uid; } else { - return -1; + return TSDB_CODE_FAILED; } return 0; } @@ -1235,7 +1233,7 @@ static int metaDropTableByUid(SMeta *pMeta, tb_uid_t uid, int *type, tb_uid_t *p rc = tdbTbGet(pMeta->pUidIdx, &uid, sizeof(uid), &pData, &nData); if (rc < 0) { - return -1; + return rc; } int64_t version = ((SUidIdxVal *)pData)[0].version; @@ -1245,7 +1243,7 @@ static int metaDropTableByUid(SMeta *pMeta, tb_uid_t uid, int *type, tb_uid_t *p rc = metaDecodeEntry(&dc, &e); if (rc < 0) { tDecoderClear(&dc); - return -1; + return rc; } if (type) *type = e.type; @@ -1408,16 +1406,14 @@ static int metaAlterTableColumn(SMeta *pMeta, int64_t version, SVAlterTbReq *pAl int c; bool freeColCmpr = false; if (pAlterTbReq->colName == NULL) { - terrno = TSDB_CODE_INVALID_MSG; metaError("meta/table: null pAlterTbReq->colName"); - return -1; + return terrno = TSDB_CODE_INVALID_MSG; } // search name index ret = tdbTbGet(pMeta->pNameIdx, pAlterTbReq->tbName, strlen(pAlterTbReq->tbName) + 1, &pVal, &nVal); if (ret < 0) { - terrno = TSDB_CODE_TDB_TABLE_NOT_EXIST; - return -1; + return terrno = TSDB_CODE_TDB_TABLE_NOT_EXIST; } uid = *(tb_uid_t *)pVal; @@ -1432,7 +1428,7 @@ static int metaAlterTableColumn(SMeta *pMeta, int64_t version, SVAlterTbReq *pAl if (c != 0) { tdbTbcClose(pUidIdxc); metaError("meta/table: invalide c: %" PRId32 " alt tb column failed.", c); - return -1; + return TSDB_CODE_FAILED; } tdbTbcGet(pUidIdxc, NULL, NULL, &pData, &nData); @@ -1447,7 +1443,7 @@ static int metaAlterTableColumn(SMeta *pMeta, int64_t version, SVAlterTbReq *pAl tdbTbcClose(pUidIdxc); tdbTbcClose(pTbDbc); metaError("meta/table: invalide c: %" PRId32 " alt tb column failed.", c); - return -1; + return TSDB_CODE_FAILED; } tdbTbcGet(pTbDbc, NULL, NULL, &pData, &nData); @@ -1463,7 +1459,7 @@ static int metaAlterTableColumn(SMeta *pMeta, int64_t version, SVAlterTbReq *pAl tdbTbcClose(pTbDbc); tDecoderClear(&dc); metaError("meta/table: invalide ret: %" PRId32 " alt tb column failed.", ret); - return -1; + return ret; } if (entry.type != TSDB_NORMAL_TABLE) { @@ -1660,7 +1656,7 @@ _err: tdbTbcClose(pUidIdxc); tDecoderClear(&dc); - return -1; + return TSDB_CODE_FAILED; } static int metaUpdateTableTagVal(SMeta *pMeta, int64_t version, SVAlterTbReq *pAlterTbReq) { @@ -1676,15 +1672,13 @@ static int metaUpdateTableTagVal(SMeta *pMeta, int64_t version, SVAlterTbReq *pA int nData = 0; if (pAlterTbReq->tagName == NULL) { - terrno = TSDB_CODE_INVALID_MSG; - return -1; + return terrno = TSDB_CODE_INVALID_MSG; } // search name index ret = tdbTbGet(pMeta->pNameIdx, pAlterTbReq->tbName, strlen(pAlterTbReq->tbName) + 1, &pVal, &nVal); if (ret < 0) { - terrno = TSDB_CODE_TDB_TABLE_NOT_EXIST; - return -1; + return terrno = TSDB_CODE_TDB_TABLE_NOT_EXIST; } uid = *(tb_uid_t *)pVal; @@ -1698,9 +1692,8 @@ static int metaUpdateTableTagVal(SMeta *pMeta, int64_t version, SVAlterTbReq *pA tdbTbcMoveTo(pUidIdxc, &uid, sizeof(uid), &c); if (c != 0) { tdbTbcClose(pUidIdxc); - terrno = TSDB_CODE_TDB_TABLE_NOT_EXIST; metaError("meta/table: invalide c: %" PRId32 " update tb tag val failed.", c); - return -1; + return terrno = TSDB_CODE_TDB_TABLE_NOT_EXIST; } tdbTbcGet(pUidIdxc, NULL, NULL, &pData, &nData); @@ -1717,9 +1710,8 @@ static int metaUpdateTableTagVal(SMeta *pMeta, int64_t version, SVAlterTbReq *pA if (c != 0) { tdbTbcClose(pUidIdxc); tdbTbcClose(pTbDbc); - terrno = TSDB_CODE_TDB_TABLE_NOT_EXIST; metaError("meta/table: invalide c: %" PRId32 " update tb tag val failed.", c); - return -1; + return terrno = TSDB_CODE_TDB_TABLE_NOT_EXIST; } tdbTbcGet(pTbDbc, NULL, NULL, &pData, &nData); @@ -1866,8 +1858,7 @@ static int metaUpdateTableOptions(SMeta *pMeta, int64_t version, SVAlterTbReq *p // search name index ret = tdbTbGet(pMeta->pNameIdx, pAlterTbReq->tbName, strlen(pAlterTbReq->tbName) + 1, &pVal, &nVal); if (ret < 0) { - terrno = TSDB_CODE_TDB_TABLE_NOT_EXIST; - return -1; + return terrno = TSDB_CODE_TDB_TABLE_NOT_EXIST; } uid = *(tb_uid_t *)pVal; @@ -1882,7 +1873,7 @@ static int metaUpdateTableOptions(SMeta *pMeta, int64_t version, SVAlterTbReq *p if (c != 0) { tdbTbcClose(pUidIdxc); metaError("meta/table: invalide c: %" PRId32 " update tb options failed.", c); - return -1; + return TSDB_CODE_FAILED; } tdbTbcGet(pUidIdxc, NULL, NULL, &pData, &nData); @@ -1897,7 +1888,7 @@ static int metaUpdateTableOptions(SMeta *pMeta, int64_t version, SVAlterTbReq *p tdbTbcClose(pUidIdxc); tdbTbcClose(pTbDbc); metaError("meta/table: invalide c: %" PRId32 " update tb options failed.", c); - return -1; + return TSDB_CODE_FAILED; } tdbTbcGet(pTbDbc, NULL, NULL, &pData, &nData); @@ -1913,7 +1904,7 @@ static int metaUpdateTableOptions(SMeta *pMeta, int64_t version, SVAlterTbReq *p tdbTbcClose(pUidIdxc); tdbTbcClose(pTbDbc); metaError("meta/table: invalide ret: %" PRId32 " alt tb options failed.", ret); - return -1; + return TSDB_CODE_FAILED; } entry.version = version; @@ -1968,15 +1959,13 @@ static int metaAddTagIndex(SMeta *pMeta, int64_t version, SVAlterTbReq *pAlterTb SDecoder dc = {0}; if (pAlterTbReq->tagName == NULL) { - terrno = TSDB_CODE_INVALID_MSG; - return -1; + return terrno = TSDB_CODE_INVALID_MSG; } // search name index ret = tdbTbGet(pMeta->pNameIdx, pAlterTbReq->tbName, strlen(pAlterTbReq->tbName) + 1, &pVal, &nVal); if (ret < 0) { - terrno = TSDB_CODE_TDB_TABLE_NOT_EXIST; - return -1; + return terrno = TSDB_CODE_TDB_TABLE_NOT_EXIST; } else { uid = *(tb_uid_t *)pVal; tdbFree(pVal); @@ -2085,7 +2074,7 @@ _err: // if (stbEntry.pBuf) tdbFree(stbEntry.pBuf); // tdbTbcClose(pTbDbc); // tdbTbcClose(pUidIdxc); - return -1; + return TSDB_CODE_FAILED; } typedef struct SMetaPair { @@ -2106,15 +2095,13 @@ static int metaDropTagIndex(SMeta *pMeta, int64_t version, SVAlterTbReq *pAlterT SDecoder dc = {0}; if (pAlterTbReq->tagName == NULL) { - terrno = TSDB_CODE_INVALID_MSG; - return -1; + return terrno = TSDB_CODE_INVALID_MSG; } // search name index ret = tdbTbGet(pMeta->pNameIdx, pAlterTbReq->tbName, strlen(pAlterTbReq->tbName) + 1, &pVal, &nVal); if (ret < 0) { - terrno = TSDB_CODE_TDB_TABLE_NOT_EXIST; - return -1; + return terrno = TSDB_CODE_TDB_TABLE_NOT_EXIST; } suid = *(tb_uid_t *)pVal; tdbFree(pVal); @@ -2200,7 +2187,7 @@ static int metaDropTagIndex(SMeta *pMeta, int64_t version, SVAlterTbReq *pAlterT // set pCol->flags; INDEX_ON return 0; _err: - return -1; + return TSDB_CODE_FAILED; } int32_t metaUpdateTableColCompress(SMeta *pMeta, int64_t version, SVAlterTbReq *pReq) { // impl later @@ -2216,8 +2203,7 @@ int32_t metaUpdateTableColCompress(SMeta *pMeta, int64_t version, SVAlterTbReq * SDecoder dc = {0}; ret = tdbTbGet(pMeta->pNameIdx, pReq->tbName, strlen(pReq->tbName) + 1, &pVal, &nVal); if (ret < 0) { - terrno = TSDB_CODE_TDB_TABLE_NOT_EXIST; - return -1; + return terrno = TSDB_CODE_TDB_TABLE_NOT_EXIST; } suid = *(tb_uid_t *)pVal; tdbFree(pVal); @@ -2290,7 +2276,7 @@ int32_t metaUpdateTableColCompress(SMeta *pMeta, int64_t version, SVAlterTbReq * return 0; _err: - return -1; + return TSDB_CODE_FAILED; } int metaAlterTable(SMeta *pMeta, int64_t version, SVAlterTbReq *pReq, STableMetaRsp *pMetaRsp) { @@ -2313,8 +2299,7 @@ int metaAlterTable(SMeta *pMeta, int64_t version, SVAlterTbReq *pReq, STableMeta case TSDB_ALTER_TABLE_UPDATE_COLUMN_COMPRESS: return metaUpdateTableColCompress(pMeta, version, pReq); default: - terrno = TSDB_CODE_VND_INVALID_TABLE_ACTION; - return -1; + return terrno = TSDB_CODE_VND_INVALID_TABLE_ACTION; break; } } @@ -2370,7 +2355,7 @@ _err: pME->uid, tstrerror(terrno)); taosMemoryFree(pVal); - return -1; + return TSDB_CODE_FAILED; } static int metaUpdateUidIdx(SMeta *pMeta, const SMetaEntry *pME) { @@ -2446,8 +2431,7 @@ int metaCreateTagIdxKey(tb_uid_t suid, int32_t cid, const void *pTagData, int32_ *ppTagIdxKey = (STagIdxKey *)taosMemoryMalloc(*nTagIdxKey); if (*ppTagIdxKey == NULL) { - terrno = TSDB_CODE_OUT_OF_MEMORY; - return -1; + return terrno = TSDB_CODE_OUT_OF_MEMORY; } (*ppTagIdxKey)->suid = suid; @@ -2667,7 +2651,7 @@ _err: metaULock(pMeta); metaError("vgId:%d, failed to handle meta entry since %s at line:%d, ver:%" PRId64 ", uid:%" PRId64 ", name:%s", TD_VID(pMeta->pVnode), terrstr(), line, pME->version, pME->uid, pME->name); - return -1; + return TSDB_CODE_FAILED; } int32_t colCompressDebug(SHashObj *pColCmprObj) { @@ -2703,7 +2687,7 @@ int32_t metaGetColCmpr(SMeta *pMeta, tb_uid_t uid, SHashObj **ppColCmprObj) { if (rc < 0) { taosHashClear(pColCmprObj); metaULock(pMeta); - return -1; + return TSDB_CODE_FAILED; } int64_t version = ((SUidIdxVal *)pData)[0].version; rc = tdbTbGet(pMeta->pTbDb, &(STbDbKey){.version = version, .uid = uid}, sizeof(STbDbKey), &pData, &nData); @@ -2721,7 +2705,7 @@ int32_t metaGetColCmpr(SMeta *pMeta, tb_uid_t uid, SHashObj **ppColCmprObj) { tdbFree(pData); metaULock(pMeta); taosHashClear(pColCmprObj); - return -1; + return rc; } if (useCompress(e.type)) { SColCmprWrapper *p = &e.colCmpr; diff --git a/source/dnode/vnode/src/tsdb/tsdbCache.c b/source/dnode/vnode/src/tsdb/tsdbCache.c index 8574ff85c3..1726d8696b 100644 --- a/source/dnode/vnode/src/tsdb/tsdbCache.c +++ b/source/dnode/vnode/src/tsdb/tsdbCache.c @@ -22,48 +22,13 @@ #define ROCKS_BATCH_SIZE (4096) -#if 0 -static int32_t tsdbOpenBICache(STsdb *pTsdb) { - int32_t code = 0; - SLRUCache *pCache = taosLRUCacheInit(10 * 1024 * 1024, 0, .5); - if (pCache == NULL) { - code = TSDB_CODE_OUT_OF_MEMORY; - goto _err; - } - - taosLRUCacheSetStrictCapacity(pCache, false); - - taosThreadMutexInit(&pTsdb->biMutex, NULL); - -_err: - pTsdb->biCache = pCache; - return code; -} - -static void tsdbCloseBICache(STsdb *pTsdb) { - SLRUCache *pCache = pTsdb->biCache; - if (pCache) { - int32_t elems = taosLRUCacheGetElems(pCache); - tsdbTrace("vgId:%d, elems: %d", TD_VID(pTsdb->pVnode), elems); - taosLRUCacheEraseUnrefEntries(pCache); - elems = taosLRUCacheGetElems(pCache); - tsdbTrace("vgId:%d, elems: %d", TD_VID(pTsdb->pVnode), elems); - - taosLRUCacheCleanup(pCache); - - taosThreadMutexDestroy(&pTsdb->biMutex); - } -} -#endif - static int32_t tsdbOpenBCache(STsdb *pTsdb) { - int32_t code = 0; + int32_t code = 0, lino = 0; int32_t szPage = pTsdb->pVnode->config.tsdbPageSize; int64_t szBlock = tsS3BlockSize <= 1024 ? 1024 : tsS3BlockSize; SLRUCache *pCache = taosLRUCacheInit((int64_t)tsS3BlockCacheSize * szBlock * szPage, 0, .5); if (pCache == NULL) { - code = TSDB_CODE_OUT_OF_MEMORY; - goto _err; + TAOS_CHECK_GOTO(TSDB_CODE_OUT_OF_MEMORY, &lino, _err); } taosLRUCacheSetStrictCapacity(pCache, false); @@ -73,7 +38,12 @@ static int32_t tsdbOpenBCache(STsdb *pTsdb) { pTsdb->bCache = pCache; _err: - return code; + if (code) { + tsdbError("tsdb/bcache: vgId:%d, %s failed at line %d since %s.", TD_VID(pTsdb->pVnode), __func__, lino, + tstrerror(code)); + } + + TAOS_RETURN(code); } static void tsdbCloseBCache(STsdb *pTsdb) { @@ -92,23 +62,26 @@ static void tsdbCloseBCache(STsdb *pTsdb) { } static int32_t tsdbOpenPgCache(STsdb *pTsdb) { - int32_t code = 0; - // SLRUCache *pCache = taosLRUCacheInit(10 * 1024 * 1024, 0, .5); + int32_t code = 0, lino = 0; int32_t szPage = pTsdb->pVnode->config.tsdbPageSize; SLRUCache *pCache = taosLRUCacheInit((int64_t)tsS3PageCacheSize * szPage, 0, .5); if (pCache == NULL) { - code = TSDB_CODE_OUT_OF_MEMORY; - goto _err; + TAOS_CHECK_GOTO(TSDB_CODE_OUT_OF_MEMORY, &lino, _err); } taosLRUCacheSetStrictCapacity(pCache, false); taosThreadMutexInit(&pTsdb->pgMutex, NULL); -_err: pTsdb->pgCache = pCache; - return code; + +_err: + if (code) { + tsdbError("tsdb/pgcache: vgId:%d, open failed at line %d since %s.", TD_VID(pTsdb->pVnode), lino, tstrerror(code)); + } + + TAOS_RETURN(code); } static void tsdbClosePgCache(STsdb *pTsdb) { @@ -186,12 +159,11 @@ static int myCmp(void *state, const char *a, size_t alen, const char *b, size_t } static int32_t tsdbOpenRocksCache(STsdb *pTsdb) { - int32_t code = 0; + int32_t code = 0, lino = 0; rocksdb_comparator_t *cmp = rocksdb_comparator_create(NULL, myCmpDestroy, myCmp, myCmpName); if (NULL == cmp) { - code = TSDB_CODE_OUT_OF_MEMORY; - return code; + TAOS_RETURN(TSDB_CODE_OUT_OF_MEMORY); } rocksdb_cache_t *cache = rocksdb_cache_create_lru(5 * 1024 * 1024); @@ -202,8 +174,7 @@ static int32_t tsdbOpenRocksCache(STsdb *pTsdb) { rocksdb_options_t *options = rocksdb_options_create(); if (NULL == options) { - code = TSDB_CODE_OUT_OF_MEMORY; - goto _err; + TAOS_CHECK_GOTO(TSDB_CODE_OUT_OF_MEMORY, &lino, _err); } rocksdb_options_set_create_if_missing(options, 1); @@ -216,15 +187,13 @@ static int32_t tsdbOpenRocksCache(STsdb *pTsdb) { rocksdb_writeoptions_t *writeoptions = rocksdb_writeoptions_create(); if (NULL == writeoptions) { - code = TSDB_CODE_OUT_OF_MEMORY; - goto _err2; + TAOS_CHECK_GOTO(TSDB_CODE_OUT_OF_MEMORY, &lino, _err2); } rocksdb_writeoptions_disable_WAL(writeoptions, 1); rocksdb_readoptions_t *readoptions = rocksdb_readoptions_create(); if (NULL == readoptions) { - code = TSDB_CODE_OUT_OF_MEMORY; - goto _err3; + TAOS_CHECK_GOTO(TSDB_CODE_OUT_OF_MEMORY, &lino, _err3); } char *err = NULL; @@ -236,14 +205,12 @@ static int32_t tsdbOpenRocksCache(STsdb *pTsdb) { tsdbError("vgId:%d, %s failed at line %d since %s", TD_VID(pTsdb->pVnode), __func__, __LINE__, err); rocksdb_free(err); - code = TSDB_CODE_OUT_OF_MEMORY; - goto _err4; + TAOS_CHECK_GOTO(TSDB_CODE_OUT_OF_MEMORY, &lino, _err4); } rocksdb_flushoptions_t *flushoptions = rocksdb_flushoptions_create(); if (NULL == flushoptions) { - code = TSDB_CODE_OUT_OF_MEMORY; - goto _err5; + TAOS_CHECK_GOTO(TSDB_CODE_OUT_OF_MEMORY, &lino, _err5); } rocksdb_writebatch_t *writebatch = rocksdb_writebatch_create(); @@ -262,7 +229,7 @@ static int32_t tsdbOpenRocksCache(STsdb *pTsdb) { pTsdb->rCache.pTSchema = NULL; - return code; + TAOS_RETURN(code); _err5: rocksdb_close(pTsdb->rCache.db); @@ -276,7 +243,8 @@ _err2: rocksdb_cache_destroy(cache); _err: rocksdb_comparator_destroy(cmp); - return code; + + TAOS_RETURN(code); } static void tsdbCloseRocksCache(STsdb *pTsdb) { @@ -371,24 +339,26 @@ static int32_t tsdbCacheDeserializeV0(char const *value, SLastCol *pLastCol) { } } -static SLastCol *tsdbCacheDeserialize(char const *value, size_t size) { +static int32_t tsdbCacheDeserialize(char const *value, size_t size, SLastCol **ppLastCol) { if (!value) { - return NULL; + return TSDB_CODE_INVALID_PARA; } SLastCol *pLastCol = taosMemoryCalloc(1, sizeof(SLastCol)); if (NULL == pLastCol) { - return NULL; + TAOS_RETURN(TSDB_CODE_OUT_OF_MEMORY); } int32_t offset = tsdbCacheDeserializeV0(value, pLastCol); if (offset == size) { // version 0 - return pLastCol; + *ppLastCol = pLastCol; + + TAOS_RETURN(TSDB_CODE_SUCCESS); } else if (offset > size) { - terrno = TSDB_CODE_INVALID_DATA_FMT; taosMemoryFreeClear(pLastCol); - return NULL; + + TAOS_RETURN(TSDB_CODE_INVALID_DATA_FMT); } // version @@ -414,12 +384,14 @@ static SLastCol *tsdbCacheDeserialize(char const *value, size_t size) { } if (offset > size) { - terrno = TSDB_CODE_INVALID_DATA_FMT; taosMemoryFreeClear(pLastCol); - return NULL; + + TAOS_RETURN(TSDB_CODE_INVALID_DATA_FMT); } - return pLastCol; + *ppLastCol = pLastCol; + + TAOS_RETURN(TSDB_CODE_SUCCESS); } /* @@ -457,7 +429,7 @@ static int32_t tsdbCacheSerializeV0(char const *value, SLastCol *pLastCol) { return 0; } -static void tsdbCacheSerialize(SLastCol *pLastCol, char **value, size_t *size) { +static int32_t tsdbCacheSerialize(SLastCol *pLastCol, char **value, size_t *size) { *size = sizeof(SLastColV0); if (IS_VAR_DATA_TYPE(pLastCol->colVal.value.type)) { *size += pLastCol->colVal.value.nData; @@ -472,6 +444,9 @@ static void tsdbCacheSerialize(SLastCol *pLastCol, char **value, size_t *size) { } *value = taosMemoryMalloc(*size); + if (NULL == *value) { + TAOS_RETURN(TSDB_CODE_OUT_OF_MEMORY); + } int32_t offset = tsdbCacheSerializeV0(*value, pLastCol); @@ -494,16 +469,22 @@ static void tsdbCacheSerialize(SLastCol *pLastCol, char **value, size_t *size) { offset += pLastCol->rowKey.pks[i].nData; } } + + TAOS_RETURN(TSDB_CODE_SUCCESS); } static void tsdbCachePutBatch(SLastCol *pLastCol, const void *key, size_t klen, SCacheFlushState *state) { + int32_t code = 0; STsdb *pTsdb = state->pTsdb; SRocksCache *rCache = &pTsdb->rCache; rocksdb_writebatch_t *wb = rCache->writebatch; char *rocks_value = NULL; size_t vlen = 0; - tsdbCacheSerialize(pLastCol, &rocks_value, &vlen); + code = tsdbCacheSerialize(pLastCol, &rocks_value, &vlen); + if (code) { + tsdbError("tsdb/cache: vgId:%d, serialize failed since %s.", TD_VID(pTsdb->pVnode), tstrerror(code)); + } taosThreadMutexLock(&rCache->rMutex); @@ -561,25 +542,31 @@ int32_t tsdbCacheCommit(STsdb *pTsdb) { if (NULL != err) { tsdbError("vgId:%d, %s failed at line %d since %s", TD_VID(pTsdb->pVnode), __func__, __LINE__, err); rocksdb_free(err); - code = -1; + code = TSDB_CODE_FAILED; } - return code; + TAOS_RETURN(code); } -static void reallocVarDataVal(SValue *pValue) { +static int32_t reallocVarDataVal(SValue *pValue) { if (IS_VAR_DATA_TYPE(pValue->type)) { uint8_t *pVal = pValue->pData; if (pValue->nData > 0) { - pValue->pData = taosMemoryMalloc(pValue->nData); + uint8_t *p = taosMemoryMalloc(pValue->nData); + if (!p) { + TAOS_RETURN(TSDB_CODE_OUT_OF_MEMORY); + } + pValue->pData = p; memcpy(pValue->pData, pVal, pValue->nData); } else { pValue->pData = NULL; } } + + TAOS_RETURN(TSDB_CODE_SUCCESS); } -static void reallocVarData(SColVal *pColVal) { reallocVarDataVal(&pColVal->value); } +static int32_t reallocVarData(SColVal *pColVal) { return reallocVarDataVal(&pColVal->value); } static void tsdbCacheDeleter(const void *key, size_t klen, void *value, void *ud) { SLastCol *pLastCol = (SLastCol *)value; @@ -614,6 +601,9 @@ static int32_t tsdbCacheNewTableColumn(STsdb *pTsdb, int64_t uid, int16_t cid, i SLastCol *pLastCol = &noneCol; SLastCol *pTmpLastCol = taosMemoryCalloc(1, sizeof(SLastCol)); + if (!pTmpLastCol) { + TAOS_RETURN(TSDB_CODE_OUT_OF_MEMORY); + } *pTmpLastCol = *pLastCol; pLastCol = pTmpLastCol; @@ -622,13 +612,13 @@ static int32_t tsdbCacheNewTableColumn(STsdb *pTsdb, int64_t uid, int16_t cid, i for (int8_t i = 0; i < pLastCol->rowKey.numOfPKs; i++) { SValue *pValue = &pLastCol->rowKey.pks[i]; if (IS_VAR_DATA_TYPE(pValue->type)) { - reallocVarDataVal(pValue); + TAOS_CHECK_RETURN(reallocVarDataVal(pValue)); charge += pValue->nData; } } if (IS_VAR_DATA_TYPE(pLastCol->colVal.value.type)) { - reallocVarData(&pLastCol->colVal); + TAOS_CHECK_RETURN(reallocVarData(&pLastCol->colVal)); charge += pLastCol->colVal.value.nData; } @@ -636,20 +626,10 @@ static int32_t tsdbCacheNewTableColumn(STsdb *pTsdb, int64_t uid, int16_t cid, i LRUStatus status = taosLRUCacheInsert(pCache, pLastKey, ROCKS_KEY_LEN, pLastCol, charge, tsdbCacheDeleter, NULL, TAOS_LRU_PRIORITY_LOW, &pTsdb->flushState); if (status != TAOS_LRU_STATUS_OK) { - code = -1; + // code = -1; } - /* - // store result back to rocks cache - char *value = NULL; - size_t vlen = 0; - tsdbCacheSerialize(pLastCol, &value, &vlen); - SLastKey *key = pLastKey; - size_t klen = ROCKS_KEY_LEN; - rocksdb_writebatch_put(wb, (char *)key, klen, value, vlen); - taosMemoryFree(value); - */ - return code; + TAOS_RETURN(code); } int32_t tsdbCacheCommitNoLock(STsdb *pTsdb) { @@ -668,21 +648,33 @@ int32_t tsdbCacheCommitNoLock(STsdb *pTsdb) { if (NULL != err) { tsdbError("vgId:%d, %s failed at line %d since %s", TD_VID(pTsdb->pVnode), __func__, __LINE__, err); rocksdb_free(err); - code = -1; + code = TSDB_CODE_FAILED; } - return code; + TAOS_RETURN(code); } static int32_t tsdbCacheDropTableColumn(STsdb *pTsdb, int64_t uid, int16_t cid, bool hasPrimaryKey) { int32_t code = 0; // build keys & multi get from rocks - char **keys_list = taosMemoryCalloc(2, sizeof(char *)); - size_t *keys_list_sizes = taosMemoryCalloc(2, sizeof(size_t)); + char **keys_list = taosMemoryCalloc(2, sizeof(char *)); + if (!keys_list) { + TAOS_RETURN(TSDB_CODE_OUT_OF_MEMORY); + } + size_t *keys_list_sizes = taosMemoryCalloc(2, sizeof(size_t)); + if (!keys_list_sizes) { + taosMemoryFree(keys_list); + TAOS_RETURN(TSDB_CODE_OUT_OF_MEMORY); + } const size_t klen = ROCKS_KEY_LEN; char *keys = taosMemoryCalloc(2, sizeof(SLastKey)); + if (!keys) { + taosMemoryFree(keys_list); + taosMemoryFree(keys_list_sizes); + TAOS_RETURN(TSDB_CODE_OUT_OF_MEMORY); + } ((SLastKey *)keys)[0] = (SLastKey){.lflag = LFLAG_LAST, .uid = uid, .cid = cid}; ((SLastKey *)keys)[1] = (SLastKey){.lflag = LFLAG_LAST_ROW, .uid = uid, .cid = cid}; @@ -691,9 +683,30 @@ static int32_t tsdbCacheDropTableColumn(STsdb *pTsdb, int64_t uid, int16_t cid, keys_list_sizes[0] = klen; keys_list_sizes[1] = klen; - char **values_list = taosMemoryCalloc(2, sizeof(char *)); + char **values_list = taosMemoryCalloc(2, sizeof(char *)); + if (!values_list) { + taosMemoryFree(keys_list); + taosMemoryFree(keys_list_sizes); + taosMemoryFree(keys_list[0]); + TAOS_RETURN(TSDB_CODE_OUT_OF_MEMORY); + } size_t *values_list_sizes = taosMemoryCalloc(2, sizeof(size_t)); - char **errs = taosMemoryCalloc(2, sizeof(char *)); + if (!values_list_sizes) { + taosMemoryFree(keys_list); + taosMemoryFree(keys_list_sizes); + taosMemoryFree(keys_list[0]); + taosMemoryFree(values_list); + TAOS_RETURN(TSDB_CODE_OUT_OF_MEMORY); + } + char **errs = taosMemoryCalloc(2, sizeof(char *)); + if (!errs) { + taosMemoryFree(keys_list); + taosMemoryFree(keys_list_sizes); + taosMemoryFree(keys_list[0]); + taosMemoryFree(values_list); + taosMemoryFree(values_list_sizes); + TAOS_RETURN(TSDB_CODE_OUT_OF_MEMORY); + } // rocksMayWrite(pTsdb, true, false, false); rocksdb_multi_get(pTsdb->rCache.db, pTsdb->rCache.readoptions, 2, (const char *const *)keys_list, keys_list_sizes, @@ -708,13 +721,21 @@ static int32_t tsdbCacheDropTableColumn(STsdb *pTsdb, int64_t uid, int16_t cid, rocksdb_writebatch_t *wb = pTsdb->rCache.writebatch; { - SLastCol *pLastCol = tsdbCacheDeserialize(values_list[0], values_list_sizes[0]); + SLastCol *pLastCol = NULL; + code = tsdbCacheDeserialize(values_list[0], values_list_sizes[0], &pLastCol); + if (code) { + tsdbError("tsdb/cache: vgId:%d, deserialize failed since %s.", TD_VID(pTsdb->pVnode), tstrerror(code)); + } if (NULL != pLastCol) { rocksdb_writebatch_delete(wb, keys_list[0], klen); } taosMemoryFreeClear(pLastCol); - pLastCol = tsdbCacheDeserialize(values_list[1], values_list_sizes[1]); + pLastCol = NULL; + code = tsdbCacheDeserialize(values_list[1], values_list_sizes[1], &pLastCol); + if (code) { + tsdbError("tsdb/cache: vgId:%d, deserialize failed since %s.", TD_VID(pTsdb->pVnode), tstrerror(code)); + } if (NULL != pLastCol) { rocksdb_writebatch_delete(wb, keys_list[1], klen); } @@ -751,7 +772,7 @@ static int32_t tsdbCacheDropTableColumn(STsdb *pTsdb, int64_t uid, int16_t cid, taosMemoryFree(values_list); taosMemoryFree(values_list_sizes); - return code; + TAOS_RETURN(code); } int32_t tsdbCacheNewTable(STsdb *pTsdb, tb_uid_t uid, tb_uid_t suid, SSchemaWrapper *pSchemaRow) { @@ -772,8 +793,8 @@ int32_t tsdbCacheNewTable(STsdb *pTsdb, tb_uid_t uid, tb_uid_t suid, SSchemaWrap code = metaGetTbTSchemaEx(pTsdb->pVnode->pMeta, suid, uid, -1, &pTSchema); if (code != TSDB_CODE_SUCCESS) { taosThreadMutexUnlock(&pTsdb->lruMutex); - terrno = code; - return -1; + + TAOS_RETURN(code); } for (int i = 0; i < pTSchema->numOfCols; ++i) { @@ -789,7 +810,7 @@ int32_t tsdbCacheNewTable(STsdb *pTsdb, tb_uid_t uid, tb_uid_t suid, SSchemaWrap taosThreadMutexUnlock(&pTsdb->lruMutex); - return code; + TAOS_RETURN(code); } int32_t tsdbCacheDropTable(STsdb *pTsdb, tb_uid_t uid, tb_uid_t suid, SSchemaWrapper *pSchemaRow) { @@ -815,8 +836,9 @@ int32_t tsdbCacheDropTable(STsdb *pTsdb, tb_uid_t uid, tb_uid_t suid, SSchemaWra STSchema *pTSchema = NULL; code = metaGetTbTSchemaEx(pTsdb->pVnode->pMeta, suid, uid, -1, &pTSchema); if (code != TSDB_CODE_SUCCESS) { - terrno = code; - return -1; + taosThreadMutexUnlock(&pTsdb->lruMutex); + + TAOS_RETURN(code); } bool hasPrimayKey = false; @@ -838,7 +860,7 @@ int32_t tsdbCacheDropTable(STsdb *pTsdb, tb_uid_t uid, tb_uid_t suid, SSchemaWra taosThreadMutexUnlock(&pTsdb->lruMutex); - return code; + TAOS_RETURN(code); } int32_t tsdbCacheDropSubTables(STsdb *pTsdb, SArray *uids, tb_uid_t suid) { @@ -851,9 +873,11 @@ int32_t tsdbCacheDropSubTables(STsdb *pTsdb, SArray *uids, tb_uid_t suid) { STSchema *pTSchema = NULL; code = metaGetTbTSchemaEx(pTsdb->pVnode->pMeta, suid, suid, -1, &pTSchema); if (code != TSDB_CODE_SUCCESS) { - terrno = code; - return -1; + taosThreadMutexUnlock(&pTsdb->lruMutex); + + TAOS_RETURN(code); } + for (int i = 0; i < TARRAY_SIZE(uids); ++i) { int64_t uid = ((tb_uid_t *)TARRAY_DATA(uids))[i]; @@ -877,7 +901,7 @@ int32_t tsdbCacheDropSubTables(STsdb *pTsdb, SArray *uids, tb_uid_t suid) { taosThreadMutexUnlock(&pTsdb->lruMutex); - return code; + TAOS_RETURN(code); } int32_t tsdbCacheNewNTableColumn(STsdb *pTsdb, int64_t uid, int16_t cid, int8_t col_type) { @@ -892,7 +916,7 @@ int32_t tsdbCacheNewNTableColumn(STsdb *pTsdb, int64_t uid, int16_t cid, int8_t taosThreadMutexUnlock(&pTsdb->lruMutex); //(void)tsdbCacheCommit(pTsdb); - return code; + TAOS_RETURN(code); } int32_t tsdbCacheDropNTableColumn(STsdb *pTsdb, int64_t uid, int16_t cid, bool hasPrimayKey) { @@ -908,7 +932,7 @@ int32_t tsdbCacheDropNTableColumn(STsdb *pTsdb, int64_t uid, int16_t cid, bool h taosThreadMutexUnlock(&pTsdb->lruMutex); - return code; + TAOS_RETURN(code); } int32_t tsdbCacheNewSTableColumn(STsdb *pTsdb, SArray *uids, int16_t cid, int8_t col_type) { @@ -927,7 +951,7 @@ int32_t tsdbCacheNewSTableColumn(STsdb *pTsdb, SArray *uids, int16_t cid, int8_t taosThreadMutexUnlock(&pTsdb->lruMutex); //(void)tsdbCacheCommit(pTsdb); - return code; + TAOS_RETURN(code); } int32_t tsdbCacheDropSTableColumn(STsdb *pTsdb, SArray *uids, int16_t cid, bool hasPrimayKey) { @@ -947,7 +971,7 @@ int32_t tsdbCacheDropSTableColumn(STsdb *pTsdb, SArray *uids, int16_t cid, bool taosThreadMutexUnlock(&pTsdb->lruMutex); - return code; + TAOS_RETURN(code); } typedef struct { @@ -968,6 +992,9 @@ static int32_t tsdbCacheUpdateValue(SValue *pOld, SValue *pNew) { if (IS_VAR_DATA_TYPE(pNew->type)) { if (nData < pNew->nData) { pOld->pData = taosMemoryCalloc(1, pNew->nData); + if (!pOld->pData) { + TAOS_RETURN(TSDB_CODE_OUT_OF_MEMORY); + } } else { pOld->pData = pFree; pFree = NULL; @@ -982,7 +1009,8 @@ static int32_t tsdbCacheUpdateValue(SValue *pOld, SValue *pNew) { } taosMemoryFreeClear(pFree); - return 0; + + TAOS_RETURN(TSDB_CODE_SUCCESS); } static void tsdbCacheUpdateLastCol(SLastCol *pLastCol, SRowKey *pRowKey, SColVal *pColVal) { @@ -1008,10 +1036,10 @@ static void tsdbCacheUpdateLastCol(SLastCol *pLastCol, SRowKey *pRowKey, SColVal static int32_t tsdbCacheUpdate(STsdb *pTsdb, tb_uid_t suid, tb_uid_t uid, SArray *updCtxArray) { if (!updCtxArray || TARRAY_SIZE(updCtxArray) == 0) { - return 0; + TAOS_RETURN(TSDB_CODE_SUCCESS); } - int32_t code = 0; + int32_t code = 0, lino = 0; int num_keys = TARRAY_SIZE(updCtxArray); SArray *remainCols = NULL; @@ -1051,17 +1079,35 @@ static int32_t tsdbCacheUpdate(STsdb *pTsdb, tb_uid_t suid, tb_uid_t uid, SArray num_keys = TARRAY_SIZE(remainCols); } if (remainCols && num_keys > 0) { - char **keys_list = taosMemoryCalloc(num_keys, sizeof(char *)); - size_t *keys_list_sizes = taosMemoryCalloc(num_keys, sizeof(size_t)); + char **keys_list = NULL; + size_t *keys_list_sizes = NULL; + char **values_list = NULL; + size_t *values_list_sizes = NULL; + char **errs = NULL; + keys_list = taosMemoryCalloc(num_keys, sizeof(char *)); + keys_list_sizes = taosMemoryCalloc(num_keys, sizeof(size_t)); + if (!keys_list || !keys_list_sizes) { + taosMemoryFree(keys_list); + taosThreadMutexUnlock(&pTsdb->lruMutex); + TAOS_RETURN(TSDB_CODE_OUT_OF_MEMORY); + } for (int i = 0; i < num_keys; ++i) { SIdxKey *idxKey = &((SIdxKey *)TARRAY_DATA(remainCols))[i]; keys_list[i] = (char *)&idxKey->key; keys_list_sizes[i] = ROCKS_KEY_LEN; } - char **values_list = taosMemoryCalloc(num_keys, sizeof(char *)); - size_t *values_list_sizes = taosMemoryCalloc(num_keys, sizeof(size_t)); - char **errs = taosMemoryCalloc(num_keys, sizeof(char *)); + values_list = taosMemoryCalloc(num_keys, sizeof(char *)); + values_list_sizes = taosMemoryCalloc(num_keys, sizeof(size_t)); + errs = taosMemoryCalloc(num_keys, sizeof(char *)); + if (!values_list || !values_list_sizes || !errs) { + taosMemoryFree(keys_list); + taosMemoryFree(keys_list_sizes); + taosMemoryFree(values_list); + taosMemoryFree(values_list_sizes); + taosThreadMutexUnlock(&pTsdb->lruMutex); + TAOS_RETURN(TSDB_CODE_OUT_OF_MEMORY); + } rocksdb_multi_get(pTsdb->rCache.db, pTsdb->rCache.readoptions, num_keys, (const char *const *)keys_list, keys_list_sizes, values_list, values_list_sizes, errs); for (int i = 0; i < num_keys; ++i) { @@ -1076,7 +1122,11 @@ static int32_t tsdbCacheUpdate(STsdb *pTsdb, tb_uid_t suid, tb_uid_t uid, SArray SRowKey *pRowKey = &updCtx->tsdbRowKey.key; SColVal *pColVal = &updCtx->colVal; - SLastCol *pLastCol = tsdbCacheDeserialize(values_list[i], values_list_sizes[i]); + SLastCol *pLastCol = NULL; + code = tsdbCacheDeserialize(values_list[i], values_list_sizes[i], &pLastCol); + if (code) { + tsdbError("tsdb/cache: vgId:%d, deserialize failed since %s.", TD_VID(pTsdb->pVnode), tstrerror(code)); + } SLastCol *PToFree = pLastCol; if (IS_LAST_KEY(idxKey->key) && !COL_VAL_IS_VALUE(pColVal)) { @@ -1094,7 +1144,10 @@ static int32_t tsdbCacheUpdate(STsdb *pTsdb, tb_uid_t suid, tb_uid_t uid, SArray char *value = NULL; size_t vlen = 0; SLastCol lastColTmp = {.rowKey = *pRowKey, .colVal = *pColVal}; - tsdbCacheSerialize(&lastColTmp, &value, &vlen); + code = tsdbCacheSerialize(&lastColTmp, &value, &vlen); + if (code) { + tsdbError("tsdb/cache: vgId:%d, serialize failed since %s.", TD_VID(pTsdb->pVnode), tstrerror(code)); + } taosThreadMutexLock(&pTsdb->rCache.rMutex); @@ -1104,6 +1157,16 @@ static int32_t tsdbCacheUpdate(STsdb *pTsdb, tb_uid_t suid, tb_uid_t uid, SArray pLastCol = &lastColTmp; SLastCol *pTmpLastCol = taosMemoryCalloc(1, sizeof(SLastCol)); + if (!pTmpLastCol) { + taosMemoryFree(keys_list); + taosMemoryFree(keys_list_sizes); + taosMemoryFree(values_list); + taosMemoryFree(values_list_sizes); + + taosArrayDestroy(remainCols); + taosThreadMutexUnlock(&pTsdb->lruMutex); + TAOS_RETURN(TSDB_CODE_OUT_OF_MEMORY); + } *pTmpLastCol = *pLastCol; pLastCol = pTmpLastCol; @@ -1111,13 +1174,13 @@ static int32_t tsdbCacheUpdate(STsdb *pTsdb, tb_uid_t suid, tb_uid_t uid, SArray for (int8_t i = 0; i < pLastCol->rowKey.numOfPKs; i++) { SValue *pValue = &pLastCol->rowKey.pks[i]; if (IS_VAR_DATA_TYPE(pValue->type)) { - reallocVarDataVal(pValue); + TAOS_CHECK_GOTO(reallocVarDataVal(pValue), &lino, _exit); charge += pValue->nData; } } if (IS_VAR_DATA_TYPE(pLastCol->colVal.value.type)) { - reallocVarData(&pLastCol->colVal); + TAOS_CHECK_GOTO(reallocVarData(&pLastCol->colVal), &lino, _exit); charge += pLastCol->colVal.value.nData; } @@ -1144,15 +1207,19 @@ static int32_t tsdbCacheUpdate(STsdb *pTsdb, tb_uid_t suid, tb_uid_t uid, SArray taosArrayDestroy(remainCols); } +_exit: taosThreadMutexUnlock(&pTsdb->lruMutex); -_exit: - return code; + if (code) { + tsdbError("tsdb/cache: vgId:%d, update failed at line %d since %s.", TD_VID(pTsdb->pVnode), lino, tstrerror(code)); + } + + TAOS_RETURN(code); } int32_t tsdbCacheRowFormatUpdate(STsdb *pTsdb, tb_uid_t suid, tb_uid_t uid, int64_t version, int32_t nRow, SRow **aRow) { - int32_t code = 0; + int32_t code = 0, lino = 0; // 1. prepare last TSDBROW lRow = {.type = TSDBROW_ROW_FMT, .pTSRow = aRow[nRow - 1], .version = version}; @@ -1162,11 +1229,7 @@ int32_t tsdbCacheRowFormatUpdate(STsdb *pTsdb, tb_uid_t suid, tb_uid_t uid, int6 SArray *ctxArray = NULL; SSHashObj *iColHash = NULL; - code = metaGetTbTSchemaEx(pTsdb->pVnode->pMeta, suid, uid, sver, &pTSchema); - if (code != TSDB_CODE_SUCCESS) { - terrno = code; - goto _exit; - } + TAOS_CHECK_GOTO(metaGetTbTSchemaEx(pTsdb->pVnode->pMeta, suid, uid, sver, &pTSchema), &lino, _exit); TSDBROW tRow = {.type = TSDBROW_ROW_FMT, .version = version}; int32_t nCol = pTSchema->numOfCols; @@ -1227,7 +1290,8 @@ _exit: taosMemoryFreeClear(pTSchema); taosArrayDestroy(ctxArray); tSimpleHashCleanup(iColHash); - return code; + + TAOS_RETURN(code); } int32_t tsdbCacheColFormatUpdate(STsdb *pTsdb, tb_uid_t suid, tb_uid_t uid, SBlockData *pBlockData) { @@ -1239,11 +1303,7 @@ int32_t tsdbCacheColFormatUpdate(STsdb *pTsdb, tb_uid_t suid, tb_uid_t uid, SBlo int32_t sver = TSDBROW_SVERSION(&lRow); SArray *ctxArray = NULL; - code = metaGetTbTSchemaEx(pTsdb->pVnode->pMeta, suid, uid, sver, &pTSchema); - if (code != TSDB_CODE_SUCCESS) { - terrno = code; - goto _exit; - } + TAOS_CHECK_RETURN(metaGetTbTSchemaEx(pTsdb->pVnode->pMeta, suid, uid, sver, &pTSchema)); ctxArray = taosArrayInit(pBlockData->nColData, sizeof(SLastUpdateCtx)); @@ -1299,7 +1359,8 @@ int32_t tsdbCacheColFormatUpdate(STsdb *pTsdb, tb_uid_t suid, tb_uid_t uid, SBlo _exit: taosMemoryFreeClear(pTSchema); taosArrayDestroy(ctxArray); - return 0; + + TAOS_RETURN(code); } static int32_t mergeLastCid(tb_uid_t uid, STsdb *pTsdb, SArray **ppLastArray, SCacheRowsReader *pr, int16_t *aCols, @@ -1324,18 +1385,30 @@ static int32_t tsdbCacheLoadFromRaw(STsdb *pTsdb, tb_uid_t uid, SArray *pLastArr int num_keys = TARRAY_SIZE(remainCols); int16_t *slotIds = taosMemoryMalloc(num_keys * sizeof(int16_t)); - int16_t *lastColIds = taosMemoryMalloc(num_keys * sizeof(int16_t)); - int16_t *lastSlotIds = taosMemoryMalloc(num_keys * sizeof(int16_t)); - int16_t *lastrowColIds = taosMemoryMalloc(num_keys * sizeof(int16_t)); - int16_t *lastrowSlotIds = taosMemoryMalloc(num_keys * sizeof(int16_t)); - SArray *lastTmpColArray = NULL; - SArray *lastTmpIndexArray = NULL; - SArray *lastrowTmpColArray = NULL; - SArray *lastrowTmpIndexArray = NULL; + int16_t *lastColIds = NULL; + int16_t *lastSlotIds = NULL; + int16_t *lastrowColIds = NULL; + int16_t *lastrowSlotIds = NULL; + lastColIds = taosMemoryMalloc(num_keys * sizeof(int16_t)); + lastSlotIds = taosMemoryMalloc(num_keys * sizeof(int16_t)); + lastrowColIds = taosMemoryMalloc(num_keys * sizeof(int16_t)); + lastrowSlotIds = taosMemoryMalloc(num_keys * sizeof(int16_t)); + SArray *lastTmpColArray = NULL; + SArray *lastTmpIndexArray = NULL; + SArray *lastrowTmpColArray = NULL; + SArray *lastrowTmpIndexArray = NULL; int lastIndex = 0; int lastrowIndex = 0; + if (!slotIds || !lastColIds || !lastSlotIds || !lastrowColIds || !lastrowSlotIds) { + taosMemoryFree(slotIds); + taosMemoryFree(lastColIds); + taosMemoryFree(lastSlotIds); + taosMemoryFree(lastrowColIds); + TAOS_RETURN(TSDB_CODE_OUT_OF_MEMORY); + } + for (int i = 0; i < num_keys; ++i) { SIdxKey *idxKey = taosArrayGet(remainCols, i); slotIds[i] = pr->pSlotIds[idxKey->idx]; @@ -1389,7 +1462,7 @@ static int32_t tsdbCacheLoadFromRaw(STsdb *pTsdb, tb_uid_t uid, SArray *pLastArr .colVal = COL_VAL_NONE(idxKey->key.cid, pr->pSchema->columns[slotIds[i]].type)}; if (!pLastCol) { pLastCol = &noneCol; - reallocVarData(&pLastCol->colVal); + TAOS_CHECK_RETURN(reallocVarData(&pLastCol->colVal)); } taosArraySet(pLastArray, idxKey->idx, pLastCol); @@ -1403,6 +1476,14 @@ static int32_t tsdbCacheLoadFromRaw(STsdb *pTsdb, tb_uid_t uid, SArray *pLastArr } SLastCol *pTmpLastCol = taosMemoryCalloc(1, sizeof(SLastCol)); + if (!pTmpLastCol) { + taosMemoryFree(slotIds); + taosMemoryFree(lastColIds); + taosMemoryFree(lastSlotIds); + taosMemoryFree(lastrowColIds); + taosMemoryFree(lastrowSlotIds); + TAOS_RETURN(TSDB_CODE_OUT_OF_MEMORY); + } *pTmpLastCol = *pLastCol; pLastCol = pTmpLastCol; @@ -1410,26 +1491,29 @@ static int32_t tsdbCacheLoadFromRaw(STsdb *pTsdb, tb_uid_t uid, SArray *pLastArr for (int8_t i = 0; i < pLastCol->rowKey.numOfPKs; i++) { SValue *pValue = &pLastCol->rowKey.pks[i]; if (IS_VAR_DATA_TYPE(pValue->type)) { - reallocVarDataVal(pValue); + TAOS_CHECK_RETURN(reallocVarDataVal(pValue)); charge += pValue->nData; } } if (IS_VAR_DATA_TYPE(pLastCol->colVal.value.type)) { - reallocVarData(&pLastCol->colVal); + TAOS_CHECK_RETURN(reallocVarData(&pLastCol->colVal)); charge += pLastCol->colVal.value.nData; } LRUStatus status = taosLRUCacheInsert(pCache, &idxKey->key, ROCKS_KEY_LEN, pLastCol, charge, tsdbCacheDeleter, NULL, TAOS_LRU_PRIORITY_LOW, &pTsdb->flushState); if (status != TAOS_LRU_STATUS_OK) { - code = -1; + // code = -1; } // store result back to rocks cache wb = pTsdb->rCache.rwritebatch; char *value = NULL; size_t vlen = 0; - tsdbCacheSerialize(pLastCol, &value, &vlen); + code = tsdbCacheSerialize(pLastCol, &value, &vlen); + if (code) { + tsdbError("tsdb/cache: vgId:%d, serialize failed since %s.", TD_VID(pTsdb->pVnode), tstrerror(code)); + } SLastKey *key = &idxKey->key; size_t klen = ROCKS_KEY_LEN; @@ -1455,7 +1539,7 @@ static int32_t tsdbCacheLoadFromRaw(STsdb *pTsdb, tb_uid_t uid, SArray *pLastArr taosMemoryFree(slotIds); - return code; + TAOS_RETURN(code); } static int32_t tsdbCacheLoadFromRocks(STsdb *pTsdb, tb_uid_t uid, SArray *pLastArray, SArray *remainCols, @@ -1465,6 +1549,11 @@ static int32_t tsdbCacheLoadFromRocks(STsdb *pTsdb, tb_uid_t uid, SArray *pLastA char **keys_list = taosMemoryMalloc(num_keys * sizeof(char *)); size_t *keys_list_sizes = taosMemoryMalloc(num_keys * sizeof(size_t)); char *key_list = taosMemoryMalloc(num_keys * ROCKS_KEY_LEN); + if (!keys_list || !keys_list_sizes || !key_list) { + taosMemoryFree(keys_list); + taosMemoryFree(keys_list_sizes); + TAOS_RETURN(TSDB_CODE_OUT_OF_MEMORY); + } for (int i = 0; i < num_keys; ++i) { int16_t cid = *(int16_t *)taosArrayGet(remainCols, i); @@ -1476,6 +1565,13 @@ static int32_t tsdbCacheLoadFromRocks(STsdb *pTsdb, tb_uid_t uid, SArray *pLastA char **values_list = taosMemoryCalloc(num_keys, sizeof(char *)); size_t *values_list_sizes = taosMemoryCalloc(num_keys, sizeof(size_t)); char **errs = taosMemoryMalloc(num_keys * sizeof(char *)); + if (!values_list || !values_list_sizes || !errs) { + taosMemoryFree(keys_list); + taosMemoryFree(keys_list_sizes); + taosMemoryFree(values_list); + taosMemoryFree(values_list_sizes); + TAOS_RETURN(TSDB_CODE_OUT_OF_MEMORY); + } rocksdb_multi_get(pTsdb->rCache.db, pTsdb->rCache.readoptions, num_keys, (const char *const *)keys_list, keys_list_sizes, values_list, values_list_sizes, errs); for (int i = 0; i < num_keys; ++i) { @@ -1485,14 +1581,26 @@ static int32_t tsdbCacheLoadFromRocks(STsdb *pTsdb, tb_uid_t uid, SArray *pLastA rocksdb_free(errs[i]); } } + taosMemoryFree(errs); SLRUCache *pCache = pTsdb->lruCache; for (int i = 0, j = 0; i < num_keys && j < TARRAY_SIZE(remainCols); ++i) { - SLastCol *pLastCol = tsdbCacheDeserialize(values_list[i], values_list_sizes[i]); + SLastCol *pLastCol = NULL; + code = tsdbCacheDeserialize(values_list[i], values_list_sizes[i], &pLastCol); + if (code) { + tsdbError("tsdb/cache: vgId:%d, deserialize failed since %s.", TD_VID(pTsdb->pVnode), tstrerror(code)); + } SLastCol *PToFree = pLastCol; SIdxKey *idxKey = &((SIdxKey *)TARRAY_DATA(remainCols))[j]; if (pLastCol) { SLastCol *pTmpLastCol = taosMemoryCalloc(1, sizeof(SLastCol)); + if (!pTmpLastCol) { + taosMemoryFree(keys_list); + taosMemoryFree(keys_list_sizes); + taosMemoryFree(values_list); + taosMemoryFree(values_list_sizes); + TAOS_RETURN(TSDB_CODE_OUT_OF_MEMORY); + } *pTmpLastCol = *pLastCol; pLastCol = pTmpLastCol; @@ -1500,12 +1608,12 @@ static int32_t tsdbCacheLoadFromRocks(STsdb *pTsdb, tb_uid_t uid, SArray *pLastA for (int8_t i = 0; i < pLastCol->rowKey.numOfPKs; i++) { SValue *pValue = &pLastCol->rowKey.pks[i]; if (IS_VAR_DATA_TYPE(pValue->type)) { - reallocVarDataVal(pValue); + TAOS_CHECK_RETURN(reallocVarDataVal(pValue)); charge += pValue->nData; } } if (IS_VAR_DATA_TYPE(pLastCol->colVal.value.type)) { - reallocVarData(&pLastCol->colVal); + TAOS_CHECK_RETURN(reallocVarData(&pLastCol->colVal)); charge += pLastCol->colVal.value.nData; } @@ -1517,9 +1625,9 @@ static int32_t tsdbCacheLoadFromRocks(STsdb *pTsdb, tb_uid_t uid, SArray *pLastA SLastCol lastCol = *pLastCol; for (int8_t i = 0; i < lastCol.rowKey.numOfPKs; i++) { - reallocVarDataVal(&lastCol.rowKey.pks[i]); + TAOS_CHECK_RETURN(reallocVarDataVal(&lastCol.rowKey.pks[i])); } - reallocVarData(&lastCol.colVal); + TAOS_CHECK_RETURN(reallocVarData(&lastCol.colVal)); taosArraySet(pLastArray, idxKey->idx, &lastCol); taosArrayRemove(remainCols, j); @@ -1530,7 +1638,6 @@ static int32_t tsdbCacheLoadFromRocks(STsdb *pTsdb, tb_uid_t uid, SArray *pLastA } } - taosMemoryFree(errs); taosMemoryFree(key_list); taosMemoryFree(keys_list); taosMemoryFree(keys_list_sizes); @@ -1542,7 +1649,7 @@ static int32_t tsdbCacheLoadFromRocks(STsdb *pTsdb, tb_uid_t uid, SArray *pLastA code = tsdbCacheLoadFromRaw(pTsdb, uid, pLastArray, remainCols, pr, ltype); } - return code; + TAOS_RETURN(code); } int32_t tsdbCacheGetBatch(STsdb *pTsdb, tb_uid_t uid, SArray *pLastArray, SCacheRowsReader *pr, int8_t ltype) { @@ -1572,9 +1679,9 @@ int32_t tsdbCacheGetBatch(STsdb *pTsdb, tb_uid_t uid, SArray *pLastArray, SCache SLastCol lastCol = *pLastCol; for (int8_t j = 0; j < lastCol.rowKey.numOfPKs; j++) { - reallocVarDataVal(&lastCol.rowKey.pks[j]); + TAOS_CHECK_RETURN(reallocVarDataVal(&lastCol.rowKey.pks[j])); } - reallocVarData(&lastCol.colVal); + TAOS_CHECK_RETURN(reallocVarData(&lastCol.colVal)); taosArrayPush(pLastArray, &lastCol); taosLRUCacheRelease(pCache, h, false); @@ -1601,9 +1708,17 @@ int32_t tsdbCacheGetBatch(STsdb *pTsdb, tb_uid_t uid, SArray *pLastArray, SCache SLastCol lastCol = *pLastCol; for (int8_t j = 0; j < lastCol.rowKey.numOfPKs; j++) { - reallocVarDataVal(&lastCol.rowKey.pks[j]); + code = reallocVarDataVal(&lastCol.rowKey.pks[j]); + if (code) { + taosThreadMutexUnlock(&pTsdb->lruMutex); + TAOS_RETURN(code); + } + } + code = reallocVarData(&lastCol.colVal); + if (code) { + taosThreadMutexUnlock(&pTsdb->lruMutex); + TAOS_RETURN(code); } - reallocVarData(&lastCol.colVal); taosArraySet(pLastArray, idxKey->idx, &lastCol); taosLRUCacheRelease(pCache, h, false); @@ -1624,7 +1739,7 @@ int32_t tsdbCacheGetBatch(STsdb *pTsdb, tb_uid_t uid, SArray *pLastArray, SCache } } - return code; + TAOS_RETURN(code); } int32_t tsdbCacheDel(STsdb *pTsdb, tb_uid_t suid, tb_uid_t uid, TSKEY sKey, TSKEY eKey) { @@ -1632,22 +1747,28 @@ int32_t tsdbCacheDel(STsdb *pTsdb, tb_uid_t suid, tb_uid_t uid, TSKEY sKey, TSKE // fetch schema STSchema *pTSchema = NULL; int sver = -1; - code = metaGetTbTSchemaEx(pTsdb->pVnode->pMeta, suid, uid, sver, &pTSchema); - if (code != TSDB_CODE_SUCCESS) { - terrno = code; - return -1; - } + + TAOS_CHECK_RETURN(metaGetTbTSchemaEx(pTsdb->pVnode->pMeta, suid, uid, sver, &pTSchema)); // build keys & multi get from rocks - int num_keys = pTSchema->numOfCols; - char **keys_list = taosMemoryCalloc(num_keys * 2, sizeof(char *)); - size_t *keys_list_sizes = taosMemoryCalloc(num_keys * 2, sizeof(size_t)); + int num_keys = pTSchema->numOfCols; + char **keys_list = taosMemoryCalloc(num_keys * 2, sizeof(char *)); + size_t *keys_list_sizes = taosMemoryCalloc(num_keys * 2, sizeof(size_t)); + if (!keys_list || !keys_list_sizes) { + taosMemoryFree(keys_list); + TAOS_RETURN(TSDB_CODE_OUT_OF_MEMORY); + } const size_t klen = ROCKS_KEY_LEN; for (int i = 0; i < num_keys; ++i) { int16_t cid = pTSchema->columns[i].colId; char *keys = taosMemoryCalloc(2, sizeof(SLastKey)); + if (!keys) { + taosMemoryFree(keys_list); + taosMemoryFree(keys_list_sizes); + TAOS_RETURN(TSDB_CODE_OUT_OF_MEMORY); + } ((SLastKey *)keys)[0] = (SLastKey){.lflag = LFLAG_LAST, .uid = uid, .cid = cid}; ((SLastKey *)keys)[1] = (SLastKey){.lflag = LFLAG_LAST_ROW, .uid = uid, .cid = cid}; @@ -1659,6 +1780,15 @@ int32_t tsdbCacheDel(STsdb *pTsdb, tb_uid_t suid, tb_uid_t uid, TSKEY sKey, TSKE char **values_list = taosMemoryCalloc(num_keys * 2, sizeof(char *)); size_t *values_list_sizes = taosMemoryCalloc(num_keys * 2, sizeof(size_t)); char **errs = taosMemoryCalloc(num_keys * 2, sizeof(char *)); + if (!values_list_sizes || !values_list) { + taosMemoryFree(keys_list); + taosMemoryFree(keys_list_sizes); + taosMemoryFree(values_list); + for (int i = 0; i < num_keys; ++i) { + taosMemoryFree(keys_list[i]); + } + TAOS_RETURN(TSDB_CODE_OUT_OF_MEMORY); + } (void)tsdbCacheCommit(pTsdb); @@ -1679,14 +1809,22 @@ int32_t tsdbCacheDel(STsdb *pTsdb, tb_uid_t suid, tb_uid_t uid, TSKEY sKey, TSKE rocksdb_writebatch_t *wb = pTsdb->rCache.writebatch; for (int i = 0; i < num_keys; ++i) { - SLastCol *pLastCol = tsdbCacheDeserialize(values_list[i], values_list_sizes[i]); + SLastCol *pLastCol = NULL; + code = tsdbCacheDeserialize(values_list[i], values_list_sizes[i], &pLastCol); + if (code) { + tsdbError("tsdb/cache: vgId:%d, deserialize failed since %s.", TD_VID(pTsdb->pVnode), tstrerror(code)); + } taosThreadMutexLock(&pTsdb->rCache.rMutex); if (NULL != pLastCol && (pLastCol->rowKey.ts <= eKey && pLastCol->rowKey.ts >= sKey)) { rocksdb_writebatch_delete(wb, keys_list[i], klen); } taosMemoryFreeClear(pLastCol); - pLastCol = tsdbCacheDeserialize(values_list[i + num_keys], values_list_sizes[i + num_keys]); + pLastCol = NULL; + code = tsdbCacheDeserialize(values_list[i + num_keys], values_list_sizes[i + num_keys], &pLastCol); + if (code) { + tsdbError("tsdb/cache: vgId:%d, deserialize failed since %s.", TD_VID(pTsdb->pVnode), tstrerror(code)); + } if (NULL != pLastCol && (pLastCol->rowKey.ts <= eKey && pLastCol->rowKey.ts >= sKey)) { rocksdb_writebatch_delete(wb, keys_list[num_keys + i], klen); } @@ -1746,45 +1884,23 @@ int32_t tsdbCacheDel(STsdb *pTsdb, tb_uid_t suid, tb_uid_t uid, TSKEY sKey, TSKE _exit: taosMemoryFree(pTSchema); - return code; + TAOS_RETURN(code); } int32_t tsdbOpenCache(STsdb *pTsdb) { - int32_t code = 0; - SLRUCache *pCache = NULL; - size_t cfgCapacity = pTsdb->pVnode->config.cacheLastSize * 1024 * 1024; + int32_t code = 0, lino = 0; + size_t cfgCapacity = pTsdb->pVnode->config.cacheLastSize * 1024 * 1024; - pCache = taosLRUCacheInit(cfgCapacity, 0, .5); + SLRUCache *pCache = taosLRUCacheInit(cfgCapacity, 0, .5); if (pCache == NULL) { - code = TSDB_CODE_OUT_OF_MEMORY; - goto _err; + TAOS_CHECK_GOTO(TSDB_CODE_OUT_OF_MEMORY, &lino, _err); } -#if 0 - code = tsdbOpenBICache(pTsdb); - if (code != TSDB_CODE_SUCCESS) { - code = TSDB_CODE_OUT_OF_MEMORY; - goto _err; - } -#endif + TAOS_CHECK_GOTO(tsdbOpenBCache(pTsdb), &lino, _err); - code = tsdbOpenBCache(pTsdb); - if (code != TSDB_CODE_SUCCESS) { - code = TSDB_CODE_OUT_OF_MEMORY; - goto _err; - } + TAOS_CHECK_GOTO(tsdbOpenPgCache(pTsdb), &lino, _err); - code = tsdbOpenPgCache(pTsdb); - if (code != TSDB_CODE_SUCCESS) { - code = TSDB_CODE_OUT_OF_MEMORY; - goto _err; - } - - code = tsdbOpenRocksCache(pTsdb); - if (code != TSDB_CODE_SUCCESS) { - code = TSDB_CODE_OUT_OF_MEMORY; - goto _err; - } + TAOS_CHECK_GOTO(tsdbOpenRocksCache(pTsdb), &lino, _err); taosLRUCacheSetStrictCapacity(pCache, false); @@ -1794,8 +1910,13 @@ int32_t tsdbOpenCache(STsdb *pTsdb) { pTsdb->flushState.flush_count = 0; _err: + if (code) { + tsdbError("tsdb/cache: vgId:%d, open failed at line %d since %s.", TD_VID(pTsdb->pVnode), lino, tstrerror(code)); + } + pTsdb->lruCache = pCache; - return code; + + TAOS_RETURN(code); } void tsdbCloseCache(STsdb *pTsdb) { @@ -1808,9 +1929,6 @@ void tsdbCloseCache(STsdb *pTsdb) { taosThreadMutexDestroy(&pTsdb->lruMutex); } -#if 0 - tsdbCloseBICache(pTsdb); -#endif tsdbCloseBCache(pTsdb); tsdbClosePgCache(pTsdb); tsdbCloseRocksCache(pTsdb); @@ -1826,320 +1944,6 @@ static void getTableCacheKey(tb_uid_t uid, int cacheType, char *key, int *len) { *len = sizeof(uint64_t); } -#ifdef BUILD_NO_CALL -static void deleteTableCacheLast(const void *key, size_t keyLen, void *value, void *ud) { - (void)ud; - SArray *pLastArray = (SArray *)value; - int16_t nCol = taosArrayGetSize(pLastArray); - for (int16_t iCol = 0; iCol < nCol; ++iCol) { - SLastCol *pLastCol = (SLastCol *)taosArrayGet(pLastArray, iCol); - if (IS_VAR_DATA_TYPE(pLastCol->colVal.type) && pLastCol->colVal.value.nData > 0) { - taosMemoryFree(pLastCol->colVal.value.pData); - } - } - - taosArrayDestroy(value); -} - -int32_t tsdbCacheDeleteLastrow(SLRUCache *pCache, tb_uid_t uid, TSKEY eKey) { - int32_t code = 0; - - char key[32] = {0}; - int keyLen = 0; - - // getTableCacheKey(uid, "lr", key, &keyLen); - getTableCacheKey(uid, 0, key, &keyLen); - LRUHandle *h = taosLRUCacheLookup(pCache, key, keyLen); - if (h) { - SArray *pLast = (SArray *)taosLRUCacheValue(pCache, h); - bool invalidate = false; - int16_t nCol = taosArrayGetSize(pLast); - - for (int16_t iCol = 0; iCol < nCol; ++iCol) { - SLastCol *tTsVal = (SLastCol *)taosArrayGet(pLast, iCol); - if (eKey >= tTsVal->ts) { - invalidate = true; - break; - } - } - - taosLRUCacheRelease(pCache, h, invalidate); - if (invalidate) { - taosLRUCacheErase(pCache, key, keyLen); - } - } - - return code; -} - -int32_t tsdbCacheDeleteLast(SLRUCache *pCache, tb_uid_t uid, TSKEY eKey) { - int32_t code = 0; - - char key[32] = {0}; - int keyLen = 0; - - // getTableCacheKey(uid, "l", key, &keyLen); - getTableCacheKey(uid, 1, key, &keyLen); - LRUHandle *h = taosLRUCacheLookup(pCache, key, keyLen); - if (h) { - SArray *pLast = (SArray *)taosLRUCacheValue(pCache, h); - bool invalidate = false; - int16_t nCol = taosArrayGetSize(pLast); - - for (int16_t iCol = 0; iCol < nCol; ++iCol) { - SLastCol *tTsVal = (SLastCol *)taosArrayGet(pLast, iCol); - if (eKey >= tTsVal->ts) { - invalidate = true; - break; - } - } - - taosLRUCacheRelease(pCache, h, invalidate); - if (invalidate) { - taosLRUCacheErase(pCache, key, keyLen); - } - } - - return code; -} - -int32_t tsdbCacheInsertLastrow(SLRUCache *pCache, STsdb *pTsdb, tb_uid_t uid, TSDBROW *row, bool dup) { - int32_t code = 0; - STSRow *cacheRow = NULL; - char key[32] = {0}; - int keyLen = 0; - - // getTableCacheKey(uid, "lr", key, &keyLen); - getTableCacheKey(uid, 0, key, &keyLen); - LRUHandle *h = taosLRUCacheLookup(pCache, key, keyLen); - if (h) { - STSchema *pTSchema = metaGetTbTSchema(pTsdb->pVnode->pMeta, uid, -1, 1); - TSKEY keyTs = TSDBROW_TS(row); - bool invalidate = false; - - SArray *pLast = (SArray *)taosLRUCacheValue(pCache, h); - int16_t nCol = taosArrayGetSize(pLast); - int16_t iCol = 0; - - if (nCol <= 0) { - nCol = pTSchema->numOfCols; - - STColumn *pTColumn = &pTSchema->columns[0]; - SColVal tColVal = COL_VAL_VALUE(pTColumn->colId, pTColumn->type, (SValue){.val = keyTs}); - if (taosArrayPush(pLast, &(SLastCol){.ts = keyTs, .colVal = tColVal}) == NULL) { - terrno = TSDB_CODE_OUT_OF_MEMORY; - code = TSDB_CODE_OUT_OF_MEMORY; - goto _invalidate; - } - - for (iCol = 1; iCol < nCol; ++iCol) { - SColVal colVal = {0}; - tsdbRowGetColVal(row, pTSchema, iCol, &colVal); - - SLastCol lastCol = {.ts = keyTs, .colVal = colVal}; - if (IS_VAR_DATA_TYPE(colVal.type) && colVal.value.nData > 0) { - lastCol.colVal.value.pData = taosMemoryMalloc(colVal.value.nData); - if (lastCol.colVal.value.pData == NULL) { - terrno = TSDB_CODE_OUT_OF_MEMORY; - code = TSDB_CODE_OUT_OF_MEMORY; - goto _invalidate; - } - memcpy(lastCol.colVal.value.pData, colVal.value.pData, colVal.value.nData); - } - - if (taosArrayPush(pLast, &lastCol) == NULL) { - code = TSDB_CODE_OUT_OF_MEMORY; - goto _invalidate; - } - } - - goto _invalidate; - } - - if (nCol != pTSchema->numOfCols) { - invalidate = true; - goto _invalidate; - } - - SLastCol *tTsVal = (SLastCol *)taosArrayGet(pLast, iCol); - if (keyTs > tTsVal->ts) { - STColumn *pTColumn = &pTSchema->columns[0]; - SColVal tColVal = COL_VAL_VALUE(pTColumn->colId, pTColumn->type, (SValue){.val = keyTs}); - - taosArraySet(pLast, iCol, &(SLastCol){.ts = keyTs, .colVal = tColVal}); - } - - for (++iCol; iCol < nCol; ++iCol) { - SLastCol *tTsVal1 = (SLastCol *)taosArrayGet(pLast, iCol); - if (keyTs >= tTsVal1->ts) { - SColVal *tColVal = &tTsVal1->colVal; - - SColVal colVal = {0}; - tsdbRowGetColVal(row, pTSchema, iCol, &colVal); - - if (colVal.cid != tColVal->cid) { - invalidate = true; - goto _invalidate; - } - - if (!COL_VAL_IS_NONE(&colVal)) { - if (keyTs == tTsVal1->ts && !COL_VAL_IS_NONE(tColVal)) { - invalidate = true; - - break; - } else { // new inserting key is greater than cached, update cached entry - SLastCol lastCol = {.ts = keyTs, .colVal = colVal}; - if (IS_VAR_DATA_TYPE(colVal.type) && colVal.value.nData > 0) { - SLastCol *pLastCol = (SLastCol *)taosArrayGet(pLast, iCol); - if (pLastCol->colVal.value.nData > 0 && NULL != pLastCol->colVal.value.pData) - taosMemoryFree(pLastCol->colVal.value.pData); - - lastCol.colVal.value.pData = taosMemoryMalloc(colVal.value.nData); - if (lastCol.colVal.value.pData == NULL) { - terrno = TSDB_CODE_OUT_OF_MEMORY; - code = TSDB_CODE_OUT_OF_MEMORY; - goto _invalidate; - } - memcpy(lastCol.colVal.value.pData, colVal.value.pData, colVal.value.nData); - } - - taosArraySet(pLast, iCol, &lastCol); - } - } - } - } - - _invalidate: - taosMemoryFreeClear(pTSchema); - - taosLRUCacheRelease(pCache, h, invalidate); - if (invalidate) { - taosLRUCacheErase(pCache, key, keyLen); - } - } - - return code; -} - -int32_t tsdbCacheInsertLast(SLRUCache *pCache, tb_uid_t uid, TSDBROW *row, STsdb *pTsdb) { - int32_t code = 0; - STSRow *cacheRow = NULL; - char key[32] = {0}; - int keyLen = 0; - - // getTableCacheKey(uid, "l", key, &keyLen); - getTableCacheKey(uid, 1, key, &keyLen); - LRUHandle *h = taosLRUCacheLookup(pCache, key, keyLen); - if (h) { - STSchema *pTSchema = metaGetTbTSchema(pTsdb->pVnode->pMeta, uid, -1, 1); - TSKEY keyTs = TSDBROW_TS(row); - bool invalidate = false; - - SArray *pLast = (SArray *)taosLRUCacheValue(pCache, h); - int16_t nCol = taosArrayGetSize(pLast); - int16_t iCol = 0; - - if (nCol <= 0) { - nCol = pTSchema->numOfCols; - - STColumn *pTColumn = &pTSchema->columns[0]; - SColVal tColVal = COL_VAL_VALUE(pTColumn->colId, pTColumn->type, (SValue){.val = keyTs}); - if (taosArrayPush(pLast, &(SLastCol){.ts = keyTs, .colVal = tColVal}) == NULL) { - terrno = TSDB_CODE_OUT_OF_MEMORY; - code = TSDB_CODE_OUT_OF_MEMORY; - goto _invalidate; - } - - for (iCol = 1; iCol < nCol; ++iCol) { - SColVal colVal = {0}; - tsdbRowGetColVal(row, pTSchema, iCol, &colVal); - - SLastCol lastCol = {.ts = keyTs, .colVal = colVal}; - if (IS_VAR_DATA_TYPE(colVal.type) && colVal.value.nData > 0) { - lastCol.colVal.value.pData = taosMemoryMalloc(colVal.value.nData); - if (lastCol.colVal.value.pData == NULL) { - terrno = TSDB_CODE_OUT_OF_MEMORY; - code = TSDB_CODE_OUT_OF_MEMORY; - goto _invalidate; - } - memcpy(lastCol.colVal.value.pData, colVal.value.pData, colVal.value.nData); - } - - if (taosArrayPush(pLast, &lastCol) == NULL) { - code = TSDB_CODE_OUT_OF_MEMORY; - goto _invalidate; - } - } - - goto _invalidate; - } - - if (nCol != pTSchema->numOfCols) { - invalidate = true; - goto _invalidate; - } - - SLastCol *tTsVal = (SLastCol *)taosArrayGet(pLast, iCol); - if (keyTs > tTsVal->ts) { - STColumn *pTColumn = &pTSchema->columns[0]; - SColVal tColVal = COL_VAL_VALUE(pTColumn->colId, pTColumn->type, (SValue){.val = keyTs}); - - taosArraySet(pLast, iCol, &(SLastCol){.ts = keyTs, .colVal = tColVal}); - } - - for (++iCol; iCol < nCol; ++iCol) { - SLastCol *tTsVal1 = (SLastCol *)taosArrayGet(pLast, iCol); - if (keyTs >= tTsVal1->ts) { - SColVal *tColVal = &tTsVal1->colVal; - - SColVal colVal = {0}; - tsdbRowGetColVal(row, pTSchema, iCol, &colVal); - - if (colVal.cid != tColVal->cid) { - invalidate = true; - goto _invalidate; - } - - if (COL_VAL_IS_VALUE(&colVal)) { - if (keyTs == tTsVal1->ts && COL_VAL_IS_VALUE(tColVal)) { - invalidate = true; - - break; - } else { - SLastCol lastCol = {.ts = keyTs, .colVal = colVal}; - if (IS_VAR_DATA_TYPE(colVal.type) && colVal.value.nData > 0) { - SLastCol *pLastCol = (SLastCol *)taosArrayGet(pLast, iCol); - if (pLastCol->colVal.value.nData > 0 && NULL != pLastCol->colVal.value.pData) - taosMemoryFree(pLastCol->colVal.value.pData); - - lastCol.colVal.value.pData = taosMemoryMalloc(colVal.value.nData); - if (lastCol.colVal.value.pData == NULL) { - terrno = TSDB_CODE_OUT_OF_MEMORY; - code = TSDB_CODE_OUT_OF_MEMORY; - goto _invalidate; - } - memcpy(lastCol.colVal.value.pData, colVal.value.pData, colVal.value.nData); - } - - taosArraySet(pLast, iCol, &lastCol); - } - } - } - } - - _invalidate: - taosMemoryFreeClear(pTSchema); - - taosLRUCacheRelease(pCache, h, invalidate); - if (invalidate) { - taosLRUCacheErase(pCache, key, keyLen); - } - } - - return code; -} -#endif - static tb_uid_t getTableSuidByUid(tb_uid_t uid, STsdb *pTsdb) { tb_uid_t suid = 0; @@ -2170,7 +1974,7 @@ static int32_t getTableDelDataFromDelIdx(SDelFReader *pDelReader, SDelIdx *pDelI code = tsdbReadDelDatav1(pDelReader, pDelIdx, aDelData, INT64_MAX); } - return code; + TAOS_RETURN(code); } static int32_t getTableDelDataFromTbData(STbData *pTbData, SArray *aDelData) { @@ -2184,53 +1988,6 @@ static int32_t getTableDelDataFromTbData(STbData *pTbData, SArray *aDelData) { return code; } -#ifdef BUILD_NO_CALL -static int32_t getTableDelData(STbData *pMem, STbData *pIMem, SDelFReader *pDelReader, SDelIdx *pDelIdx, - SArray *aDelData) { - int32_t code = 0; - - if (pDelIdx) { - code = getTableDelDataFromDelIdx(pDelReader, pDelIdx, aDelData); - if (code) goto _err; - } - - if (pMem) { - code = getTableDelDataFromTbData(pMem, aDelData); - if (code) goto _err; - } - - if (pIMem) { - code = getTableDelDataFromTbData(pIMem, aDelData); - if (code) goto _err; - } - -_err: - return code; -} - -static int32_t getTableDelSkyline(STbData *pMem, STbData *pIMem, SDelFReader *pDelReader, SDelIdx *pDelIdx, - SArray *aSkyline) { - int32_t code = 0; - SArray *aDelData = NULL; - - aDelData = taosArrayInit(32, sizeof(SDelData)); - code = getTableDelData(pMem, pIMem, pDelReader, pDelIdx, aDelData); - if (code) goto _err; - - size_t nDelData = taosArrayGetSize(aDelData); - if (nDelData > 0) { - code = tsdbBuildDeleteSkyline(aDelData, 0, (int32_t)(nDelData - 1), aSkyline); - if (code) goto _err; - } - -_err: - if (aDelData) { - taosArrayDestroy(aDelData); - } - return code; -} -#endif - static void freeTableInfoFunc(void *param) { void **p = (void **)param; taosMemoryFreeClear(*p); @@ -2247,7 +2004,9 @@ static STableLoadInfo *getTableLoadInfo(SCacheRowsReader *pReader, uint64_t uid) STableLoadInfo **ppInfo = tSimpleHashGet(pReader->pTableMap, &uid, sizeof(uid)); if (!ppInfo) { pInfo = taosMemoryCalloc(1, sizeof(STableLoadInfo)); - tSimpleHashPut(pReader->pTableMap, &uid, sizeof(uint64_t), &pInfo, POINTER_BYTES); + if (pInfo) { + tSimpleHashPut(pReader->pTableMap, &uid, sizeof(uint64_t), &pInfo, POINTER_BYTES); + } return pInfo; } @@ -2260,6 +2019,9 @@ static uint64_t *getUidList(SCacheRowsReader *pReader) { int32_t numOfTables = pReader->numOfTables; pReader->uidList = taosMemoryMalloc(numOfTables * sizeof(uint64_t)); + if (!pReader->uidList) { + return NULL; + } for (int32_t i = 0; i < numOfTables; ++i) { uint64_t uid = pReader->pTableList[i].uid; @@ -2275,9 +2037,13 @@ static uint64_t *getUidList(SCacheRowsReader *pReader) { static int32_t loadTombFromBlk(const TTombBlkArray *pTombBlkArray, SCacheRowsReader *pReader, void *pFileReader, bool isFile) { int32_t code = 0; - uint64_t *uidList = getUidList(pReader); int32_t numOfTables = pReader->numOfTables; int64_t suid = pReader->info.suid; + uint64_t *uidList = getUidList(pReader); + + if (!uidList) { + TAOS_RETURN(TSDB_CODE_OUT_OF_MEMORY); + } for (int i = 0, j = 0; i < pTombBlkArray->size && j < numOfTables; ++i) { STombBlk *pTombBlk = &pTombBlkArray->data[i]; @@ -2294,7 +2060,7 @@ static int32_t loadTombFromBlk(const TTombBlkArray *pTombBlkArray, SCacheRowsRea code = isFile ? tsdbDataFileReadTombBlock(pFileReader, &pTombBlkArray->data[i], &block) : tsdbSttFileReadTombBlock(pFileReader, &pTombBlkArray->data[i], &block); if (code != TSDB_CODE_SUCCESS) { - return code; + TAOS_RETURN(code); } uint64_t uid = uidList[j]; @@ -2358,37 +2124,28 @@ static int32_t loadTombFromBlk(const TTombBlkArray *pTombBlkArray, SCacheRowsRea tTombBlockDestroy(&block); if (finished) { - return code; + TAOS_RETURN(code); } } - return TSDB_CODE_SUCCESS; + TAOS_RETURN(TSDB_CODE_SUCCESS); } static int32_t loadDataTomb(SCacheRowsReader *pReader, SDataFileReader *pFileReader) { - int32_t code = 0; - const TTombBlkArray *pBlkArray = NULL; - code = tsdbDataFileReadTombBlk(pFileReader, &pBlkArray); - if (code != TSDB_CODE_SUCCESS) { - return code; - } - return loadTombFromBlk(pBlkArray, pReader, pFileReader, true); + TAOS_CHECK_RETURN(tsdbDataFileReadTombBlk(pFileReader, &pBlkArray)); + + TAOS_RETURN(loadTombFromBlk(pBlkArray, pReader, pFileReader, true)); } static int32_t loadSttTomb(STsdbReader *pTsdbReader, SSttFileReader *pSttFileReader, SSttBlockLoadInfo *pLoadInfo) { - int32_t code = 0; - - SCacheRowsReader *pReader = (SCacheRowsReader *)pTsdbReader; - + SCacheRowsReader *pReader = (SCacheRowsReader *)pTsdbReader; const TTombBlkArray *pBlkArray = NULL; - code = tsdbSttFileReadTombBlk(pSttFileReader, &pBlkArray); - if (code != TSDB_CODE_SUCCESS) { - return code; - } - return loadTombFromBlk(pBlkArray, pReader, pSttFileReader, false); + TAOS_CHECK_RETURN(tsdbSttFileReadTombBlk(pSttFileReader, &pBlkArray)); + + TAOS_RETURN(loadTombFromBlk(pBlkArray, pReader, pSttFileReader, false)); } typedef struct { @@ -2421,14 +2178,11 @@ static int32_t lastIterOpen(SFSLastIter *iter, STFileSet *pFileSet, STsdb *pTsdb .pCurRowKey = &pr->rowKey, }; - code = tMergeTreeOpen2(&iter->mergeTree, &conf, NULL); - if (code != TSDB_CODE_SUCCESS) { - return -1; - } + TAOS_CHECK_RETURN(tMergeTreeOpen2(&iter->mergeTree, &conf, NULL)); iter->pMergeTree = &iter->mergeTree; - return code; + TAOS_RETURN(code); } static int32_t lastIterClose(SFSLastIter **iter) { @@ -2441,7 +2195,7 @@ static int32_t lastIterClose(SFSLastIter **iter) { *iter = NULL; - return code; + TAOS_RETURN(code); } static int32_t lastIterNext(SFSLastIter *iter, TSDBROW **ppRow) { @@ -2450,12 +2204,13 @@ static int32_t lastIterNext(SFSLastIter *iter, TSDBROW **ppRow) { bool hasVal = tMergeTreeNext(iter->pMergeTree); if (!hasVal) { *ppRow = NULL; - return code; + + TAOS_RETURN(code); } *ppRow = tMergeTreeGetRow(iter->pMergeTree); - return code; + TAOS_RETURN(code); } typedef enum SFSNEXTROWSTATES { @@ -2506,8 +2261,8 @@ static void clearLastFileSet(SFSNextRowIter *state); static int32_t getNextRowFromFS(void *iter, TSDBROW **ppRow, bool *pIgnoreEarlierTs, bool isLast, int16_t *aCols, int nCols) { + int32_t code = 0, lino = 0; SFSNextRowIter *state = (SFSNextRowIter *)iter; - int32_t code = 0; STsdb *pTsdb = state->pr->pTsdb; if (SFSNEXTROW_FS == state->state) { @@ -2522,7 +2277,8 @@ static int32_t getNextRowFromFS(void *iter, TSDBROW **ppRow, bool *pIgnoreEarlie if (--state->iFileSet < 0) { *ppRow = NULL; - return code; + + TAOS_RETURN(code); } else { state->pFileSet = TARRAY2_GET(state->aDFileSet, state->iFileSet); } @@ -2552,19 +2308,13 @@ static int32_t getNextRowFromFS(void *iter, TSDBROW **ppRow, bool *pIgnoreEarlie filesName[3] = pFileObj[3]->fname; } - code = tsdbDataFileReaderOpen(filesName, &conf, &state->pr->pFileReader); - if (code != TSDB_CODE_SUCCESS) { - goto _err; - } + TAOS_CHECK_GOTO(tsdbDataFileReaderOpen(filesName, &conf, &state->pr->pFileReader), &lino, _err); state->pr->pCurFileSet = state->pFileSet; loadDataTomb(state->pr, state->pr->pFileReader); - int32_t code = tsdbDataFileReadBrinBlk(state->pr->pFileReader, &state->pr->pBlkArray); - if (code != TSDB_CODE_SUCCESS) { - goto _err; - } + TAOS_CHECK_GOTO(tsdbDataFileReadBrinBlk(state->pr->pFileReader, &state->pr->pBlkArray), &lino, _err); } if (!state->pIndexList) { @@ -2601,16 +2351,11 @@ static int32_t getNextRowFromFS(void *iter, TSDBROW **ppRow, bool *pIgnoreEarlie state->pr->pCurFileSet = state->pFileSet; } - code = lastIterOpen(&state->lastIter, state->pFileSet, pTsdb, state->pTSchema, state->suid, state->uid, state->pr, - state->lastTs, aCols, nCols); - if (code != TSDB_CODE_SUCCESS) { - goto _err; - } + TAOS_CHECK_GOTO(lastIterOpen(&state->lastIter, state->pFileSet, pTsdb, state->pTSchema, state->suid, state->uid, + state->pr, state->lastTs, aCols, nCols), + &lino, _err); - code = lastIterNext(&state->lastIter, &state->pLastRow); - if (code != TSDB_CODE_SUCCESS) { - goto _err; - } + TAOS_CHECK_GOTO(lastIterNext(&state->lastIter, &state->pLastRow), &lino, _err); if (!state->pLastRow) { state->lastEmpty = 1; @@ -2627,7 +2372,8 @@ static int32_t getNextRowFromFS(void *iter, TSDBROW **ppRow, bool *pIgnoreEarlie *ppRow = state->pLastRow; state->pLastRow = NULL; - return code; + + TAOS_RETURN(code); } } @@ -2635,10 +2381,7 @@ static int32_t getNextRowFromFS(void *iter, TSDBROW **ppRow, bool *pIgnoreEarlie } if (SFSNEXTROW_NEXTSTTROW == state->state) { - code = lastIterNext(&state->lastIter, &state->pLastRow); - if (code != TSDB_CODE_SUCCESS) { - goto _err; - } + TAOS_CHECK_GOTO(lastIterNext(&state->lastIter, &state->pLastRow), &lino, _err); if (!state->pLastRow) { if (state->pLastIter) { @@ -2651,7 +2394,8 @@ static int32_t getNextRowFromFS(void *iter, TSDBROW **ppRow, bool *pIgnoreEarlie } else { *ppRow = state->pLastRow; state->pLastRow = NULL; - return code; + + TAOS_RETURN(code); } } @@ -2677,10 +2421,8 @@ static int32_t getNextRowFromFS(void *iter, TSDBROW **ppRow, bool *pIgnoreEarlie } else { tBrinBlockClear(&state->brinBlock); } - code = tsdbDataFileReadBrinBlock(state->pr->pFileReader, pBrinBlk, &state->brinBlock); - if (code != TSDB_CODE_SUCCESS) { - goto _err; - } + + TAOS_CHECK_GOTO(tsdbDataFileReadBrinBlock(state->pr->pFileReader, pBrinBlk, &state->brinBlock), &lino, _err); state->iBrinRecord = state->brinBlock.numOfRecords - 1; state->state = SFSNEXTROW_BRINBLOCK; @@ -2692,10 +2434,8 @@ static int32_t getNextRowFromFS(void *iter, TSDBROW **ppRow, bool *pIgnoreEarlie tBrinBlockClear(&state->brinBlock); goto _next_brinindex; } - code = tBrinBlockGet(&state->brinBlock, state->iBrinRecord, &state->brinRecord); - if (code != TSDB_CODE_SUCCESS) { - goto _err; - } + + TAOS_CHECK_GOTO(tBrinBlockGet(&state->brinBlock, state->iBrinRecord, &state->brinRecord), &lino, _err); SBrinRecord *pRecord = &state->brinRecord; if (pRecord->uid != state->uid) { @@ -2712,8 +2452,8 @@ static int32_t getNextRowFromFS(void *iter, TSDBROW **ppRow, bool *pIgnoreEarlie if (!state->pBlockData) { state->pBlockData = &state->blockData; - code = tBlockDataCreate(&state->blockData); - if (code) goto _err; + + TAOS_CHECK_GOTO(tBlockDataCreate(&state->blockData), &lino, _err); } else { tBlockDataReset(state->pBlockData); } @@ -2722,11 +2462,10 @@ static int32_t getNextRowFromFS(void *iter, TSDBROW **ppRow, bool *pIgnoreEarlie --nCols; ++aCols; } - code = tsdbDataFileReadBlockDataByColumn(state->pr->pFileReader, pRecord, state->pBlockData, state->pTSchema, aCols, - nCols); - if (code != TSDB_CODE_SUCCESS) { - goto _err; - } + + TAOS_CHECK_GOTO(tsdbDataFileReadBlockDataByColumn(state->pr->pFileReader, pRecord, state->pBlockData, + state->pTSchema, aCols, nCols), + &lino, _err); state->nRow = state->blockData.nRow; state->iRow = state->nRow - 1; @@ -2749,10 +2488,7 @@ static int32_t getNextRowFromFS(void *iter, TSDBROW **ppRow, bool *pIgnoreEarlie if (!state->pLastRow) { // get next row from fslast and process with fs row, --state->Row if select fs row - code = lastIterNext(&state->lastIter, &state->pLastRow); - if (code != TSDB_CODE_SUCCESS) { - goto _err; - } + TAOS_CHECK_GOTO(lastIterNext(&state->lastIter, &state->pLastRow), &lino, _err); } if (!state->pLastRow) { @@ -2771,34 +2507,27 @@ static int32_t getNextRowFromFS(void *iter, TSDBROW **ppRow, bool *pIgnoreEarlie if (lastRowTs > rowTs) { *ppRow = state->pLastRow; state->pLastRow = NULL; - return code; + + TAOS_RETURN(code); } else if (lastRowTs < rowTs) { *ppRow = &state->row; --state->iRow; - return code; + + TAOS_RETURN(code); } else { // TODO: merge rows and *ppRow = mergedRow SRowMerger *pMerger = &state->rowMerger; tsdbRowMergerInit(pMerger, state->pTSchema); - code = tsdbRowMergerAdd(pMerger, &state->row, state->pTSchema); - if (code != TSDB_CODE_SUCCESS) { - goto _err; - } - code = tsdbRowMergerAdd(pMerger, state->pLastRow, state->pTSchema); - if (code != TSDB_CODE_SUCCESS) { - goto _err; - } + TAOS_CHECK_GOTO(tsdbRowMergerAdd(pMerger, &state->row, state->pTSchema), &lino, _err); + TAOS_CHECK_GOTO(tsdbRowMergerAdd(pMerger, state->pLastRow, state->pTSchema), &lino, _err); if (state->pTSRow) { taosMemoryFree(state->pTSRow); state->pTSRow = NULL; } - code = tsdbRowMergerGetRow(pMerger, &state->pTSRow); - if (code != TSDB_CODE_SUCCESS) { - goto _err; - } + TAOS_CHECK_GOTO(tsdbRowMergerGetRow(pMerger, &state->pTSRow), &lino, _err); state->row = tsdbRowFromTSRow(TSDBROW_VERSION(&state->row), state->pTSRow); *ppRow = &state->row; @@ -2806,7 +2535,7 @@ static int32_t getNextRowFromFS(void *iter, TSDBROW **ppRow, bool *pIgnoreEarlie tsdbRowMergerClear(pMerger); - return code; + TAOS_RETURN(code); } } @@ -2815,7 +2544,12 @@ _err: *ppRow = NULL; - return code; + if (code) { + tsdbError("tsdb/cache: vgId:%d, %s failed at line %d since %s.", TD_VID(pTsdb->pVnode), __func__, lino, + tstrerror(code)); + } + + TAOS_RETURN(code); } typedef enum SMEMNEXTROWSTATES { @@ -2841,7 +2575,8 @@ static int32_t getNextRowFromMem(void *iter, TSDBROW **ppRow, bool *pIgnoreEarli if (state->pMem->maxKey <= state->lastTs) { *ppRow = NULL; *pIgnoreEarlierTs = true; - return code; + + TAOS_RETURN(code); } tsdbTbDataIterOpen(state->pMem, NULL, 1, &state->iter); @@ -2850,23 +2585,23 @@ static int32_t getNextRowFromMem(void *iter, TSDBROW **ppRow, bool *pIgnoreEarli *ppRow = pMemRow; state->state = SMEMNEXTROW_NEXT; - return code; + TAOS_RETURN(code); } } *ppRow = NULL; - return code; + TAOS_RETURN(code); } case SMEMNEXTROW_NEXT: if (tsdbTbDataIterNext(&state->iter)) { *ppRow = tsdbTbDataIterGet(&state->iter); - return code; + TAOS_RETURN(code); } else { *ppRow = NULL; - return code; + TAOS_RETURN(code); } default: ASSERT(0); @@ -2875,7 +2610,8 @@ static int32_t getNextRowFromMem(void *iter, TSDBROW **ppRow, bool *pIgnoreEarli _err: *ppRow = NULL; - return code; + + TAOS_RETURN(code); } static bool tsdbKeyDeleted(TSDBKEY *key, SArray *pSkyline, int64_t *iSkyline) { @@ -2942,7 +2678,7 @@ int32_t clearNextRowFromFS(void *iter) { SFSNextRowIter *state = (SFSNextRowIter *)iter; if (!state) { - return code; + TAOS_RETURN(code); } if (state->pLastIter) { @@ -2974,7 +2710,7 @@ int32_t clearNextRowFromFS(void *iter) { state->pRowIter->pSkyline = NULL; } - return code; + TAOS_RETURN(code); } static void clearLastFileSet(SFSNextRowIter *state) { @@ -3016,7 +2752,7 @@ static void clearLastFileSet(SFSNextRowIter *state) { static int32_t nextRowIterOpen(CacheNextRowIter *pIter, tb_uid_t uid, STsdb *pTsdb, STSchema *pTSchema, tb_uid_t suid, SArray *pLDataIterArray, STsdbReadSnap *pReadSnap, int64_t lastTs, SCacheRowsReader *pr) { - int code = 0; + int32_t code = 0, lino = 0; STbData *pMem = NULL; if (pReadSnap->pMem) { @@ -3032,10 +2768,7 @@ static int32_t nextRowIterOpen(CacheNextRowIter *pIter, tb_uid_t uid, STsdb *pTs pIter->pMemDelData = NULL; - code = loadMemTombData(&pIter->pMemDelData, pMem, pIMem, pr->info.verRange.maxVer); - if (code != TSDB_CODE_SUCCESS) { - goto _err; - } + TAOS_CHECK_GOTO(loadMemTombData(&pIter->pMemDelData, pMem, pIMem, pr->info.verRange.maxVer), &lino, _err); pIter->idx = (SBlockIdx){.suid = suid, .uid = uid}; @@ -3071,12 +2804,13 @@ static int32_t nextRowIterOpen(CacheNextRowIter *pIter, tb_uid_t uid, STsdb *pTs } pIter->pr = pr; + _err: - return code; + TAOS_RETURN(code); } static int32_t nextRowIterClose(CacheNextRowIter *pIter) { - int code = 0; + int32_t code = 0; for (int i = 0; i < 3; ++i) { if (pIter->input[i].nextRowClearFn) { @@ -3093,19 +2827,20 @@ static int32_t nextRowIterClose(CacheNextRowIter *pIter) { } _err: - return code; + TAOS_RETURN(code); } // iterate next row non deleted backward ts, version (from high to low) static int32_t nextRowIterGet(CacheNextRowIter *pIter, TSDBROW **ppRow, bool *pIgnoreEarlierTs, bool isLast, int16_t *aCols, int nCols) { - int code = 0; + int32_t code = 0, lino = 0; + for (;;) { for (int i = 0; i < 3; ++i) { if (pIter->input[i].next && !pIter->input[i].stop) { - code = pIter->input[i].nextRowFn(pIter->input[i].iter, &pIter->input[i].pRow, &pIter->input[i].ignoreEarlierTs, - isLast, aCols, nCols); - if (code) goto _err; + TAOS_CHECK_GOTO(pIter->input[i].nextRowFn(pIter->input[i].iter, &pIter->input[i].pRow, + &pIter->input[i].ignoreEarlierTs, isLast, aCols, nCols), + &lino, _err); if (pIter->input[i].pRow == NULL) { pIter->input[i].stop = true; @@ -3118,7 +2853,8 @@ static int32_t nextRowIterGet(CacheNextRowIter *pIter, TSDBROW **ppRow, bool *pI *ppRow = NULL; *pIgnoreEarlierTs = (pIter->input[0].ignoreEarlierTs || pIter->input[1].ignoreEarlierTs || pIter->input[2].ignoreEarlierTs); - return code; + + TAOS_RETURN(code); } // select maxpoint(s) from mem, imem, fs and last @@ -3184,34 +2920,24 @@ static int32_t nextRowIterGet(CacheNextRowIter *pIter, TSDBROW **ppRow, bool *pI pIter->input[iMerge[0]].next = true; *ppRow = merge[0]; - return code; + + TAOS_RETURN(code); } } _err: - return code; -} -#ifdef BUILD_NO_CALL -static int32_t initLastColArray(STSchema *pTSchema, SArray **ppColArray) { - SArray *pColArray = taosArrayInit(pTSchema->numOfCols, sizeof(SLastCol)); - if (NULL == pColArray) { - return TSDB_CODE_OUT_OF_MEMORY; + if (code) { + tsdbError("tsdb/cache: %s failed at line %d since %s.", __func__, lino, tstrerror(code)); } - for (int32_t i = 0; i < pTSchema->numOfCols; ++i) { - SLastCol col = {.ts = 0, .colVal = COL_VAL_NULL(pTSchema->columns[i].colId, pTSchema->columns[i].type)}; - taosArrayPush(pColArray, &col); - } - *ppColArray = pColArray; - return TSDB_CODE_SUCCESS; + TAOS_RETURN(code); } -#endif static int32_t initLastColArrayPartial(STSchema *pTSchema, SArray **ppColArray, int16_t *slotIds, int nCols) { SArray *pColArray = taosArrayInit(nCols, sizeof(SLastCol)); if (NULL == pColArray) { - return TSDB_CODE_OUT_OF_MEMORY; + TAOS_RETURN(TSDB_CODE_OUT_OF_MEMORY); } for (int32_t i = 0; i < nCols; ++i) { @@ -3221,34 +2947,38 @@ static int32_t initLastColArrayPartial(STSchema *pTSchema, SArray **ppColArray, taosArrayPush(pColArray, &col); } *ppColArray = pColArray; - return TSDB_CODE_SUCCESS; + + TAOS_RETURN(TSDB_CODE_SUCCESS); } static int32_t cloneTSchema(STSchema *pSrc, STSchema **ppDst) { int32_t len = sizeof(STSchema) + sizeof(STColumn) * pSrc->numOfCols; *ppDst = taosMemoryMalloc(len); if (NULL == *ppDst) { - return TSDB_CODE_OUT_OF_MEMORY; + TAOS_RETURN(TSDB_CODE_OUT_OF_MEMORY); } memcpy(*ppDst, pSrc, len); - return TSDB_CODE_SUCCESS; + + TAOS_RETURN(TSDB_CODE_SUCCESS); } static int32_t updateTSchema(int32_t sversion, SCacheRowsReader *pReader, uint64_t uid) { if (NULL == pReader->pCurrSchema && sversion == pReader->pSchema->version) { - return cloneTSchema(pReader->pSchema, &pReader->pCurrSchema); + TAOS_RETURN(cloneTSchema(pReader->pSchema, &pReader->pCurrSchema)); } if (NULL != pReader->pCurrSchema && sversion == pReader->pCurrSchema->version) { - return TSDB_CODE_SUCCESS; + TAOS_RETURN(TSDB_CODE_SUCCESS); } taosMemoryFreeClear(pReader->pCurrSchema); - return metaGetTbTSchemaEx(pReader->pTsdb->pVnode->pMeta, pReader->info.suid, uid, sversion, &pReader->pCurrSchema); + TAOS_RETURN( + metaGetTbTSchemaEx(pReader->pTsdb->pVnode->pMeta, pReader->info.suid, uid, sversion, &pReader->pCurrSchema)); } static int32_t mergeLastCid(tb_uid_t uid, STsdb *pTsdb, SArray **ppLastArray, SCacheRowsReader *pr, int16_t *aCols, int nCols, int16_t *slotIds) { + int32_t code = 0, lino = 0; STSchema *pTSchema = pr->pSchema; // metaGetTbTSchema(pTsdb->pVnode->pMeta, uid, -1, 1); int16_t nLastCol = nCols; int16_t noneCol = 0; @@ -3258,15 +2988,13 @@ static int32_t mergeLastCid(tb_uid_t uid, STsdb *pTsdb, SArray **ppLastArray, SC SArray *pColArray = NULL; SColVal *pColVal = &(SColVal){0}; - int32_t code = initLastColArrayPartial(pTSchema, &pColArray, slotIds, nCols); - if (TSDB_CODE_SUCCESS != code) { - return code; - } + TAOS_CHECK_RETURN(initLastColArrayPartial(pTSchema, &pColArray, slotIds, nCols)); + SArray *aColArray = taosArrayInit(nCols, sizeof(int16_t)); if (NULL == aColArray) { taosArrayDestroy(pColArray); - return TSDB_CODE_OUT_OF_MEMORY; + TAOS_RETURN(TSDB_CODE_OUT_OF_MEMORY); } for (int i = 0; i < nCols; ++i) { @@ -3291,10 +3019,8 @@ static int32_t mergeLastCid(tb_uid_t uid, STsdb *pTsdb, SArray **ppLastArray, SC int32_t sversion = TSDBROW_SVERSION(pRow); if (sversion != -1) { - code = updateTSchema(sversion, pr, uid); - if (TSDB_CODE_SUCCESS != code) { - goto _err; - } + TAOS_CHECK_GOTO(updateTSchema(sversion, pr, uid), &lino, _err); + pTSchema = pr->pCurrSchema; } // int16_t nCol = pTSchema->numOfCols; @@ -3302,7 +3028,7 @@ static int32_t mergeLastCid(tb_uid_t uid, STsdb *pTsdb, SArray **ppLastArray, SC STsdbRowKey rowKey = {0}; tsdbRowGetKey(pRow, &rowKey); - if (lastRowKey.key.ts == TSKEY_MAX) { // first time + if (lastRowKey.key.ts == TSKEY_MAX) { // first time lastRowKey = rowKey; for (int16_t iCol = noneCol; iCol < nCols; ++iCol) { @@ -3334,9 +3060,7 @@ static int32_t mergeLastCid(tb_uid_t uid, STsdb *pTsdb, SArray **ppLastArray, SC if (pColVal->value.nData > 0) { pCol->colVal.value.pData = taosMemoryMalloc(pCol->colVal.value.nData); if (pCol->colVal.value.pData == NULL) { - terrno = TSDB_CODE_OUT_OF_MEMORY; - code = TSDB_CODE_OUT_OF_MEMORY; - goto _err; + TAOS_CHECK_GOTO(TSDB_CODE_OUT_OF_MEMORY, &lino, _err); } memcpy(pCol->colVal.value.pData, pColVal->value.pData, pColVal->value.nData); } else { @@ -3388,9 +3112,7 @@ static int32_t mergeLastCid(tb_uid_t uid, STsdb *pTsdb, SArray **ppLastArray, SC if (pColVal->value.nData > 0) { lastCol.colVal.value.pData = taosMemoryMalloc(lastCol.colVal.value.nData); if (lastCol.colVal.value.pData == NULL) { - terrno = TSDB_CODE_OUT_OF_MEMORY; - code = TSDB_CODE_OUT_OF_MEMORY; - goto _err; + TAOS_CHECK_GOTO(TSDB_CODE_OUT_OF_MEMORY, &lino, _err); } memcpy(lastCol.colVal.value.pData, pColVal->value.pData, pColVal->value.nData); } else { @@ -3423,7 +3145,7 @@ static int32_t mergeLastCid(tb_uid_t uid, STsdb *pTsdb, SArray **ppLastArray, SC nextRowIterClose(&iter); taosArrayDestroy(aColArray); - return code; + TAOS_RETURN(code); _err: nextRowIterClose(&iter); @@ -3431,11 +3153,18 @@ _err: *ppLastArray = NULL; taosArrayDestroy(pColArray); taosArrayDestroy(aColArray); - return code; + + if (code) { + tsdbError("tsdb/cache: vgId:%d, %s failed at line %d since %s.", TD_VID(pTsdb->pVnode), __func__, lino, + tstrerror(code)); + } + + TAOS_RETURN(code); } static int32_t mergeLastRowCid(tb_uid_t uid, STsdb *pTsdb, SArray **ppLastArray, SCacheRowsReader *pr, int16_t *aCols, int nCols, int16_t *slotIds) { + int32_t code = 0, lino = 0; STSchema *pTSchema = pr->pSchema; // metaGetTbTSchema(pTsdb->pVnode->pMeta, uid, -1, 1); int16_t nLastCol = nCols; int16_t noneCol = 0; @@ -3445,15 +3174,13 @@ static int32_t mergeLastRowCid(tb_uid_t uid, STsdb *pTsdb, SArray **ppLastArray, SArray *pColArray = NULL; SColVal *pColVal = &(SColVal){0}; - int32_t code = initLastColArrayPartial(pTSchema, &pColArray, slotIds, nCols); - if (TSDB_CODE_SUCCESS != code) { - return code; - } + TAOS_CHECK_RETURN(initLastColArrayPartial(pTSchema, &pColArray, slotIds, nCols)); + SArray *aColArray = taosArrayInit(nCols, sizeof(int16_t)); if (NULL == aColArray) { taosArrayDestroy(pColArray); - return TSDB_CODE_OUT_OF_MEMORY; + TAOS_RETURN(TSDB_CODE_OUT_OF_MEMORY); } for (int i = 0; i < nCols; ++i) { @@ -3476,10 +3203,8 @@ static int32_t mergeLastRowCid(tb_uid_t uid, STsdb *pTsdb, SArray **ppLastArray, int32_t sversion = TSDBROW_SVERSION(pRow); if (sversion != -1) { - code = updateTSchema(sversion, pr, uid); - if (TSDB_CODE_SUCCESS != code) { - goto _err; - } + TAOS_CHECK_GOTO(updateTSchema(sversion, pr, uid), &lino, _err); + pTSchema = pr->pCurrSchema; } // int16_t nCol = pTSchema->numOfCols; @@ -3512,9 +3237,7 @@ static int32_t mergeLastRowCid(tb_uid_t uid, STsdb *pTsdb, SArray **ppLastArray, if (pColVal->value.nData > 0) { pCol->colVal.value.pData = taosMemoryMalloc(pCol->colVal.value.nData); if (pCol->colVal.value.pData == NULL) { - terrno = TSDB_CODE_OUT_OF_MEMORY; - code = TSDB_CODE_OUT_OF_MEMORY; - goto _err; + TAOS_CHECK_GOTO(TSDB_CODE_OUT_OF_MEMORY, &lino, _err); } if (pColVal->value.nData > 0) { memcpy(pCol->colVal.value.pData, pColVal->value.pData, pColVal->value.nData); @@ -3546,7 +3269,7 @@ static int32_t mergeLastRowCid(tb_uid_t uid, STsdb *pTsdb, SArray **ppLastArray, nextRowIterClose(&iter); taosArrayDestroy(aColArray); - return code; + TAOS_RETURN(code); _err: nextRowIterClose(&iter); @@ -3554,7 +3277,13 @@ _err: *ppLastArray = NULL; taosArrayDestroy(pColArray); taosArrayDestroy(aColArray); - return code; + + if (code) { + tsdbError("tsdb/cache: vgId:%d, %s failed at line %d since %s.", TD_VID(pTsdb->pVnode), __func__, lino, + tstrerror(code)); + } + + TAOS_RETURN(code); } int32_t tsdbCacheRelease(SLRUCache *pCache, LRUHandle *h) { @@ -3591,93 +3320,6 @@ int32_t tsdbCacheGetElems(SVnode *pVnode) { return elems; } -#if 0 -static void getBICacheKey(int32_t fid, int64_t commitID, char *key, int *len) { - struct { - int32_t fid; - int64_t commitID; - } biKey = {0}; - - biKey.fid = fid; - biKey.commitID = commitID; - - *len = sizeof(biKey); - memcpy(key, &biKey, *len); -} - -static int32_t tsdbCacheLoadBlockIdx(SDataFReader *pFileReader, SArray **aBlockIdx) { - SArray *pArray = taosArrayInit(8, sizeof(SBlockIdx)); - int32_t code = tsdbReadBlockIdx(pFileReader, pArray); - - if (code != TSDB_CODE_SUCCESS) { - taosArrayDestroy(pArray); - code = TSDB_CODE_OUT_OF_MEMORY; - return code; - } - - *aBlockIdx = pArray; - - return code; -} - -static void deleteBICache(const void *key, size_t keyLen, void *value, void *ud) { - (void)ud; - SArray *pArray = (SArray *)value; - - taosArrayDestroy(pArray); -} - -int32_t tsdbCacheGetBlockIdx(SLRUCache *pCache, SDataFReader *pFileReader, LRUHandle **handle) { - int32_t code = 0; - char key[128] = {0}; - int keyLen = 0; - - getBICacheKey(pFileReader->pSet->fid, pFileReader->pSet->pHeadF->commitID, key, &keyLen); - LRUHandle *h = taosLRUCacheLookup(pCache, key, keyLen); - if (!h) { - STsdb *pTsdb = pFileReader->pTsdb; - taosThreadMutexLock(&pTsdb->biMutex); - - h = taosLRUCacheLookup(pCache, key, keyLen); - if (!h) { - SArray *pArray = NULL; - code = tsdbCacheLoadBlockIdx(pFileReader, &pArray); - // if table's empty or error, return code of -1 - if (code != TSDB_CODE_SUCCESS || pArray == NULL) { - taosThreadMutexUnlock(&pTsdb->biMutex); - - *handle = NULL; - return 0; - } - - size_t charge = pArray->capacity * pArray->elemSize + sizeof(*pArray); - _taos_lru_deleter_t deleter = deleteBICache; - LRUStatus status = - taosLRUCacheInsert(pCache, key, keyLen, pArray, charge, deleter, &h, TAOS_LRU_PRIORITY_LOW, NULL); - if (status != TAOS_LRU_STATUS_OK) { - code = -1; - } - } - - taosThreadMutexUnlock(&pTsdb->biMutex); - } - - tsdbTrace("bi cache:%p, ref", pCache); - *handle = h; - - return code; -} - -int32_t tsdbBICacheRelease(SLRUCache *pCache, LRUHandle *h) { - int32_t code = 0; - - taosLRUCacheRelease(pCache, h, false); - tsdbTrace("bi cache:%p, release", pCache); - - return code; -} -#endif - // block cache static void getBCacheKey(int32_t fid, int64_t commitID, int64_t blkno, char *key, int *len) { struct { @@ -3696,22 +3338,10 @@ static void getBCacheKey(int32_t fid, int64_t commitID, int64_t blkno, char *key static int32_t tsdbCacheLoadBlockS3(STsdbFD *pFD, uint8_t **ppBlock) { int32_t code = 0; - /* - uint8_t *pBlock = taosMemoryCalloc(1, tsS3BlockSize * pFD->szPage); - if (pBlock == NULL) { - code = TSDB_CODE_OUT_OF_MEMORY; - goto _exit; - } - */ - int64_t block_offset = (pFD->blkno - 1) * tsS3BlockSize * pFD->szPage; - code = s3GetObjectBlock(pFD->objName, block_offset, tsS3BlockSize * pFD->szPage, 0, ppBlock); - if (code != TSDB_CODE_SUCCESS) { - // taosMemoryFree(pBlock); - // code = TSDB_CODE_OUT_OF_MEMORY; - return code; - } - //*ppBlock = pBlock; + int64_t block_offset = (pFD->blkno - 1) * tsS3BlockSize * pFD->szPage; + + TAOS_CHECK_RETURN(s3GetObjectBlock(pFD->objName, block_offset, tsS3BlockSize * pFD->szPage, 0, ppBlock)); tsdbTrace("block:%p load from s3", *ppBlock); @@ -3749,7 +3379,8 @@ int32_t tsdbCacheGetBlockS3(SLRUCache *pCache, STsdbFD *pFD, LRUHandle **handle) if (code == TSDB_CODE_SUCCESS && !pBlock) { code = TSDB_CODE_OUT_OF_MEMORY; } - return code; + + TAOS_RETURN(code); } size_t charge = tsS3BlockSize * pFD->szPage; @@ -3757,7 +3388,7 @@ int32_t tsdbCacheGetBlockS3(SLRUCache *pCache, STsdbFD *pFD, LRUHandle **handle) LRUStatus status = taosLRUCacheInsert(pCache, key, keyLen, pBlock, charge, deleter, &h, TAOS_LRU_PRIORITY_LOW, NULL); if (status != TAOS_LRU_STATUS_OK) { - code = -1; + // code = -1; } } @@ -3766,7 +3397,7 @@ int32_t tsdbCacheGetBlockS3(SLRUCache *pCache, STsdbFD *pFD, LRUHandle **handle) *handle = h; - return code; + TAOS_RETURN(code); } int32_t tsdbCacheGetPageS3(SLRUCache *pCache, STsdbFD *pFD, int64_t pgno, LRUHandle **handle) { @@ -3793,6 +3424,9 @@ int32_t tsdbCacheSetPageS3(SLRUCache *pCache, STsdbFD *pFD, int64_t pgno, uint8_ size_t charge = pFD->szPage; _taos_lru_deleter_t deleter = deleteBCache; uint8_t *pPg = taosMemoryMalloc(charge); + if (!pPg) { + TAOS_RETURN(TSDB_CODE_OUT_OF_MEMORY); + } memcpy(pPg, pPage, charge); LRUStatus status = @@ -3806,5 +3440,5 @@ int32_t tsdbCacheSetPageS3(SLRUCache *pCache, STsdbFD *pFD, int64_t pgno, uint8_ tsdbCacheRelease(pFD->pTsdb->pgCache, handle); - return code; + TAOS_RETURN(code); } diff --git a/source/dnode/vnode/src/vnd/vnodeOpen.c b/source/dnode/vnode/src/vnd/vnodeOpen.c index 8d04d100f8..fb835fd0c2 100644 --- a/source/dnode/vnode/src/vnd/vnodeOpen.c +++ b/source/dnode/vnode/src/vnd/vnodeOpen.c @@ -281,12 +281,13 @@ int32_t vnodeRestoreVgroupId(const char *srcPath, const char *dstPath, int32_t s int32_t diskPrimary, STfs *pTfs) { SVnodeInfo info = {0}; char dir[TSDB_FILENAME_LEN] = {0}; + int32_t code = 0; vnodeGetPrimaryDir(dstPath, diskPrimary, pTfs, dir, TSDB_FILENAME_LEN); if (vnodeLoadInfo(dir, &info) == 0) { if (info.config.vgId != dstVgId) { vError("vgId:%d, unexpected vnode config.vgId:%d", dstVgId, info.config.vgId); - return -1; + return TSDB_CODE_FAILED; } return dstVgId; } @@ -302,13 +303,13 @@ int32_t vnodeRestoreVgroupId(const char *srcPath, const char *dstPath, int32_t s return srcVgId; } else if (info.config.vgId != dstVgId) { vError("vgId:%d, unexpected vnode config.vgId:%d", dstVgId, info.config.vgId); - return -1; + return TSDB_CODE_FAILED; } vInfo("vgId:%d, rename %s to %s", dstVgId, srcPath, dstPath); if (vnodeRenameVgroupId(srcPath, dstPath, srcVgId, dstVgId, diskPrimary, pTfs) < 0) { vError("vgId:%d, failed to rename vnode from %s to %s since %s", dstVgId, srcPath, dstPath, tstrerror(terrno)); - return -1; + return TSDB_CODE_FAILED; } return dstVgId; @@ -333,8 +334,7 @@ static int32_t vnodeCheckDisk(int32_t diskPrimary, STfs *pTfs) { } if (diskPrimary < 0 || diskPrimary >= ndisk) { vError("disk:%d is unavailable from the %d disks mounted at level 0", diskPrimary, ndisk); - terrno = TSDB_CODE_FS_INVLD_CFG; - return -1; + return terrno = TSDB_CODE_FS_INVLD_CFG; } return 0; } diff --git a/source/dnode/vnode/src/vnd/vnodeSvr.c b/source/dnode/vnode/src/vnd/vnodeSvr.c index fb09a46e75..45b2abeb24 100644 --- a/source/dnode/vnode/src/vnd/vnodeSvr.c +++ b/source/dnode/vnode/src/vnd/vnodeSvr.c @@ -513,6 +513,7 @@ int32_t vnodePreProcessWriteMsg(SVnode *pVnode, SRpcMsg *pMsg) { } int32_t vnodeProcessWriteMsg(SVnode *pVnode, SRpcMsg *pMsg, int64_t ver, SRpcMsg *pRsp) { + int32_t code = 0; void *ptr = NULL; void *pReq; int32_t len; @@ -520,8 +521,7 @@ int32_t vnodeProcessWriteMsg(SVnode *pVnode, SRpcMsg *pMsg, int64_t ver, SRpcMsg if (ver <= pVnode->state.applied) { vError("vgId:%d, duplicate write request. ver: %" PRId64 ", applied: %" PRId64 "", TD_VID(pVnode), ver, pVnode->state.applied); - terrno = TSDB_CODE_VND_DUP_REQUEST; - return -1; + return terrno = TSDB_CODE_VND_DUP_REQUEST; } vDebug("vgId:%d, start to process write request %s, index:%" PRId64 ", applied:%" PRId64 ", state.applyTerm:%" PRId64 @@ -693,7 +693,7 @@ int32_t vnodeProcessWriteMsg(SVnode *pVnode, SRpcMsg *pMsg, int64_t ver, SRpcMsg break; default: vError("vgId:%d, unprocessed msg, %d", TD_VID(pVnode), pMsg->msgType); - return -1; + return TSDB_CODE_INVALID_MSG; } vTrace("vgId:%d, process %s request, code:0x%x index:%" PRId64, TD_VID(pVnode), TMSG_INFO(pMsg->msgType), pRsp->code, @@ -701,21 +701,24 @@ int32_t vnodeProcessWriteMsg(SVnode *pVnode, SRpcMsg *pMsg, int64_t ver, SRpcMsg walApplyVer(pVnode->pWal, ver); - if (tqPushMsg(pVnode->pTq, pMsg->msgType) < 0) { + code = tqPushMsg(pVnode->pTq, pMsg->msgType); + if (code) { vError("vgId:%d, failed to push msg to TQ since %s", TD_VID(pVnode), tstrerror(terrno)); - return -1; + return code; } // commit if need if (needCommit) { vInfo("vgId:%d, commit at version %" PRId64, TD_VID(pVnode), ver); - if (vnodeAsyncCommit(pVnode) < 0) { + code = vnodeAsyncCommit(pVnode); + if (code) { vError("vgId:%d, failed to vnode async commit since %s.", TD_VID(pVnode), tstrerror(terrno)); goto _err; } // start a new one - if (vnodeBegin(pVnode) < 0) { + code = vnodeBegin(pVnode); + if (code) { vError("vgId:%d, failed to begin vnode since %s.", TD_VID(pVnode), tstrerror(terrno)); goto _err; } @@ -727,7 +730,7 @@ _exit: _err: vError("vgId:%d, process %s request failed since %s, ver:%" PRId64, TD_VID(pVnode), TMSG_INFO(pMsg->msgType), tstrerror(terrno), ver); - return -1; + return code; } int32_t vnodePreprocessQueryMsg(SVnode *pVnode, SRpcMsg *pMsg) { @@ -987,11 +990,18 @@ static int32_t vnodeProcessFetchTtlExpiredTbs(SVnode *pVnode, int64_t ver, void if (terrno < 0) goto _end; strncpy(buf, mr.me.name, TSDB_TABLE_NAME_LEN); void *p = taosArrayPush(pNames, buf); + if (p == NULL) { + goto _end; + } + expiredTb.name = p; if (mr.me.type == TSDB_CHILD_TABLE) { expiredTb.suid = mr.me.ctbEntry.suid; } - taosArrayPush(rsp.pExpiredTbs, &expiredTb); + + if (taosArrayPush(rsp.pExpiredTbs, &expiredTb) == NULL) { + goto _end; + } } int32_t ret = 0; @@ -1017,6 +1027,7 @@ _end: } static int32_t vnodeProcessCreateStbReq(SVnode *pVnode, int64_t ver, void *pReq, int32_t len, SRpcMsg *pRsp) { + int32_t code = 0; SVCreateStbReq req = {0}; SDecoder coder; @@ -1028,18 +1039,20 @@ static int32_t vnodeProcessCreateStbReq(SVnode *pVnode, int64_t ver, void *pReq, // decode and process req tDecoderInit(&coder, pReq, len); - if (tDecodeSVCreateStbReq(&coder, &req) < 0) { - pRsp->code = terrno; + code = tDecodeSVCreateStbReq(&coder, &req); + if (code) { + pRsp->code = code; goto _err; } - if (metaCreateSTable(pVnode->pMeta, ver, &req) < 0) { - pRsp->code = terrno; + code = metaCreateSTable(pVnode->pMeta, ver, &req); + if (code) { + pRsp->code = code; goto _err; } - if (tdProcessRSmaCreate(pVnode->pSma, &req) < 0) { - pRsp->code = terrno; + if ((code = tdProcessRSmaCreate(pVnode->pSma, &req)) < 0) { + pRsp->code = code; goto _err; } @@ -1048,7 +1061,7 @@ static int32_t vnodeProcessCreateStbReq(SVnode *pVnode, int64_t ver, void *pReq, _err: tDecoderClear(&coder); - return -1; + return code; } static int32_t vnodeProcessCreateTbReq(SVnode *pVnode, int64_t ver, void *pReq, int32_t len, SRpcMsg *pRsp, @@ -1100,7 +1113,11 @@ static int32_t vnodeProcessCreateTbReq(SVnode *pVnode, int64_t ver, void *pReq, goto _exit; } strcpy(str, pCreateReq->name); - taosArrayPush(tbNames, &str); + if (taosArrayPush(tbNames, &str) == NULL) { + terrno = TSDB_CODE_OUT_OF_MEMORY; + rcode = -1; + goto _exit; + } } // validate hash @@ -1185,6 +1202,7 @@ _exit: } static int32_t vnodeProcessAlterStbReq(SVnode *pVnode, int64_t ver, void *pReq, int32_t len, SRpcMsg *pRsp) { + int32_t code = 0; SVCreateStbReq req = {0}; SDecoder dc = {0}; @@ -1196,16 +1214,17 @@ static int32_t vnodeProcessAlterStbReq(SVnode *pVnode, int64_t ver, void *pReq, tDecoderInit(&dc, pReq, len); // decode req - if (tDecodeSVCreateStbReq(&dc, &req) < 0) { - terrno = TSDB_CODE_INVALID_MSG; + code = tDecodeSVCreateStbReq(&dc, &req); + if (code) { tDecoderClear(&dc); - return -1; + return code; } - if (metaAlterSTable(pVnode->pMeta, ver, &req) < 0) { - pRsp->code = terrno; + code = metaAlterSTable(pVnode->pMeta, ver, &req); + if (code) { + pRsp->code = code; tDecoderClear(&dc); - return -1; + return code; } tDecoderClear(&dc); @@ -2224,6 +2243,7 @@ _err: static int32_t vnodeProcessCreateIndexReq(SVnode *pVnode, int64_t ver, void *pReq, int32_t len, SRpcMsg *pRsp) { SVCreateStbReq req = {0}; SDecoder dc = {0}; + int32_t code = 0; pRsp->msgType = TDMT_VND_CREATE_INDEX_RSP; pRsp->code = TSDB_CODE_SUCCESS; @@ -2233,35 +2253,38 @@ static int32_t vnodeProcessCreateIndexReq(SVnode *pVnode, int64_t ver, void *pRe tDecoderInit(&dc, pReq, len); // decode req if (tDecodeSVCreateStbReq(&dc, &req) < 0) { - terrno = TSDB_CODE_INVALID_MSG; tDecoderClear(&dc); - return -1; + return terrno = TSDB_CODE_INVALID_MSG; } - if (metaAddIndexToSTable(pVnode->pMeta, ver, &req) < 0) { - pRsp->code = terrno; + + code = metaAddIndexToSTable(pVnode->pMeta, ver, &req); + if (code) { + pRsp->code = code; goto _err; } tDecoderClear(&dc); return 0; + _err: tDecoderClear(&dc); - return -1; + return code; } static int32_t vnodeProcessDropIndexReq(SVnode *pVnode, int64_t ver, void *pReq, int32_t len, SRpcMsg *pRsp) { SDropIndexReq req = {0}; + int32_t code = 0; pRsp->msgType = TDMT_VND_DROP_INDEX_RSP; pRsp->code = TSDB_CODE_SUCCESS; pRsp->pCont = NULL; pRsp->contLen = 0; - if (tDeserializeSDropIdxReq(pReq, len, &req)) { - terrno = TSDB_CODE_INVALID_MSG; - return -1; + if ((code = tDeserializeSDropIdxReq(pReq, len, &req))) { + return code; } - if (metaDropIndexFromSTable(pVnode->pMeta, ver, &req) < 0) { - pRsp->code = terrno; - return -1; + code = metaDropIndexFromSTable(pVnode->pMeta, ver, &req); + if (code) { + pRsp->code = code; + return code; } return TSDB_CODE_SUCCESS; } @@ -2290,20 +2313,17 @@ static int32_t vnodeProcessConfigChangeReq(SVnode *pVnode, int64_t ver, void *pR static int32_t vnodePreCheckAssignedLogSyncd(SVnode *pVnode, char *member0Token, char *member1Token) { SSyncState syncState = syncGetState(pVnode->sync); if (syncState.state != TAOS_SYNC_STATE_LEADER) { - terrno = TSDB_CODE_SYN_NOT_LEADER; - return -1; + return terrno = TSDB_CODE_SYN_NOT_LEADER; } char token[TSDB_ARB_TOKEN_SIZE] = {0}; if (vnodeGetArbToken(pVnode, token) != 0) { - terrno = TSDB_CODE_NOT_FOUND; - return -1; + return terrno = TSDB_CODE_NOT_FOUND; } if (strncmp(token, member0Token, TSDB_ARB_TOKEN_SIZE) != 0 && strncmp(token, member1Token, TSDB_ARB_TOKEN_SIZE) != 0) { - terrno = TSDB_CODE_MND_ARB_TOKEN_MISMATCH; - return -1; + return terrno = TSDB_CODE_MND_ARB_TOKEN_MISMATCH; } terrno = TSDB_CODE_SUCCESS; @@ -2324,9 +2344,9 @@ static int32_t vnodeProcessArbCheckSyncReq(SVnode *pVnode, void *pReq, int32_t l SVArbCheckSyncReq syncReq = {0}; - if (tDeserializeSVArbCheckSyncReq(pReq, len, &syncReq) != 0) { - terrno = TSDB_CODE_INVALID_MSG; - return -1; + code = tDeserializeSVArbCheckSyncReq(pReq, len, &syncReq); + if (code) { + return terrno = code; } pRsp->msgType = TDMT_VND_ARB_CHECK_SYNC_RSP; diff --git a/source/libs/executor/inc/tfill.h b/source/libs/executor/inc/tfill.h index cd003ebd15..b659c12315 100644 --- a/source/libs/executor/inc/tfill.h +++ b/source/libs/executor/inc/tfill.h @@ -128,9 +128,9 @@ SFillColInfo* createFillColInfo(SExprInfo* pExpr, int32_t numOfFillExpr, SExprIn int32_t numOfNotFillCols, const struct SNodeListNode* val); bool taosFillHasMoreResults(struct SFillInfo* pFillInfo); -SFillInfo* taosCreateFillInfo(TSKEY skey, int32_t numOfFillCols, int32_t numOfNotFillCols, int32_t capacity, - SInterval* pInterval, int32_t fillType, struct SFillColInfo* pCol, int32_t slotId, - int32_t order, const char* id, SExecTaskInfo* pTaskInfo); +void taosCreateFillInfo(TSKEY skey, int32_t numOfFillCols, int32_t numOfNotFillCols, int32_t capacity, + SInterval* pInterval, int32_t fillType, struct SFillColInfo* pCol, int32_t slotId, + int32_t order, const char* id, SExecTaskInfo* pTaskInfo, SFillInfo** ppFillInfo); void* taosDestroyFillInfo(struct SFillInfo* pFillInfo); int32_t taosFillResultDataBlock(struct SFillInfo* pFillInfo, SSDataBlock* p, int32_t capacity); diff --git a/source/libs/executor/src/aggregateoperator.c b/source/libs/executor/src/aggregateoperator.c index 1e86b90d3b..905e82e443 100644 --- a/source/libs/executor/src/aggregateoperator.c +++ b/source/libs/executor/src/aggregateoperator.c @@ -252,14 +252,15 @@ _end: return pBlock != NULL; } -SSDataBlock* getAggregateResult(SOperatorInfo* pOperator) { +int32_t getAggregateResultNext(SOperatorInfo* pOperator, SSDataBlock** ppRes) { int32_t code = TSDB_CODE_SUCCESS; int32_t lino = 0; SAggOperatorInfo* pAggInfo = pOperator->info; SOptrBasicInfo* pInfo = &pAggInfo->binfo; if (pOperator->status == OP_EXEC_DONE) { - return NULL; + (*ppRes) = NULL; + return code; } SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo; @@ -291,10 +292,18 @@ SSDataBlock* getAggregateResult(SOperatorInfo* pOperator) { _end: if (code != TSDB_CODE_SUCCESS) { qError("%s failed at line %d since %s", __func__, lino, tstrerror(code)); + pTaskInfo->code = code; T_LONG_JMP(pTaskInfo->env, code); } - return (rows == 0) ? NULL : pInfo->pRes; + (*ppRes) = (rows == 0) ? NULL : pInfo->pRes; + return code; +} + +static SSDataBlock* getAggregateResult(SOperatorInfo* pOperator) { + SSDataBlock* pRes = NULL; + int32_t code = getAggregateResultNext(pOperator, &pRes); + return pRes; } int32_t doAggregateImpl(SOperatorInfo* pOperator, SqlFunctionCtx* pCtx) { diff --git a/source/libs/executor/src/cachescanoperator.c b/source/libs/executor/src/cachescanoperator.c index 23426cc1b7..d6ba2f7c26 100644 --- a/source/libs/executor/src/cachescanoperator.c +++ b/source/libs/executor/src/cachescanoperator.c @@ -144,7 +144,7 @@ SOperatorInfo* createCacherowsScanOperator(SLastRowScanPhysiNode* pScanNode, SRe for (int i = 0; i < TARRAY_SIZE(pInfo->matchInfo.pList); ++i) { SColMatchItem* pColInfo = taosArrayGet(pInfo->matchInfo.pList, i); - void* tmp = taosArrayPush(pCidList, &pColInfo->colId); + void* tmp = taosArrayPush(pCidList, &pColInfo->colId); QUERY_CHECK_NULL(tmp, code, lino, _error, TSDB_CODE_OUT_OF_MEMORY); if (pInfo->pFuncTypeList != NULL && taosArrayGetSize(pInfo->pFuncTypeList) > i) { pColInfo->funcType = *(int32_t*)taosArrayGet(pInfo->pFuncTypeList, i); @@ -219,9 +219,12 @@ _error: return NULL; } -SSDataBlock* doScanCache(SOperatorInfo* pOperator) { +int32_t doScanCacheNext(SOperatorInfo* pOperator, SSDataBlock** ppRes) { + int32_t code = TSDB_CODE_SUCCESS; + int32_t lino = 0; if (pOperator->status == OP_EXEC_DONE) { - return NULL; + (*ppRes) = NULL; + return code; } SCacheRowsScanInfo* pInfo = pOperator->info; @@ -234,7 +237,8 @@ SSDataBlock* doScanCache(SOperatorInfo* pOperator) { int32_t size = tableListGetSize(pTableList); if (size == 0) { setOperatorCompleted(pOperator); - return NULL; + (*ppRes) = NULL; + return code; } blockDataCleanup(pInfo->pRes); @@ -249,11 +253,9 @@ SSDataBlock* doScanCache(SOperatorInfo* pOperator) { blockDataCleanup(pBufRes); taosArrayClear(pInfo->pUidList); - int32_t code = + code = pReaderFn->retrieveRows(pInfo->pLastrowReader, pBufRes, pInfo->pSlotIds, pInfo->pDstSlotIds, pInfo->pUidList); - if (code != TSDB_CODE_SUCCESS) { - T_LONG_JMP(pTaskInfo->env, code); - } + QUERY_CHECK_CODE(code, lino, _end); // check for tag values int32_t resultRows = pBufRes->info.rows; @@ -277,12 +279,9 @@ SSDataBlock* doScanCache(SOperatorInfo* pOperator) { colDataSetNULL(pDst, 0); } else { if (pSrc->pData) { - char* p = colDataGetData(pSrc, pInfo->indexOfBufferedRes); - int32_t code = colDataSetVal(pDst, 0, p, false); - if (code != TSDB_CODE_SUCCESS) { - qError("%s failed at line %d since %s", __func__, __LINE__, tstrerror(code)); - T_LONG_JMP(pTaskInfo->env, code); - } + char* p = colDataGetData(pSrc, pInfo->indexOfBufferedRes); + code = colDataSetVal(pDst, 0, p, false); + QUERY_CHECK_CODE(code, lino, _end); } } } @@ -292,19 +291,22 @@ SSDataBlock* doScanCache(SOperatorInfo* pOperator) { pRes->info.scanFlag = MAIN_SCAN; SExprSupp* pSup = &pInfo->pseudoExprSup; - int32_t code = addTagPseudoColumnData(&pInfo->readHandle, pSup->pExprInfo, pSup->numOfExprs, pRes, - pRes->info.rows, pTaskInfo, NULL); + code = addTagPseudoColumnData(&pInfo->readHandle, pSup->pExprInfo, pSup->numOfExprs, pRes, pRes->info.rows, + pTaskInfo, NULL); if (code != TSDB_CODE_SUCCESS) { pTaskInfo->code = code; - return NULL; + (*ppRes) = NULL; + return code; } pRes->info.id.groupId = tableListGetTableGroupId(pTableList, pRes->info.id.uid); pInfo->indexOfBufferedRes += 1; - return pRes; + (*ppRes) = pRes; + return code; } else { setOperatorCompleted(pOperator); - return NULL; + (*ppRes) = NULL; + return code; } } else { size_t totalGroups = tableListGetOutputGroups(pTableList); @@ -317,37 +319,30 @@ SSDataBlock* doScanCache(SOperatorInfo* pOperator) { STableKeyInfo* pList = NULL; int32_t num = 0; - int32_t code = tableListGetGroupList(pTableList, pInfo->currentGroupIndex, &pList, &num); - if (code != TSDB_CODE_SUCCESS) { - T_LONG_JMP(pTaskInfo->env, code); - } + code = tableListGetGroupList(pTableList, pInfo->currentGroupIndex, &pList, &num); + QUERY_CHECK_CODE(code, lino, _end); if (NULL == pInfo->pLastrowReader) { - code = pReaderFn->openReader(pInfo->readHandle.vnode, pInfo->retrieveType, pList, num, - taosArrayGetSize(pInfo->matchInfo.pList), pInfo->pCidList, pInfo->pSlotIds, suid, - &pInfo->pLastrowReader, pTaskInfo->id.str, pInfo->pFuncTypeList, &pInfo->pkCol, - pInfo->numOfPks); + int32_t tmpRes = pReaderFn->openReader(pInfo->readHandle.vnode, pInfo->retrieveType, pList, num, + taosArrayGetSize(pInfo->matchInfo.pList), pInfo->pCidList, + pInfo->pSlotIds, suid, &pInfo->pLastrowReader, pTaskInfo->id.str, + pInfo->pFuncTypeList, &pInfo->pkCol, pInfo->numOfPks); - if (code != TSDB_CODE_SUCCESS) { + if (tmpRes != TSDB_CODE_SUCCESS) { pInfo->currentGroupIndex += 1; taosArrayClear(pInfo->pUidList); continue; } } else { code = pReaderFn->reuseReader(pInfo->pLastrowReader, pList, num); - if (code != TSDB_CODE_SUCCESS) { - qError("%s failed at line %d since %s", __func__, __LINE__, tstrerror(code)); - T_LONG_JMP(pTaskInfo->env, code); - } + QUERY_CHECK_CODE(code, lino, _end); } taosArrayClear(pInfo->pUidList); code = pReaderFn->retrieveRows(pInfo->pLastrowReader, pInfo->pRes, pInfo->pSlotIds, pInfo->pDstSlotIds, pInfo->pUidList); - if (code != TSDB_CODE_SUCCESS) { - T_LONG_JMP(pTaskInfo->env, code); - } + QUERY_CHECK_CODE(code, lino, _end); pInfo->currentGroupIndex += 1; @@ -365,13 +360,15 @@ SSDataBlock* doScanCache(SOperatorInfo* pOperator) { pInfo->pRes->info.rows, pTaskInfo, NULL); if (code != TSDB_CODE_SUCCESS) { pTaskInfo->code = code; - return NULL; + (*ppRes) = NULL; + return code; } } } // pInfo->pLastrowReader = tsdbCacherowsReaderClose(pInfo->pLastrowReader); - return pInfo->pRes; + (*ppRes) = pInfo->pRes; + return code; } else { // pInfo->pLastrowReader = tsdbCacherowsReaderClose(pInfo->pLastrowReader); } @@ -380,8 +377,23 @@ SSDataBlock* doScanCache(SOperatorInfo* pOperator) { pReaderFn->closeReader(pInfo->pLastrowReader); pInfo->pLastrowReader = NULL; setOperatorCompleted(pOperator); - return NULL; + (*ppRes) = NULL; + return code; } + +_end: + if (code != TSDB_CODE_SUCCESS) { + qError("%s failed at line %d since %s", __func__, lino, tstrerror(code)); + pTaskInfo->code = code; + T_LONG_JMP(pTaskInfo->env, code); + } + return code; +} + +static SSDataBlock* doScanCache(SOperatorInfo* pOperator) { + SSDataBlock* pRes = NULL; + int32_t code = doScanCacheNext(pOperator, &pRes); + return pRes; } void destroyCacheScanOperator(void* param) { diff --git a/source/libs/executor/src/countwindowoperator.c b/source/libs/executor/src/countwindowoperator.c index 58d289efe4..4395d00127 100644 --- a/source/libs/executor/src/countwindowoperator.c +++ b/source/libs/executor/src/countwindowoperator.c @@ -145,8 +145,8 @@ void doCountWindowAggImpl(SOperatorInfo* pOperator, SSDataBlock* pBlock) { static void buildCountResult(SExprSupp* pExprSup, SCountWindowSupp* pCountSup, SExecTaskInfo* pTaskInfo, SFilterInfo* pFilterInfo, SSDataBlock* pBlock) { SResultRow* pResultRow = NULL; - int32_t code = TSDB_CODE_SUCCESS; - int32_t lino = 0; + int32_t code = TSDB_CODE_SUCCESS; + int32_t lino = 0; for (int32_t i = 0; i < taosArrayGetSize(pCountSup->pWinStates); i++) { SCountWindowResult* pBuff = NULL; code = setCountWindowOutputBuff(pExprSup, pCountSup, &pResultRow, &pBuff); @@ -171,7 +171,7 @@ _end: } } -static SSDataBlock* countWindowAggregate(SOperatorInfo* pOperator) { +static int32_t countWindowAggregateNext(SOperatorInfo* pOperator, SSDataBlock** ppRes) { int32_t code = TSDB_CODE_SUCCESS; int32_t lino = 0; SCountWindowOperatorInfo* pInfo = pOperator->info; @@ -198,11 +198,9 @@ static SSDataBlock* countWindowAggregate(SOperatorInfo* pOperator) { // there is an scalar expression that needs to be calculated right before apply the group aggregation. if (pInfo->scalarSup.pExprInfo != NULL) { - pTaskInfo->code = projectApplyFunctions(pInfo->scalarSup.pExprInfo, pBlock, pBlock, pInfo->scalarSup.pCtx, - pInfo->scalarSup.numOfExprs, NULL); - if (pTaskInfo->code != TSDB_CODE_SUCCESS) { - T_LONG_JMP(pTaskInfo->env, pTaskInfo->code); - } + code = projectApplyFunctions(pInfo->scalarSup.pExprInfo, pBlock, pBlock, pInfo->scalarSup.pCtx, + pInfo->scalarSup.numOfExprs, NULL); + QUERY_CHECK_CODE(code, lino, _end); } if (pInfo->groupId == 0) { @@ -214,7 +212,8 @@ static SSDataBlock* countWindowAggregate(SOperatorInfo* pOperator) { doCountWindowAggImpl(pOperator, pBlock); if (pRes->info.rows >= pOperator->resultInfo.threshold) { - return pRes; + (*ppRes) = pRes; + return code; } } @@ -223,9 +222,17 @@ static SSDataBlock* countWindowAggregate(SOperatorInfo* pOperator) { _end: if (code != TSDB_CODE_SUCCESS) { qError("%s failed at line %d since %s", __func__, lino, tstrerror(code)); + pTaskInfo->code = code; T_LONG_JMP(pTaskInfo->env, code); } - return pRes->info.rows == 0 ? NULL : pRes; + (*ppRes) = pRes->info.rows == 0 ? NULL : pRes; + return code; +} + +static SSDataBlock* countWindowAggregate(SOperatorInfo* pOperator) { + SSDataBlock* pRes = NULL; + int32_t code = countWindowAggregateNext(pOperator, &pRes); + return pRes; } SOperatorInfo* createCountwindowOperatorInfo(SOperatorInfo* downstream, SPhysiNode* physiNode, diff --git a/source/libs/executor/src/eventwindowoperator.c b/source/libs/executor/src/eventwindowoperator.c index 1988dff44f..4b23bc9d6e 100644 --- a/source/libs/executor/src/eventwindowoperator.c +++ b/source/libs/executor/src/eventwindowoperator.c @@ -168,7 +168,7 @@ void destroyEWindowOperatorInfo(void* param) { taosMemoryFreeClear(param); } -static SSDataBlock* eventWindowAggregate(SOperatorInfo* pOperator) { +static int32_t eventWindowAggregateNext(SOperatorInfo* pOperator, SSDataBlock** ppRes) { int32_t code = TSDB_CODE_SUCCESS; int32_t lino = 0; SEventWindowOperatorInfo* pInfo = pOperator->info; @@ -197,11 +197,9 @@ static SSDataBlock* eventWindowAggregate(SOperatorInfo* pOperator) { // there is an scalar expression that needs to be calculated right before apply the group aggregation. if (pInfo->scalarSup.pExprInfo != NULL) { - pTaskInfo->code = projectApplyFunctions(pInfo->scalarSup.pExprInfo, pBlock, pBlock, pInfo->scalarSup.pCtx, - pInfo->scalarSup.numOfExprs, NULL); - if (pTaskInfo->code != TSDB_CODE_SUCCESS) { - T_LONG_JMP(pTaskInfo->env, pTaskInfo->code); - } + code = projectApplyFunctions(pInfo->scalarSup.pExprInfo, pBlock, pBlock, pInfo->scalarSup.pCtx, + pInfo->scalarSup.numOfExprs, NULL); + QUERY_CHECK_CODE(code, lino, _end); } code = eventWindowAggImpl(pOperator, pInfo, pBlock); @@ -211,16 +209,25 @@ static SSDataBlock* eventWindowAggregate(SOperatorInfo* pOperator) { QUERY_CHECK_CODE(code, lino, _end); if (pRes->info.rows >= pOperator->resultInfo.threshold) { - return pRes; + (*ppRes) = pRes; + return code; } } _end: if (code != TSDB_CODE_SUCCESS) { qError("%s failed at line %d since %s", __func__, lino, tstrerror(code)); + pTaskInfo->code = code; T_LONG_JMP(pTaskInfo->env, code); } - return pRes->info.rows == 0 ? NULL : pRes; + (*ppRes) = pRes->info.rows == 0 ? NULL : pRes; + return code; +} + +static SSDataBlock* eventWindowAggregate(SOperatorInfo* pOperator) { + SSDataBlock* pRes = NULL; + int32_t code = eventWindowAggregateNext(pOperator, &pRes); + return pRes; } static int32_t setSingleOutputTupleBufv1(SResultRowInfo* pResultRowInfo, STimeWindow* win, SResultRow** pResult, diff --git a/source/libs/executor/src/exchangeoperator.c b/source/libs/executor/src/exchangeoperator.c index 421fc562a4..cce3bf69af 100644 --- a/source/libs/executor/src/exchangeoperator.c +++ b/source/libs/executor/src/exchangeoperator.c @@ -230,30 +230,30 @@ static SSDataBlock* doLoadRemoteDataImpl(SOperatorInfo* pOperator) { } } -static SSDataBlock* loadRemoteData(SOperatorInfo* pOperator) { +static int32_t loadRemoteDataNext(SOperatorInfo* pOperator, SSDataBlock** ppRes) { + int32_t code = TSDB_CODE_SUCCESS; + int32_t lino = 0; SExchangeInfo* pExchangeInfo = pOperator->info; SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo; - pTaskInfo->code = pOperator->fpSet._openFn(pOperator); - if (pTaskInfo->code != TSDB_CODE_SUCCESS) { - T_LONG_JMP(pTaskInfo->env, pTaskInfo->code); - } + code = pOperator->fpSet._openFn(pOperator); + QUERY_CHECK_CODE(code, lino, _end); if (pOperator->status == OP_EXEC_DONE) { - return NULL; + (*ppRes) = NULL; + return code; } while (1) { SSDataBlock* pBlock = doLoadRemoteDataImpl(pOperator); if (pBlock == NULL) { - return NULL; + (*ppRes) = NULL; + return code; } - pTaskInfo->code = doFilter(pBlock, pOperator->exprSupp.pFilterInfo, NULL); - if (pTaskInfo->code != TSDB_CODE_SUCCESS) { - qError("%s failed at line %d since %s", __func__, __LINE__, tstrerror(pTaskInfo->code)); - T_LONG_JMP(pTaskInfo->env, pTaskInfo->code); - } + code = doFilter(pBlock, pOperator->exprSupp.pFilterInfo, NULL); + QUERY_CHECK_CODE(code, lino, _end); + if (blockDataGetNumOfRows(pBlock) == 0) { continue; } @@ -266,15 +266,33 @@ static SSDataBlock* loadRemoteData(SOperatorInfo* pOperator) { } else if (status == PROJECT_RETRIEVE_DONE) { if (pBlock->info.rows == 0) { setOperatorCompleted(pOperator); - return NULL; + (*ppRes) = NULL; + return code; } else { - return pBlock; + (*ppRes) = pBlock; + return code; } } } else { - return pBlock; + (*ppRes) = pBlock; + return code; } } + +_end: + if (code != TSDB_CODE_SUCCESS) { + qError("%s failed at line %d since %s", __func__, lino, tstrerror(code)); + pTaskInfo->code = code; + T_LONG_JMP(pTaskInfo->env, code); + } + (*ppRes) = NULL; + return code; +} + +static SSDataBlock* loadRemoteData(SOperatorInfo* pOperator) { + SSDataBlock* pRes = NULL; + int32_t code = loadRemoteDataNext(pOperator, &pRes); + return pRes; } static int32_t initDataSource(int32_t numOfSources, SExchangeInfo* pInfo, const char* id) { diff --git a/source/libs/executor/src/filloperator.c b/source/libs/executor/src/filloperator.c index 66655090bc..341b1a01ea 100644 --- a/source/libs/executor/src/filloperator.c +++ b/source/libs/executor/src/filloperator.c @@ -316,12 +316,14 @@ _end: return NULL; } -static SSDataBlock* doFill(SOperatorInfo* pOperator) { +static int32_t doFillNext(SOperatorInfo* pOperator, SSDataBlock** ppRes) { + int32_t code = TSDB_CODE_SUCCESS; SFillOperatorInfo* pInfo = pOperator->info; SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo; if (pOperator->status == OP_EXEC_DONE) { - return NULL; + (*ppRes) = NULL; + return code; } SSDataBlock* fillResult = NULL; @@ -332,9 +334,10 @@ static SSDataBlock* doFill(SOperatorInfo* pOperator) { break; } - int32_t code = doFilter(fillResult, pOperator->exprSupp.pFilterInfo, &pInfo->matchInfo); + code = doFilter(fillResult, pOperator->exprSupp.pFilterInfo, &pInfo->matchInfo); if (code != TSDB_CODE_SUCCESS) { qError("%s failed at line %d since %s", __func__, __LINE__, tstrerror(code)); + pTaskInfo->code = code; T_LONG_JMP(pTaskInfo->env, code); } if (fillResult->info.rows > 0) { @@ -346,7 +349,14 @@ static SSDataBlock* doFill(SOperatorInfo* pOperator) { pOperator->resultInfo.totalRows += fillResult->info.rows; } - return fillResult; + (*ppRes) = fillResult; + return code; +} + +static SSDataBlock* doFill(SOperatorInfo* pOperator) { + SSDataBlock* pRes = NULL; + int32_t code = doFillNext(pOperator, &pRes); + return pRes; } void destroyFillOperatorInfo(void* param) { @@ -374,8 +384,9 @@ static int32_t initFillInfo(SFillOperatorInfo* pInfo, SExprInfo* pExpr, int32_t // STimeWindow w = {0}; // getInitialStartTimeWindow(pInterval, startKey, &w, order == TSDB_ORDER_ASC); - pInfo->pFillInfo = taosCreateFillInfo(startKey, numOfCols, numOfNotFillCols, capacity, pInterval, fillType, pColInfo, - pInfo->primaryTsCol, order, id, pTaskInfo); + pInfo->pFillInfo = NULL; + taosCreateFillInfo(startKey, numOfCols, numOfNotFillCols, capacity, pInterval, fillType, pColInfo, + pInfo->primaryTsCol, order, id, pTaskInfo, &pInfo->pFillInfo); if (order == TSDB_ORDER_ASC) { pInfo->win.skey = win.skey; diff --git a/source/libs/executor/src/groupoperator.c b/source/libs/executor/src/groupoperator.c index 1af5ef0238..eb48144967 100644 --- a/source/libs/executor/src/groupoperator.c +++ b/source/libs/executor/src/groupoperator.c @@ -460,9 +460,10 @@ _end: return (pRes->info.rows == 0) ? NULL : pRes; } -static SSDataBlock* hashGroupbyAggregate(SOperatorInfo* pOperator) { +static int32_t hashGroupbyAggregateNext(SOperatorInfo* pOperator, SSDataBlock** ppRes) { if (pOperator->status == OP_EXEC_DONE) { - return NULL; + (*ppRes) = NULL; + return TSDB_CODE_SUCCESS; } int32_t code = TSDB_CODE_SUCCESS; @@ -471,7 +472,8 @@ static SSDataBlock* hashGroupbyAggregate(SOperatorInfo* pOperator) { SGroupbyOperatorInfo* pInfo = pOperator->info; if (pOperator->status == OP_RES_TO_RETURN) { - return buildGroupResultDataBlockByHash(pOperator); + (*ppRes) = buildGroupResultDataBlockByHash(pOperator); + return code; } SGroupResInfo* pGroupResInfo = &pInfo->groupResInfo; @@ -523,7 +525,14 @@ _end: pTaskInfo->code = code; T_LONG_JMP(pTaskInfo->env, code); } - return buildGroupResultDataBlockByHash(pOperator); + (*ppRes) = buildGroupResultDataBlockByHash(pOperator); + return code; +} + +static SSDataBlock* hashGroupbyAggregate(SOperatorInfo* pOperator) { + SSDataBlock* pRes = NULL; + int32_t code = hashGroupbyAggregateNext(pOperator, &pRes); + return pRes; } SOperatorInfo* createGroupOperatorInfo(SOperatorInfo* downstream, SAggPhysiNode* pAggNode, SExecTaskInfo* pTaskInfo) { @@ -978,9 +987,10 @@ _end: return pInfo->binfo.pRes; } -static SSDataBlock* hashPartition(SOperatorInfo* pOperator) { +static int32_t hashPartitionNext(SOperatorInfo* pOperator, SSDataBlock** ppRes) { if (pOperator->status == OP_EXEC_DONE) { - return NULL; + (*ppRes) = NULL; + return TSDB_CODE_SUCCESS; } int32_t code = TSDB_CODE_SUCCESS; @@ -990,7 +1000,8 @@ static SSDataBlock* hashPartition(SOperatorInfo* pOperator) { SSDataBlock* pRes = pInfo->binfo.pRes; if (pOperator->status == OP_RES_TO_RETURN) { - return buildPartitionResult(pOperator); + (*ppRes) = buildPartitionResult(pOperator); + return code; } int64_t st = taosGetTimestampUs(); @@ -1005,21 +1016,21 @@ static SSDataBlock* hashPartition(SOperatorInfo* pOperator) { pInfo->binfo.pRes->info.scanFlag = pBlock->info.scanFlag; // there is an scalar expression that needs to be calculated right before apply the group aggregation. if (pInfo->scalarSup.pExprInfo != NULL) { - pTaskInfo->code = projectApplyFunctions(pInfo->scalarSup.pExprInfo, pBlock, pBlock, pInfo->scalarSup.pCtx, - pInfo->scalarSup.numOfExprs, NULL); - if (pTaskInfo->code != TSDB_CODE_SUCCESS) { - T_LONG_JMP(pTaskInfo->env, pTaskInfo->code); - } + code = projectApplyFunctions(pInfo->scalarSup.pExprInfo, pBlock, pBlock, pInfo->scalarSup.pCtx, + pInfo->scalarSup.numOfExprs, NULL); + QUERY_CHECK_CODE(code, lino, _end); } terrno = TSDB_CODE_SUCCESS; doHashPartition(pOperator, pBlock); if (terrno != TSDB_CODE_SUCCESS) { // group by json error - T_LONG_JMP(pTaskInfo->env, terrno); + code = terrno; + QUERY_CHECK_CODE(code, lino, _end); } } SArray* groupArray = taosArrayInit(taosHashGetSize(pInfo->pGroupSet), sizeof(SDataGroupInfo)); + QUERY_CHECK_NULL(groupArray, code, lino, _end, TSDB_CODE_OUT_OF_MEMORY); void* pGroupIter = taosHashIterate(pInfo->pGroupSet, NULL); while (pGroupIter != NULL) { @@ -1043,10 +1054,18 @@ static SSDataBlock* hashPartition(SOperatorInfo* pOperator) { _end: if (code != TSDB_CODE_SUCCESS) { qError("%s failed at line %d since %s", __func__, lino, tstrerror(code)); + pTaskInfo->code = code; T_LONG_JMP(pTaskInfo->env, code); } - return buildPartitionResult(pOperator); + (*ppRes) = buildPartitionResult(pOperator); + return code; +} + +static SSDataBlock* hashPartition(SOperatorInfo* pOperator) { + SSDataBlock* pRes = NULL; + int32_t code = hashPartitionNext(pOperator, &pRes); + return pRes; } static void destroyPartitionOperatorInfo(void* param) { @@ -1413,26 +1432,29 @@ _end: } } -static SSDataBlock* doStreamHashPartition(SOperatorInfo* pOperator) { +static int32_t doStreamHashPartitionNext(SOperatorInfo* pOperator, SSDataBlock** ppRes) { int32_t code = TSDB_CODE_SUCCESS; int32_t lino = 0; SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo; SStreamPartitionOperatorInfo* pInfo = pOperator->info; if (pOperator->status == OP_EXEC_DONE) { - return NULL; + (*ppRes) = NULL; + return code; } if (hasRemainTbName(pInfo)) { code = buildStreamCreateTableResult(pOperator); QUERY_CHECK_CODE(code, lino, _end); if (pInfo->pCreateTbRes && pInfo->pCreateTbRes->info.rows > 0) { - return pInfo->pCreateTbRes; + (*ppRes) = pInfo->pCreateTbRes; + return code; } } if (hasRemainPartion(pInfo)) { - return buildStreamPartitionResult(pOperator); + (*ppRes) = buildStreamPartitionResult(pOperator); + return code; } int64_t st = taosGetTimestampUs(); @@ -1442,7 +1464,8 @@ static SSDataBlock* doStreamHashPartition(SOperatorInfo* pOperator) { SSDataBlock* pBlock = getNextBlockFromDownstream(pOperator, 0); if (pBlock == NULL) { setOperatorCompleted(pOperator); - return NULL; + (*ppRes) = NULL; + return code; } printSpecDataBlock(pBlock, getStreamOpName(pOperator->operatorType), "recv", GET_TASKID(pTaskInfo)); switch (pBlock->info.type) { @@ -1457,13 +1480,15 @@ static SSDataBlock* doStreamHashPartition(SOperatorInfo* pOperator) { pInfo->pDelRes->info.type = STREAM_DELETE_RESULT; printDataBlock(pInfo->pDelRes, getStreamOpName(pOperator->operatorType), GET_TASKID(pTaskInfo)); - return pInfo->pDelRes; + (*ppRes) = pInfo->pDelRes; + return code; } break; case STREAM_CREATE_CHILD_TABLE: case STREAM_RETRIEVE: case STREAM_CHECKPOINT: case STREAM_GET_ALL: { - return pBlock; + (*ppRes) = pBlock; + return code; } default: ASSERTS(0, "invalid SSDataBlock type"); @@ -1485,15 +1510,25 @@ static SSDataBlock* doStreamHashPartition(SOperatorInfo* pOperator) { code = buildStreamCreateTableResult(pOperator); QUERY_CHECK_CODE(code, lino, _end); if (pInfo->pCreateTbRes && pInfo->pCreateTbRes->info.rows > 0) { - return pInfo->pCreateTbRes; + (*ppRes) = pInfo->pCreateTbRes; + return code; } - return buildStreamPartitionResult(pOperator); + (*ppRes) = buildStreamPartitionResult(pOperator); + return code; _end: if (code != TSDB_CODE_SUCCESS) { + pTaskInfo->code = code; qError("%s failed at line %d since %s", __func__, lino, tstrerror(code)); } - return NULL; + (*ppRes) = NULL; + return code; +} + +static SSDataBlock* doStreamHashPartition(SOperatorInfo* pOperator) { + SSDataBlock* pRes = NULL; + int32_t code = doStreamHashPartitionNext(pOperator, &pRes); + return pRes; } static void destroyStreamPartitionOperatorInfo(void* param) { diff --git a/source/libs/executor/src/scanoperator.c b/source/libs/executor/src/scanoperator.c index de0ff0e595..b3525617ff 100644 --- a/source/libs/executor/src/scanoperator.c +++ b/source/libs/executor/src/scanoperator.c @@ -842,23 +842,24 @@ static SSDataBlock* getBlockForEmptyTable(SOperatorInfo* pOperator, const STable return pBlock; } -static SSDataBlock* doTableScanImpl(SOperatorInfo* pOperator) { +static int32_t doTableScanImplNext(SOperatorInfo* pOperator, SSDataBlock** ppRes) { + int32_t code = TSDB_CODE_SUCCESS; + int32_t lino = 0; STableScanInfo* pTableScanInfo = pOperator->info; SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo; SStorageAPI* pAPI = &pTaskInfo->storageAPI; SSDataBlock* pBlock = pTableScanInfo->pResBlock; bool hasNext = false; - int32_t code = TSDB_CODE_SUCCESS; pBlock->info.dataLoad = false; int64_t st = taosGetTimestampUs(); while (true) { code = pAPI->tsdReader.tsdNextDataBlock(pTableScanInfo->base.dataReader, &hasNext); - if (code) { + if (code != TSDB_CODE_SUCCESS) { pAPI->tsdReader.tsdReaderReleaseDataBlock(pTableScanInfo->base.dataReader); - T_LONG_JMP(pTaskInfo->env, code); + QUERY_CHECK_CODE(code, lino, _end); } if (!hasNext) { @@ -887,9 +888,7 @@ static SSDataBlock* doTableScanImpl(SOperatorInfo* pOperator) { uint32_t status = 0; code = loadDataBlock(pOperator, &pTableScanInfo->base, pBlock, &status); - if (code != TSDB_CODE_SUCCESS) { - T_LONG_JMP(pTaskInfo->env, code); - } + QUERY_CHECK_CODE(code, lino, _end); if (status == FUNC_DATA_REQUIRED_ALL_FILTEROUT) { break; @@ -905,9 +904,24 @@ static SSDataBlock* doTableScanImpl(SOperatorInfo* pOperator) { pOperator->cost.totalCost = pTableScanInfo->base.readRecorder.elapsedTime; pBlock->info.scanFlag = pTableScanInfo->base.scanFlag; - return pBlock; + (*ppRes) = pBlock; + return code; } - return NULL; + +_end: + if (code != TSDB_CODE_SUCCESS) { + qError("%s failed at line %d since %s", __func__, lino, tstrerror(code)); + pTaskInfo->code = code; + T_LONG_JMP(pTaskInfo->env, code); + } + (*ppRes) = NULL; + return code; +} + +static SSDataBlock* doTableScanImpl(SOperatorInfo* pOperator) { + SSDataBlock* pRes = NULL; + int32_t code = doTableScanImplNext(pOperator, &pRes); + return pRes; } static SSDataBlock* doGroupedTableScan(SOperatorInfo* pOperator) { @@ -1177,7 +1191,7 @@ _end: return result; } -static SSDataBlock* doTableScan(SOperatorInfo* pOperator) { +static int32_t doTableScanNext(SOperatorInfo* pOperator, SSDataBlock** ppRes) { int32_t code = TSDB_CODE_SUCCESS; int32_t lino = 0; STableScanInfo* pInfo = pOperator->info; @@ -1189,10 +1203,8 @@ static SSDataBlock* doTableScan(SOperatorInfo* pOperator) { code = createTableListInfoFromParam(pOperator); freeOperatorParam(pOperator->pOperatorGetParam, OP_GET_PARAM); pOperator->pOperatorGetParam = NULL; - if (code != TSDB_CODE_SUCCESS) { - pTaskInfo->code = code; - T_LONG_JMP(pTaskInfo->env, code); - } + QUERY_CHECK_CODE(code, lino, _end); + if (pOperator->status == OP_EXEC_DONE) { pInfo->currentGroupId = -1; pOperator->status = OP_OPENED; @@ -1200,7 +1212,8 @@ static SSDataBlock* doTableScan(SOperatorInfo* pOperator) { while (true) { result = startNextGroupScan(pOperator); if (result || pOperator->status == OP_EXEC_DONE) { - return result; + (*ppRes) = result; + return code; } } } @@ -1215,7 +1228,8 @@ static SSDataBlock* doTableScan(SOperatorInfo* pOperator) { while (1) { SSDataBlock* result = doGroupedTableScan(pOperator); if (result || (pOperator->status == OP_EXEC_DONE) || isTaskKilled(pTaskInfo)) { - return result; + (*ppRes) = result; + return code; } // if no data, switch to next table and continue scan @@ -1227,7 +1241,8 @@ static SSDataBlock* doTableScan(SOperatorInfo* pOperator) { if (pInfo->currentTable >= numOfTables) { qDebug("all table checked in table list, total:%d, return NULL, %s", numOfTables, GET_TASKID(pTaskInfo)); taosRUnLockLatch(&pTaskInfo->lock); - return NULL; + (*ppRes) = NULL; + return code; } tInfo = *(STableKeyInfo*)tableListGetInfo(pInfo->base.pTableListInfo, pInfo->currentTable); @@ -1243,7 +1258,8 @@ static SSDataBlock* doTableScan(SOperatorInfo* pOperator) { pInfo->scanTimes = 0; } } else { // scan table group by group sequentially - return groupSeqTableScan(pOperator); + (*ppRes) = groupSeqTableScan(pOperator); + return code; } _end: @@ -1252,7 +1268,14 @@ _end: pTaskInfo->code = code; T_LONG_JMP(pTaskInfo->env, code); } - return NULL; + (*ppRes) = NULL; + return code; +} + +static SSDataBlock* doTableScan(SOperatorInfo* pOperator) { + SSDataBlock* pRes = NULL; + int32_t code = doTableScanNext(pOperator, &pRes); + return pRes; } static int32_t getTableScannerExecInfo(struct SOperatorInfo* pOptr, void** pOptrExplain, uint32_t* len) { @@ -2648,7 +2671,7 @@ static void processPrimaryKey(SSDataBlock* pBlock, bool hasPrimaryKey, STqOffset tqOffsetResetToData(offset, pBlock->info.id.uid, pBlock->info.window.ekey, val); } -static SSDataBlock* doQueueScan(SOperatorInfo* pOperator) { +static int32_t doQueueScanNext(SOperatorInfo* pOperator, SSDataBlock** ppRes) { int32_t code = TSDB_CODE_SUCCESS; int32_t lino = 0; SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo; @@ -2660,7 +2683,8 @@ static SSDataBlock* doQueueScan(SOperatorInfo* pOperator) { qDebug("start to exec queue scan, %s", id); if (isTaskKilled(pTaskInfo)) { - return NULL; + (*ppRes) = NULL; + return code; } if (pTaskInfo->streamInfo.currentOffset.type == TMQ_OFFSET__SNAPSHOT_DATA) { @@ -2672,7 +2696,8 @@ static SSDataBlock* doQueueScan(SOperatorInfo* pOperator) { processPrimaryKey(pResult, hasPrimaryKey, &pTaskInfo->streamInfo.currentOffset); qDebug("tmqsnap doQueueScan get data uid:%" PRId64 "", pResult->info.id.uid); if (pResult->info.rows > 0) { - return pResult; + (*ppRes) = pResult; + return code; } } else { break; @@ -2686,7 +2711,8 @@ static SSDataBlock* doQueueScan(SOperatorInfo* pOperator) { int64_t validVer = pTaskInfo->streamInfo.snapshotVer + 1; qDebug("queue scan tsdb over, switch to wal ver %" PRId64 "", validVer); if (pAPI->tqReaderFn.tqReaderSeek(pInfo->tqReader, validVer, pTaskInfo->id.str) < 0) { - return NULL; + (*ppRes) = NULL; + return code; } tqOffsetResetToLog(&pTaskInfo->streamInfo.currentOffset, validVer); @@ -2716,23 +2742,34 @@ static SSDataBlock* doQueueScan(SOperatorInfo* pOperator) { qDebug("doQueueScan after filter get data from log %" PRId64 " rows, version:%" PRId64, pInfo->pRes->info.rows, pTaskInfo->streamInfo.currentOffset.version); if (pInfo->pRes->info.rows > 0) { - return pInfo->pRes; + (*ppRes) = pInfo->pRes; + return code; } } else { qDebug("doQueueScan get none from log, return, version:%" PRId64, pTaskInfo->streamInfo.currentOffset.version); - return NULL; + (*ppRes) = NULL; + return code; } } } else { qError("unexpected streamInfo prepare type: %d", pTaskInfo->streamInfo.currentOffset.type); - return NULL; + (*ppRes) = NULL; + return code; } _end: if (code != TSDB_CODE_SUCCESS) { + pTaskInfo->code = code; qError("%s failed at line %d since %s", __func__, lino, tstrerror(code)); } - return NULL; + (*ppRes) = NULL; + return code; +} + +static SSDataBlock* doQueueScan(SOperatorInfo* pOperator) { + SSDataBlock* pRes = NULL; + int32_t code = doQueueScanNext(pOperator, &pRes); + return pRes; } static int32_t filterDelBlockByUid(SSDataBlock* pDst, const SSDataBlock* pSrc, SStreamScanInfo* pInfo) { @@ -2923,7 +2960,7 @@ static bool isStreamWindow(SStreamScanInfo* pInfo) { return isIntervalWindow(pInfo) || isSessionWindow(pInfo) || isStateWindow(pInfo) || isCountWindow(pInfo); } -static SSDataBlock* doStreamScan(SOperatorInfo* pOperator) { +static int32_t doStreamScanNext(SOperatorInfo* pOperator, SSDataBlock** ppRes) { // NOTE: this operator does never check if current status is done or not int32_t code = TSDB_CODE_SUCCESS; int32_t lino = 0; @@ -2973,7 +3010,8 @@ static SSDataBlock* doStreamScan(SOperatorInfo* pOperator) { if (pStreamInfo->recoverStep == STREAM_RECOVER_STEP__SCAN1) { if (isTaskKilled(pTaskInfo)) { qInfo("===stream===stream scan is killed. task id:%s, code %s", id, tstrerror(pTaskInfo->code)); - return NULL; + (*ppRes) = NULL; + return code; } switch (pInfo->scanMode) { @@ -2981,7 +3019,8 @@ static SSDataBlock* doStreamScan(SOperatorInfo* pOperator) { pInfo->scanMode = STREAM_SCAN_FROM_READERHANDLE; printSpecDataBlock(pInfo->pRecoverRes, getStreamOpName(pOperator->operatorType), "recover", GET_TASKID(pTaskInfo)); - return pInfo->pRecoverRes; + (*ppRes) = pInfo->pRecoverRes; + return code; } break; default: break; @@ -3002,13 +3041,15 @@ static SSDataBlock* doStreamScan(SOperatorInfo* pOperator) { pInfo->scanMode = STREAM_SCAN_FROM_RES; printSpecDataBlock(pInfo->pCreateTbRes, getStreamOpName(pOperator->operatorType), "recover", GET_TASKID(pTaskInfo)); - return pInfo->pCreateTbRes; + (*ppRes) = pInfo->pCreateTbRes; + return code; } qDebug("stream recover scan get block, rows %" PRId64, pInfo->pRecoverRes->info.rows); printSpecDataBlock(pInfo->pRecoverRes, getStreamOpName(pOperator->operatorType), "recover", GET_TASKID(pTaskInfo)); - return pInfo->pRecoverRes; + (*ppRes) = pInfo->pRecoverRes; + return code; } pStreamInfo->recoverStep = STREAM_RECOVER_STEP__NONE; STableScanInfo* pTSInfo = pInfo->pTableScanOp->info; @@ -3020,7 +3061,8 @@ static SSDataBlock* doStreamScan(SOperatorInfo* pOperator) { pTSInfo->base.cond.endVersion = -1; pStreamInfo->recoverScanFinished = true; - return NULL; + (*ppRes) = NULL; + return code; } size_t total = taosArrayGetSize(pInfo->pBlockLists); @@ -3029,7 +3071,8 @@ FETCH_NEXT_BLOCK: if (pInfo->blockType == STREAM_INPUT__DATA_BLOCK) { if (pInfo->validBlockIndex >= total) { doClearBufferedBlocks(pInfo); - return NULL; + (*ppRes) = NULL; + return code; } int32_t current = pInfo->validBlockIndex++; @@ -3060,7 +3103,8 @@ FETCH_NEXT_BLOCK: case STREAM_GET_ALL: printDataBlock(pBlock, getStreamOpName(pOperator->operatorType), GET_TASKID(pTaskInfo)); setStreamOperatorState(&pInfo->basic, pBlock->info.type); - return pBlock; + (*ppRes) = pBlock; + return code; case STREAM_RETRIEVE: { pInfo->blockType = STREAM_INPUT__DATA_SUBMIT; pInfo->scanMode = STREAM_SCAN_FROM_DATAREADER_RETRIEVE; @@ -3107,7 +3151,8 @@ FETCH_NEXT_BLOCK: printSpecDataBlock(pInfo->pDeleteDataRes, getStreamOpName(pOperator->operatorType), "delete result", GET_TASKID(pTaskInfo)); setStreamOperatorState(&pInfo->basic, pInfo->pDeleteDataRes->info.type); - return pInfo->pDeleteDataRes; + (*ppRes) = pInfo->pDeleteDataRes; + return code; } else { goto FETCH_NEXT_BLOCK; } @@ -3128,7 +3173,8 @@ FETCH_NEXT_BLOCK: printSpecDataBlock(pInfo->pDeleteDataRes, getStreamOpName(pOperator->operatorType), "delete result", GET_TASKID(pTaskInfo)); setStreamOperatorState(&pInfo->basic, pInfo->pDeleteDataRes->info.type); - return pInfo->pDeleteDataRes; + (*ppRes) = pInfo->pDeleteDataRes; + return code; } else { goto FETCH_NEXT_BLOCK; } @@ -3142,7 +3188,8 @@ FETCH_NEXT_BLOCK: } printDataBlock(pBlock, getStreamOpName(pOperator->operatorType), GET_TASKID(pTaskInfo)); setStreamOperatorState(&pInfo->basic, pBlock->info.type); - return pBlock; + (*ppRes) = pBlock; + return code; } else if (pInfo->blockType == STREAM_INPUT__DATA_SUBMIT) { qDebug("stream scan mode:%d, %s", pInfo->scanMode, id); switch (pInfo->scanMode) { @@ -3158,7 +3205,8 @@ FETCH_NEXT_BLOCK: QUERY_CHECK_CODE(code, lino, _end); if (pInfo->pRes->info.rows > 0) { printDataBlock(pInfo->pRes, getStreamOpName(pOperator->operatorType), GET_TASKID(pTaskInfo)); - return pInfo->pRes; + (*ppRes) = pInfo->pRes; + return code; } } break; case STREAM_SCAN_FROM_DELETE_DATA: { @@ -3169,14 +3217,16 @@ FETCH_NEXT_BLOCK: code = copyDataBlock(pInfo->pDeleteDataRes, pInfo->pUpdateRes); QUERY_CHECK_CODE(code, lino, _end); pInfo->pDeleteDataRes->info.type = STREAM_DELETE_DATA; - return pInfo->pDeleteDataRes; + (*ppRes) = pInfo->pDeleteDataRes; + return code; } break; case STREAM_SCAN_FROM_UPDATERES: { code = generateScanRange(pInfo, pInfo->pUpdateDataRes, pInfo->pUpdateRes, STREAM_CLEAR); QUERY_CHECK_CODE(code, lino, _end); prepareRangeScan(pInfo, pInfo->pUpdateRes, &pInfo->updateResIndex, NULL); pInfo->scanMode = STREAM_SCAN_FROM_DATAREADER_RANGE; - return pInfo->pUpdateRes; + (*ppRes) = pInfo->pUpdateRes; + return code; } break; case STREAM_SCAN_FROM_DATAREADER_RANGE: case STREAM_SCAN_FROM_DATAREADER_RETRIEVE: { @@ -3193,7 +3243,8 @@ FETCH_NEXT_BLOCK: printSpecDataBlock(pSDB, getStreamOpName(pOperator->operatorType), "update", GET_TASKID(pTaskInfo)); code = calBlockTbName(pInfo, pSDB, 0); QUERY_CHECK_CODE(code, lino, _end); - return pSDB; + (*ppRes) = pSDB; + return code; } blockDataCleanup(pInfo->pUpdateDataRes); pInfo->scanMode = STREAM_SCAN_FROM_READERHANDLE; @@ -3212,7 +3263,8 @@ FETCH_NEXT_BLOCK: prepareRangeScan(pInfo, pInfo->pUpdateRes, &pInfo->updateResIndex, NULL); pInfo->pUpdateRes->info.type = STREAM_DELETE_DATA; printSpecDataBlock(pInfo->pUpdateRes, getStreamOpName(pOperator->operatorType), "rebuild", GET_TASKID(pTaskInfo)); - return pInfo->pUpdateRes; + (*ppRes) = pInfo->pUpdateRes; + return code; } SDataBlockInfo* pBlockInfo = &pInfo->pRes->info; @@ -3226,7 +3278,8 @@ FETCH_NEXT_BLOCK: doClearBufferedBlocks(pInfo); qDebug("stream scan return empty, all %d submit blocks consumed, %s", totalBlocks, id); - return NULL; + (*ppRes) = NULL; + return code; } int32_t current = pInfo->validBlockIndex++; @@ -3264,7 +3317,8 @@ FETCH_NEXT_BLOCK: pInfo->scanMode = STREAM_SCAN_FROM_RES; qDebug("create table res exists, rows:%" PRId64 " return from stream scan, %s", pInfo->pCreateTbRes->info.rows, id); - return pInfo->pCreateTbRes; + (*ppRes) = pInfo->pCreateTbRes; + return code; } code = doCheckUpdate(pInfo, pBlockInfo->window.ekey, pInfo->pRes); @@ -3297,7 +3351,8 @@ FETCH_NEXT_BLOCK: qDebug("stream scan completed, and return source rows:%" PRId64 ", %s", pBlockInfo->rows, id); if (pBlockInfo->rows > 0) { printDataBlock(pInfo->pRes, getStreamOpName(pOperator->operatorType), GET_TASKID(pTaskInfo)); - return pInfo->pRes; + (*ppRes) = pInfo->pRes; + return code; } if (pInfo->pUpdateDataRes->info.rows > 0) { @@ -3308,7 +3363,8 @@ FETCH_NEXT_BLOCK: } else if (pInfo->blockType == STREAM_INPUT__CHECKPOINT) { if (pInfo->validBlockIndex >= total) { doClearBufferedBlocks(pInfo); - return NULL; + (*ppRes) = NULL; + return code; } int32_t current = pInfo->validBlockIndex++; @@ -3321,16 +3377,24 @@ FETCH_NEXT_BLOCK: streamScanOperatorSaveCheckpoint(pInfo); } // printDataBlock(pInfo->pCheckpointRes, "stream scan ck", GET_TASKID(pTaskInfo)); - return pInfo->pCheckpointRes; + (*ppRes) = pInfo->pCheckpointRes; + return code; } _end: if (code != TSDB_CODE_SUCCESS) { + pTaskInfo->code = code; qError("%s failed at line %d since %s", __func__, lino, tstrerror(code)); } - return NULL; + (*ppRes) = NULL; + return code; } +static SSDataBlock* doStreamScan(SOperatorInfo* pOperator) { + SSDataBlock* pRes = NULL; + int32_t code = doStreamScanNext(pOperator, &pRes); + return pRes; +} static int32_t extractTableIdList(const STableListInfo* pTableListInfo, SArray** ppArrayRes) { int32_t code = TSDB_CODE_SUCCESS; int32_t lino = 0; @@ -3353,7 +3417,7 @@ _end: return code; } -static SSDataBlock* doRawScan(SOperatorInfo* pOperator) { +static int32_t doRawScanNext(SOperatorInfo* pOperator, SSDataBlock** ppRes) { int32_t code = TSDB_CODE_SUCCESS; int32_t lino = 0; SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo; @@ -3368,9 +3432,9 @@ static SSDataBlock* doRawScan(SOperatorInfo* pOperator) { bool hasNext = false; if (pInfo->dataReader && pInfo->sContext->withMeta != ONLY_META) { code = pAPI->tsdReader.tsdNextDataBlock(pInfo->dataReader, &hasNext); - if (code) { + if (code != TSDB_CODE_SUCCESS) { pAPI->tsdReader.tsdReaderReleaseDataBlock(pInfo->dataReader); - T_LONG_JMP(pTaskInfo->env, code); + QUERY_CHECK_CODE(code, lino, _end); } } @@ -3382,21 +3446,24 @@ static SSDataBlock* doRawScan(SOperatorInfo* pOperator) { SSDataBlock* pBlock = NULL; code = pAPI->tsdReader.tsdReaderRetrieveDataBlock(pInfo->dataReader, &pBlock, NULL); - if (pBlock == NULL || code != TSDB_CODE_SUCCESS) { - T_LONG_JMP(pTaskInfo->env, terrno); - } + QUERY_CHECK_CODE(code, lino, _end); if (pBlock && pBlock->info.rows > 0) { bool hasPrimaryKey = pAPI->snapshotFn.taosXGetTablePrimaryKey(pInfo->sContext); processPrimaryKey(pBlock, hasPrimaryKey, &pTaskInfo->streamInfo.currentOffset); qDebug("tmqsnap doRawScan get data uid:%" PRId64 "", pBlock->info.id.uid); - return pBlock; + (*ppRes) = pBlock; + return code; } } SMetaTableInfo mtInfo = {0}; code = pAPI->snapshotFn.getMetaTableInfoFromSnapshot(pInfo->sContext, &mtInfo); QUERY_CHECK_CODE(code, lino, _end); + if (code != 0) { + tDeleteSchemaWrapper(mtInfo.schema); + goto _end; + } STqOffsetVal offset = {0}; if (mtInfo.uid == 0 || pInfo->sContext->withMeta == ONLY_META) { // read snapshot done, change to get data from wal qDebug("tmqsnap read snapshot done, change to get data from wal"); @@ -3409,7 +3476,8 @@ static SSDataBlock* doRawScan(SOperatorInfo* pOperator) { tDeleteSchemaWrapper(mtInfo.schema); code = qStreamPrepareScan(pTaskInfo, &offset, pInfo->sContext->subType); QUERY_CHECK_CODE(code, lino, _end); - return NULL; + (*ppRes) = NULL; + return code; } else if (pTaskInfo->streamInfo.currentOffset.type == TMQ_OFFSET__SNAPSHOT_META) { SSnapContext* sContext = pInfo->sContext; for (int32_t i = 0; i < tmqRowSize; i++) { @@ -3443,21 +3511,24 @@ static SSDataBlock* doRawScan(SOperatorInfo* pOperator) { pTaskInfo->streamInfo.btMetaRsp.batchMetaLen = taosArrayInit(4, sizeof(int32_t)); QUERY_CHECK_NULL(pTaskInfo->streamInfo.btMetaRsp.batchMetaLen, code, lino, _end, TSDB_CODE_OUT_OF_MEMORY); } + int32_t tempRes = TSDB_CODE_SUCCESS; uint32_t len = 0; - tEncodeSize(tEncodeMqMetaRsp, &tmpMetaRsp, len, code); - if (TSDB_CODE_SUCCESS != code) { + tEncodeSize(tEncodeMqMetaRsp, &tmpMetaRsp, len, tempRes); + if (TSDB_CODE_SUCCESS != tempRes) { qError("tmqsnap tEncodeMqMetaRsp error"); taosMemoryFreeClear(data); break; } - int32_t tLen = sizeof(SMqRspHead) + len; - void* tBuf = taosMemoryCalloc(1, tLen); + int32_t tLen = sizeof(SMqRspHead) + len; + void* tBuf = taosMemoryCalloc(1, tLen); + QUERY_CHECK_NULL(tBuf, code, lino, _end, TSDB_CODE_OUT_OF_MEMORY); + void* metaBuff = POINTER_SHIFT(tBuf, sizeof(SMqRspHead)); SEncoder encoder = {0}; tEncoderInit(&encoder, metaBuff, len); - code = tEncodeMqMetaRsp(&encoder, &tmpMetaRsp); - if (code < 0) { + int32_t tempLen = tEncodeMqMetaRsp(&encoder, &tmpMetaRsp); + if (tempLen < 0) { qError("tmqsnap tEncodeMqMetaRsp error"); tEncoderClear(&encoder); taosMemoryFreeClear(tBuf); @@ -3472,7 +3543,8 @@ static SSDataBlock* doRawScan(SOperatorInfo* pOperator) { QUERY_CHECK_NULL(tmp, code, lino, _end, TSDB_CODE_OUT_OF_MEMORY); } } - return NULL; + (*ppRes) = NULL; + return code; } _end: @@ -3481,7 +3553,14 @@ _end: pTaskInfo->code = code; T_LONG_JMP(pTaskInfo->env, code); } - return NULL; + (*ppRes) = NULL; + return code; +} + +static SSDataBlock* doRawScan(SOperatorInfo* pOperator) { + SSDataBlock* pRes = NULL; + int32_t code = doRawScanNext(pOperator, &pRes); + return pRes; } static void destroyRawScanOperatorInfo(void* param) { @@ -3571,6 +3650,7 @@ void streamScanReleaseState(SOperatorInfo* pOperator) { return; } if (!pInfo->pUpdateInfo) { + qDebug("stask:%s streamScanReleaseState cancel", GET_TASKID(pOperator->pTaskInfo)); return; } int32_t len = 0; @@ -3603,6 +3683,10 @@ void streamScanReloadState(SOperatorInfo* pOperator) { if (!pInfo->pState) { return; } + if (!pInfo->pUpdateInfo) { + qDebug("stask:%s streamScanReloadState cancel", GET_TASKID(pOperator->pTaskInfo)); + return; + } void* pBuff = NULL; int32_t len = 0; code = pInfo->stateStore.streamStateGetInfo(pInfo->pState, STREAM_SCAN_OP_STATE_NAME, @@ -4174,9 +4258,10 @@ _end: return code; } -static SSDataBlock* doTagScanFromCtbIdx(SOperatorInfo* pOperator) { +static int32_t doTagScanFromCtbIdxNext(SOperatorInfo* pOperator, SSDataBlock** ppRes) { if (pOperator->status == OP_EXEC_DONE) { - return NULL; + (*ppRes) = NULL; + return TSDB_CODE_SUCCESS; } int32_t code = TSDB_CODE_SUCCESS; int32_t lino = 0; @@ -4263,12 +4348,21 @@ _end: T_LONG_JMP(pTaskInfo->env, code); } pOperator->resultInfo.totalRows += pRes->info.rows; - return (pRes->info.rows == 0) ? NULL : pInfo->pRes; + (*ppRes) = (pRes->info.rows == 0) ? NULL : pInfo->pRes; + return code; } -static SSDataBlock* doTagScanFromMetaEntry(SOperatorInfo* pOperator) { +static SSDataBlock* doTagScanFromCtbIdx(SOperatorInfo* pOperator) { + SSDataBlock* pRes = NULL; + int32_t code = doTagScanFromCtbIdxNext(pOperator, &pRes); + return pRes; +} + +static int32_t doTagScanFromMetaEntryNext(SOperatorInfo* pOperator, SSDataBlock** ppRes) { + int32_t code = TSDB_CODE_SUCCESS; if (pOperator->status == OP_EXEC_DONE) { - return NULL; + (*ppRes) = NULL; + return code; } SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo; @@ -4282,7 +4376,8 @@ static SSDataBlock* doTagScanFromMetaEntry(SOperatorInfo* pOperator) { int32_t size = tableListGetSize(pInfo->pTableListInfo); if (size == 0) { setTaskStatus(pTaskInfo, TASK_COMPLETED); - return NULL; + (*ppRes) = NULL; + return code; } char str[512] = {0}; @@ -4311,7 +4406,14 @@ static SSDataBlock* doTagScanFromMetaEntry(SOperatorInfo* pOperator) { pOperator->resultInfo.totalRows += pRes->info.rows; - return (pRes->info.rows == 0) ? NULL : pInfo->pRes; + (*ppRes) = (pRes->info.rows == 0) ? NULL : pInfo->pRes; + return code; +} + +static SSDataBlock* doTagScanFromMetaEntry(SOperatorInfo* pOperator) { + SSDataBlock* pRes = NULL; + int32_t code = doTagScanFromMetaEntryNext(pOperator, &pRes); + return pRes; } static void destroyTagScanOperatorInfo(void* param) { @@ -4844,9 +4946,10 @@ static void stopSubTablesTableMergeScan(STableMergeScanInfo* pInfo) { } } -SSDataBlock* doTableMergeScanParaSubTables(SOperatorInfo* pOperator) { +int32_t doTableMergeScanParaSubTablesNext(SOperatorInfo* pOperator, SSDataBlock** ppRes) { if (pOperator->status == OP_EXEC_DONE) { - return NULL; + (*ppRes) = NULL; + return TSDB_CODE_SUCCESS; } SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo; @@ -4866,7 +4969,8 @@ SSDataBlock* doTableMergeScanParaSubTables(SOperatorInfo* pOperator) { if (tableListSize == 0) { setOperatorCompleted(pOperator); - return NULL; + (*ppRes) = NULL; + return code; } pInfo->tableStartIndex = 0; pInfo->groupId = ((STableKeyInfo*)tableListGetInfo(pInfo->base.pTableListInfo, pInfo->tableStartIndex))->groupId; @@ -4914,7 +5018,14 @@ _end: pTaskInfo->code = code; T_LONG_JMP(pTaskInfo->env, code); } - return pBlock; + (*ppRes) = pBlock; + return code; +} + +static SSDataBlock* doTableMergeScanParaSubTables(SOperatorInfo* pOperator) { + SSDataBlock* pRes = NULL; + int32_t code = doTableMergeScanParaSubTablesNext(pOperator, &pRes); + return pRes; } static void tableMergeScanDoSkipTable(uint64_t uid, void* pTableMergeOpInfo) { @@ -5307,18 +5418,19 @@ SSDataBlock* getSortedTableMergeScanBlockData(SSortHandle* pHandle, SSDataBlock* return (pResBlock->info.rows > 0) ? pResBlock : NULL; } -SSDataBlock* doTableMergeScan(SOperatorInfo* pOperator) { +int32_t doTableMergeScanNext(SOperatorInfo* pOperator, SSDataBlock** ppRes) { if (pOperator->status == OP_EXEC_DONE) { - return NULL; + (*ppRes) = NULL; + return TSDB_CODE_SUCCESS; } + int32_t code = TSDB_CODE_SUCCESS; + int32_t lino = 0; SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo; STableMergeScanInfo* pInfo = pOperator->info; - int32_t code = pOperator->fpSet._openFn(pOperator); - if (code != TSDB_CODE_SUCCESS) { - T_LONG_JMP(pTaskInfo->env, code); - } + code = pOperator->fpSet._openFn(pOperator); + QUERY_CHECK_CODE(code, lino, _end); int64_t st = taosGetTimestampUs(); @@ -5328,7 +5440,8 @@ SSDataBlock* doTableMergeScan(SOperatorInfo* pOperator) { if (tableListSize == 0) { setOperatorCompleted(pOperator); - return NULL; + (*ppRes) = NULL; + return code; } pInfo->tableStartIndex = 0; pInfo->groupId = ((STableKeyInfo*)tableListGetInfo(pInfo->base.pTableListInfo, pInfo->tableStartIndex))->groupId; @@ -5356,9 +5469,7 @@ SSDataBlock* doTableMergeScan(SOperatorInfo* pOperator) { if (pInfo->bNewFilesetEvent) { stopDurationForGroupTableMergeScan(pOperator); code = startDurationForGroupTableMergeScan(pOperator); - if (code != TSDB_CODE_SUCCESS) { - T_LONG_JMP(pTaskInfo->env, terrno); - } + QUERY_CHECK_CODE(code, lino, _end); } else { // Data of this group are all dumped, let's try the next group stopGroupTableMergeScan(pOperator); @@ -5377,7 +5488,20 @@ SSDataBlock* doTableMergeScan(SOperatorInfo* pOperator) { pOperator->cost.totalCost += (taosGetTimestampUs() - st) / 1000.0; - return pBlock; +_end: + if (code != TSDB_CODE_SUCCESS) { + qError("%s failed at line %d since %s", __func__, lino, tstrerror(code)); + pTaskInfo->code = code; + T_LONG_JMP(pTaskInfo->env, code); + } + (*ppRes) = pBlock; + return code; +} + +static SSDataBlock* doTableMergeScan(SOperatorInfo* pOperator) { + SSDataBlock* pRes = NULL; + int32_t code = doTableMergeScanNext(pOperator, &pRes); + return pRes; } void destroyTableMergeScanOperatorInfo(void* param) { @@ -5836,7 +5960,8 @@ _end: } } -static SSDataBlock* doTableCountScan(SOperatorInfo* pOperator) { +static int32_t doTableCountScanNext(SOperatorInfo* pOperator, SSDataBlock** ppRes) { + int32_t code = TSDB_CODE_SUCCESS; SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo; STableCountScanOperatorInfo* pInfo = pOperator->info; STableCountScanSupp* pSupp = &pInfo->supp; @@ -5844,13 +5969,22 @@ static SSDataBlock* doTableCountScan(SOperatorInfo* pOperator) { blockDataCleanup(pRes); if (pOperator->status == OP_EXEC_DONE) { - return NULL; + (*ppRes) = NULL; + return code; } if (pInfo->readHandle.mnd != NULL) { - return buildSysDbTableCount(pOperator, pInfo); + (*ppRes) = buildSysDbTableCount(pOperator, pInfo); + return code; } - return buildVnodeDbTableCount(pOperator, pInfo, pSupp, pRes); + (*ppRes) = buildVnodeDbTableCount(pOperator, pInfo, pSupp, pRes); + return code; +} + +static SSDataBlock* doTableCountScan(SOperatorInfo* pOperator) { + SSDataBlock* pRes = NULL; + int32_t code = doTableCountScanNext(pOperator, &pRes); + return pRes; } static SSDataBlock* buildVnodeDbTableCount(SOperatorInfo* pOperator, STableCountScanOperatorInfo* pInfo, diff --git a/source/libs/executor/src/streamcountwindowoperator.c b/source/libs/executor/src/streamcountwindowoperator.c index d8ad026c6c..41a5a3505c 100644 --- a/source/libs/executor/src/streamcountwindowoperator.c +++ b/source/libs/executor/src/streamcountwindowoperator.c @@ -357,12 +357,13 @@ static void doStreamCountAggImpl(SOperatorInfo* pOperator, SSDataBlock* pSDataBl _end: if (code != TSDB_CODE_SUCCESS) { - qError("%s failed at line %d since %s", __func__, lino, tstrerror(code)); + qError("%s failed at line %d since %s. task:%s", __func__, lino, tstrerror(code), GET_TASKID(pTaskInfo)); } destroySBuffInfo(pAggSup, &buffInfo); } -static SSDataBlock* buildCountResult(SOperatorInfo* pOperator) { +static int32_t buildCountResult(SOperatorInfo* pOperator, SSDataBlock** ppRes) { + int32_t code = TSDB_CODE_SUCCESS; SStreamCountAggOperatorInfo* pInfo = pOperator->info; SStreamAggSupporter* pAggSup = &pInfo->streamAggSup; SOptrBasicInfo* pBInfo = &pInfo->binfo; @@ -370,15 +371,18 @@ static SSDataBlock* buildCountResult(SOperatorInfo* pOperator) { doBuildDeleteDataBlock(pOperator, pInfo->pStDeleted, pInfo->pDelRes, &pInfo->pDelIterator); if (pInfo->pDelRes->info.rows > 0) { printDataBlock(pInfo->pDelRes, getStreamOpName(pOperator->operatorType), GET_TASKID(pTaskInfo)); - return pInfo->pDelRes; + (*ppRes) = pInfo->pDelRes; + return code; } doBuildSessionResult(pOperator, pAggSup->pState, &pInfo->groupResInfo, pBInfo->pRes); if (pBInfo->pRes->info.rows > 0) { printDataBlock(pBInfo->pRes, getStreamOpName(pOperator->operatorType), GET_TASKID(pTaskInfo)); - return pBInfo->pRes; + (*ppRes) = pBInfo->pRes; + return code; } - return NULL; + (*ppRes) = NULL; + return code; } int32_t doStreamCountEncodeOpState(void** buf, int32_t len, SOperatorInfo* pOperator, bool isParent) { @@ -425,6 +429,7 @@ int32_t doStreamCountDecodeOpState(void* buf, int32_t len, SOperatorInfo* pOpera int32_t code = TSDB_CODE_SUCCESS; int32_t lino = 0; SStreamCountAggOperatorInfo* pInfo = pOperator->info; + SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo; if (!pInfo) { code = TSDB_CODE_FAILED; QUERY_CHECK_CODE(code, lino, _end); @@ -465,7 +470,7 @@ int32_t doStreamCountDecodeOpState(void* buf, int32_t len, SOperatorInfo* pOpera _end: if (code != TSDB_CODE_SUCCESS) { - qError("%s failed at line %d since %s", __func__, lino, tstrerror(code)); + qError("%s failed at line %d since %s. task:%s", __func__, lino, tstrerror(code), GET_TASKID(pTaskInfo)); } return code; } @@ -475,6 +480,7 @@ void doStreamCountSaveCheckpoint(SOperatorInfo* pOperator) { int32_t lino = 0; void* pBuf = NULL; SStreamCountAggOperatorInfo* pInfo = pOperator->info; + SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo; if (needSaveStreamOperatorInfo(&pInfo->basic)) { int32_t len = doStreamCountEncodeOpState(NULL, 0, pOperator, true); pBuf = taosMemoryCalloc(1, len); @@ -492,7 +498,7 @@ void doStreamCountSaveCheckpoint(SOperatorInfo* pOperator) { _end: taosMemoryFreeClear(pBuf); if (code != TSDB_CODE_SUCCESS) { - qError("%s failed at line %d since %s", __func__, lino, tstrerror(code)); + qError("%s failed at line %d since %s. task:%s", __func__, lino, tstrerror(code), GET_TASKID(pTaskInfo)); } } @@ -604,7 +610,7 @@ _end: return code; } -static SSDataBlock* doStreamCountAgg(SOperatorInfo* pOperator) { +static int32_t doStreamCountAggNext(SOperatorInfo* pOperator, SSDataBlock** ppRes) { int32_t code = TSDB_CODE_SUCCESS; int32_t lino = 0; SExprSupp* pSup = &pOperator->exprSupp; @@ -614,11 +620,15 @@ static SSDataBlock* doStreamCountAgg(SOperatorInfo* pOperator) { SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo; qDebug("stask:%s %s status: %d", GET_TASKID(pTaskInfo), getStreamOpName(pOperator->operatorType), pOperator->status); if (pOperator->status == OP_EXEC_DONE) { - return NULL; + (*ppRes) = NULL; + return code; } else if (pOperator->status == OP_RES_TO_RETURN) { - SSDataBlock* opRes = buildCountResult(pOperator); + SSDataBlock* opRes = NULL; + code = buildCountResult(pOperator, &opRes); + QUERY_CHECK_CODE(code, lino, _end); if (opRes) { - return opRes; + (*ppRes) = opRes; + return code; } if (pInfo->recvGetAll) { @@ -629,11 +639,13 @@ static SSDataBlock* doStreamCountAgg(SOperatorInfo* pOperator) { if (pInfo->reCkBlock) { pInfo->reCkBlock = false; printDataBlock(pInfo->pCheckpointRes, getStreamOpName(pOperator->operatorType), GET_TASKID(pTaskInfo)); - return pInfo->pCheckpointRes; + (*ppRes) = pInfo->pCheckpointRes; + return code; } setStreamOperatorCompleted(pOperator); - return NULL; + (*ppRes) = NULL; + return code; } SOperatorInfo* downstream = pOperator->pDownstream[0]; @@ -667,7 +679,8 @@ static SSDataBlock* doStreamCountAgg(SOperatorInfo* pOperator) { QUERY_CHECK_CODE(code, lino, _end); continue; } else if (pBlock->info.type == STREAM_CREATE_CHILD_TABLE) { - return pBlock; + (*ppRes) = pBlock; + return code; } else if (pBlock->info.type == STREAM_CHECKPOINT) { pAggSup->stateStore.streamStateCommit(pAggSup->pState); doStreamCountSaveCheckpoint(pOperator); @@ -710,29 +723,39 @@ static SSDataBlock* doStreamCountAgg(SOperatorInfo* pOperator) { QUERY_CHECK_CODE(code, lino, _end); } - SSDataBlock* opRes = buildCountResult(pOperator); + SSDataBlock* opRes = NULL; + code = buildCountResult(pOperator, &opRes); + QUERY_CHECK_CODE(code, lino, _end); if (opRes) { - return opRes; + (*ppRes) = opRes; + return code; } _end: if (code != TSDB_CODE_SUCCESS) { - qError("%s failed at line %d since %s", __func__, lino, tstrerror(code)); + pTaskInfo->code = code; + qError("%s failed at line %d since %s. task:%s", __func__, lino, tstrerror(code), GET_TASKID(pTaskInfo)); } setStreamOperatorCompleted(pOperator); - return NULL; + (*ppRes) = NULL; + return code; +} + +static SSDataBlock* doStreamCountAgg(SOperatorInfo* pOperator) { + SSDataBlock* pRes = NULL; + int32_t code = doStreamCountAggNext(pOperator, &pRes); + return pRes; } void streamCountReleaseState(SOperatorInfo* pOperator) { int32_t code = TSDB_CODE_SUCCESS; int32_t lino = 0; SStreamEventAggOperatorInfo* pInfo = pOperator->info; + SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo; int32_t resSize = sizeof(TSKEY); char* pBuff = taosMemoryCalloc(1, resSize); - if (pBuff) { - code = terrno; - QUERY_CHECK_CODE(code, lino, _end); - } + QUERY_CHECK_NULL(pBuff, code, lino, _end, TSDB_CODE_OUT_OF_MEMORY); + memcpy(pBuff, &pInfo->twAggSup.maxTs, sizeof(TSKEY)); qDebug("===stream=== count window operator relase state. "); pInfo->streamAggSup.stateStore.streamStateSaveInfo(pInfo->streamAggSup.pState, STREAM_COUNT_OP_STATE_NAME, @@ -745,7 +768,8 @@ void streamCountReleaseState(SOperatorInfo* pOperator) { } _end: if (code != TSDB_CODE_SUCCESS) { - qError("%s failed at line %d since %s", __func__, lino, tstrerror(code)); + terrno = code; + qError("%s failed at line %d since %s. task:%s", __func__, lino, tstrerror(code), GET_TASKID(pTaskInfo)); } } @@ -753,6 +777,7 @@ void streamCountReloadState(SOperatorInfo* pOperator) { int32_t code = TSDB_CODE_SUCCESS; int32_t lino = 0; SStreamCountAggOperatorInfo* pInfo = pOperator->info; + SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo; SStreamAggSupporter* pAggSup = &pInfo->streamAggSup; int32_t size = 0; void* pBuf = NULL; @@ -773,7 +798,8 @@ void streamCountReloadState(SOperatorInfo* pOperator) { _end: if (code != TSDB_CODE_SUCCESS) { - qError("%s failed at line %d since %s", __func__, lino, tstrerror(code)); + terrno = code; + qError("%s failed at line %d since %s. task:%s", __func__, lino, tstrerror(code), GET_TASKID(pTaskInfo)); } } @@ -882,6 +908,6 @@ _error: taosMemoryFreeClear(pOperator); pTaskInfo->code = code; - qError("%s failed at line %d since %s", __func__, lino, tstrerror(code)); + qError("%s failed at line %d since %s. task:%s", __func__, lino, tstrerror(code), GET_TASKID(pTaskInfo)); return NULL; } diff --git a/source/libs/executor/src/streameventwindowoperator.c b/source/libs/executor/src/streameventwindowoperator.c index 3f1887b1ae..728ac317d4 100644 --- a/source/libs/executor/src/streameventwindowoperator.c +++ b/source/libs/executor/src/streameventwindowoperator.c @@ -285,7 +285,7 @@ static int32_t compactEventWindow(SOperatorInfo* pOperator, SEventWindowInfo* pC _end: if (code != TSDB_CODE_SUCCESS) { - qError("%s failed at line %d since %s", __func__, lino, tstrerror(code)); + qError("%s failed at line %d since %s. task:%s", __func__, lino, tstrerror(code), GET_TASKID(pTaskInfo)); } return code; } @@ -382,8 +382,8 @@ static void doStreamEventAggImpl(SOperatorInfo* pOperator, SSDataBlock* pSDataBl &curWin.winInfo.sessionWin.win.ekey, &uid, &groupId, NULL); QUERY_CHECK_CODE(code, lino, _end); - code = tSimpleHashRemove(pSeUpdated, &curWin.winInfo.sessionWin, sizeof(SSessionKey)); - QUERY_CHECK_CODE(code, lino, _end); + int32_t tmpRes = tSimpleHashRemove(pSeUpdated, &curWin.winInfo.sessionWin, sizeof(SSessionKey)); + qTrace("%s at line %d res:%d", __func__, __LINE__, tmpRes); doDeleteEventWindow(pAggSup, pSeUpdated, &curWin.winInfo.sessionWin); if (pInfo->destHasPrimaryKey && curWin.winInfo.isOutput && IS_NORMAL_EVENT_OP(pOperator) && @@ -444,7 +444,7 @@ _end: colDataDestroy(pColEnd); taosMemoryFree(pColEnd); if (code != TSDB_CODE_SUCCESS) { - qError("%s failed at line %d since %s", __func__, lino, tstrerror(code)); + qError("%s failed at line %d since %s. task:%s", __func__, lino, tstrerror(code), GET_TASKID(pTaskInfo)); } } @@ -490,6 +490,7 @@ int32_t doStreamEventDecodeOpState(void* buf, int32_t len, SOperatorInfo* pOpera int32_t code = TSDB_CODE_SUCCESS; int32_t lino = 0; SStreamEventAggOperatorInfo* pInfo = pOperator->info; + SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo; if (!pInfo) { code = TSDB_CODE_FAILED; QUERY_CHECK_CODE(code, lino, _end); @@ -532,7 +533,7 @@ int32_t doStreamEventDecodeOpState(void* buf, int32_t len, SOperatorInfo* pOpera _end: if (code != TSDB_CODE_SUCCESS) { - qError("%s failed at line %d since %s", __func__, lino, tstrerror(code)); + qError("%s failed at line %d since %s. task:%s", __func__, lino, tstrerror(code), GET_TASKID(pTaskInfo)); } return code; } @@ -555,7 +556,8 @@ void doStreamEventSaveCheckpoint(SOperatorInfo* pOperator) { } } -static SSDataBlock* buildEventResult(SOperatorInfo* pOperator) { +static int32_t buildEventResult(SOperatorInfo* pOperator, SSDataBlock** ppRes) { + int32_t code = TSDB_CODE_SUCCESS; SStreamEventAggOperatorInfo* pInfo = pOperator->info; SOptrBasicInfo* pBInfo = &pInfo->binfo; SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo; @@ -563,20 +565,24 @@ static SSDataBlock* buildEventResult(SOperatorInfo* pOperator) { doBuildDeleteDataBlock(pOperator, pInfo->pSeDeleted, pInfo->pDelRes, &pInfo->pDelIterator); if (pInfo->pDelRes->info.rows > 0) { printDataBlock(pInfo->pDelRes, getStreamOpName(pOperator->operatorType), GET_TASKID(pTaskInfo)); - return pInfo->pDelRes; + (*ppRes) = pInfo->pDelRes; + return code; } doBuildSessionResult(pOperator, pInfo->streamAggSup.pState, &pInfo->groupResInfo, pBInfo->pRes); if (pBInfo->pRes->info.rows > 0) { printDataBlock(pBInfo->pRes, getStreamOpName(pOperator->operatorType), GET_TASKID(pTaskInfo)); - return pBInfo->pRes; + (*ppRes) = pBInfo->pRes; + return code; } - return NULL; + (*ppRes) = NULL; + return code; } -static SSDataBlock* doStreamEventAgg(SOperatorInfo* pOperator) { +static int32_t doStreamEventAggNext(SOperatorInfo* pOperator, SSDataBlock** ppRes) { if (pOperator->status == OP_EXEC_DONE) { - return NULL; + (*ppRes) = NULL; + return TSDB_CODE_SUCCESS; } int32_t code = TSDB_CODE_SUCCESS; @@ -585,11 +591,14 @@ static SSDataBlock* doStreamEventAgg(SOperatorInfo* pOperator) { SStreamEventAggOperatorInfo* pInfo = pOperator->info; SOptrBasicInfo* pBInfo = &pInfo->binfo; SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo; - qDebug("===stream=== stream event agg"); + qDebug("===stream=== stream event agg. history task:%d, taskId:%s", pInfo->isHistoryOp, GET_TASKID(pTaskInfo)); if (pOperator->status == OP_RES_TO_RETURN) { - SSDataBlock* resBlock = buildEventResult(pOperator); + SSDataBlock* resBlock = NULL; + code = buildEventResult(pOperator, &resBlock); + QUERY_CHECK_CODE(code, lino, _end); if (resBlock != NULL) { - return resBlock; + (*ppRes) = resBlock; + return code; } if (pInfo->recvGetAll) { @@ -600,11 +609,13 @@ static SSDataBlock* doStreamEventAgg(SOperatorInfo* pOperator) { if (pInfo->reCkBlock) { pInfo->reCkBlock = false; printDataBlock(pInfo->pCheckpointRes, getStreamOpName(pOperator->operatorType), GET_TASKID(pTaskInfo)); - return pInfo->pCheckpointRes; + (*ppRes) = pInfo->pCheckpointRes; + return code; } setStreamOperatorCompleted(pOperator); - return NULL; + (*ppRes) = NULL; + return code; } SOperatorInfo* downstream = pOperator->pDownstream[0]; @@ -636,7 +647,8 @@ static SSDataBlock* doStreamEventAgg(SOperatorInfo* pOperator) { QUERY_CHECK_CODE(code, lino, _end); continue; } else if (pBlock->info.type == STREAM_CREATE_CHILD_TABLE) { - return pBlock; + (*ppRes) = pBlock; + return code; } else if (pBlock->info.type == STREAM_CHECKPOINT) { pInfo->streamAggSup.stateStore.streamStateCommit(pInfo->streamAggSup.pState); doStreamEventSaveCheckpoint(pOperator); @@ -680,6 +692,10 @@ static SSDataBlock* doStreamEventAgg(SOperatorInfo* pOperator) { code = copyUpdateResult(&pInfo->pAllUpdated, pHisWins, sessionKeyCompareAsc); QUERY_CHECK_CODE(code, lino, _end); + _hash_fn_t hashFn = taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY); + pInfo->pAllUpdated = tSimpleHashInit(64, hashFn); + QUERY_CHECK_NULL(pInfo->pAllUpdated, code, lino, _end, TSDB_CODE_OUT_OF_MEMORY); + code = getMaxTsWins(pHisWins, pInfo->historyWins); QUERY_CHECK_CODE(code, lino, _end); @@ -695,17 +711,28 @@ static SSDataBlock* doStreamEventAgg(SOperatorInfo* pOperator) { code = blockDataEnsureCapacity(pInfo->binfo.pRes, pOperator->resultInfo.capacity); QUERY_CHECK_CODE(code, lino, _end); - SSDataBlock* resBlock = buildEventResult(pOperator); + SSDataBlock* resBlock = NULL; + code = buildEventResult(pOperator, &resBlock); + QUERY_CHECK_CODE(code, lino, _end); if (resBlock != NULL) { - return resBlock; + (*ppRes) = resBlock; + return code; } _end: if (code != TSDB_CODE_SUCCESS) { - qError("%s failed at line %d since %s", __func__, lino, tstrerror(code)); + pTaskInfo->code = code; + qError("%s failed at line %d since %s. task:%s", __func__, lino, tstrerror(code), GET_TASKID(pTaskInfo)); } setStreamOperatorCompleted(pOperator); - return NULL; + (*ppRes) = NULL; + return code; +} + +static SSDataBlock* doStreamEventAgg(SOperatorInfo* pOperator) { + SSDataBlock* pRes = NULL; + int32_t code = doStreamEventAggNext(pOperator, &pRes); + return pRes; } void streamEventReleaseState(SOperatorInfo* pOperator) { @@ -733,6 +760,7 @@ void streamEventReloadState(SOperatorInfo* pOperator) { int32_t lino = 0; SStreamEventAggOperatorInfo* pInfo = pOperator->info; SStreamAggSupporter* pAggSup = &pInfo->streamAggSup; + SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo; resetWinRange(&pAggSup->winRange); SSessionKey seKey = {.win.skey = INT64_MIN, .win.ekey = INT64_MIN, .groupId = 0}; @@ -816,7 +844,7 @@ void streamEventReloadState(SOperatorInfo* pOperator) { _end: if (code != TSDB_CODE_SUCCESS) { - qError("%s failed at line %d since %s", __func__, lino, tstrerror(code)); + qError("%s failed at line %d since %s. task:%s", __func__, lino, tstrerror(code), GET_TASKID(pTaskInfo)); } } @@ -937,6 +965,6 @@ _error: destroyStreamEventOperatorInfo(pInfo); taosMemoryFreeClear(pOperator); pTaskInfo->code = code; - qError("%s failed at line %d since %s", __func__, lino, tstrerror(code)); + qError("%s failed at line %d since %s. task:%s", __func__, lino, tstrerror(code), GET_TASKID(pTaskInfo)); return NULL; } diff --git a/source/libs/executor/src/streamfilloperator.c b/source/libs/executor/src/streamfilloperator.c index bd254c5e5a..335bfd286c 100644 --- a/source/libs/executor/src/streamfilloperator.c +++ b/source/libs/executor/src/streamfilloperator.c @@ -563,8 +563,7 @@ static void doStreamFillLinear(SStreamFillSupporter* pFillSup, SStreamFillInfo* code = checkResult(pFillSup, pFillInfo->current, groupId, &ckRes); QUERY_CHECK_CODE(code, lino, _end); - if ((pFillSup->hasDelete && !ckRes) || - !inWinRange(&pFillSup->winRange, &st)) { + if ((pFillSup->hasDelete && !ckRes) || !inWinRange(&pFillSup->winRange, &st)) { pFillInfo->current = taosTimeAdd(pFillInfo->current, pFillSup->interval.sliding, pFillSup->interval.slidingUnit, pFillSup->interval.precision); pFillInfo->pLinearInfo->winIndex++; @@ -743,7 +742,7 @@ static void doStreamFillImpl(SOperatorInfo* pOperator) { _end: if (code != TSDB_CODE_SUCCESS) { - qError("%s failed at line %d since %s", __func__, lino, tstrerror(code)); + qError("%s failed at line %d since %s. task:%s", __func__, lino, tstrerror(code), GET_TASKID(pTaskInfo)); } } @@ -752,6 +751,7 @@ static int32_t buildDeleteRange(SOperatorInfo* pOp, TSKEY start, TSKEY end, uint int32_t lino = 0; SStorageAPI* pAPI = &pOp->pTaskInfo->storageAPI; void* pState = pOp->pTaskInfo->streamInfo.pState; + SExecTaskInfo* pTaskInfo = pOp->pTaskInfo; SSDataBlock* pBlock = delRes; SColumnInfoData* pStartCol = taosArrayGet(pBlock->pDataBlock, START_TS_COLUMN_INDEX); SColumnInfoData* pEndCol = taosArrayGet(pBlock->pDataBlock, END_TS_COLUMN_INDEX); @@ -794,7 +794,7 @@ static int32_t buildDeleteRange(SOperatorInfo* pOp, TSKEY start, TSKEY end, uint _end: if (code != TSDB_CODE_SUCCESS) { - qError("%s failed at line %d since %s", __func__, lino, tstrerror(code)); + qError("%s failed at line %d since %s. task:%s", __func__, lino, tstrerror(code), GET_TASKID(pTaskInfo)); } return code; } @@ -805,6 +805,7 @@ static int32_t buildDeleteResult(SOperatorInfo* pOperator, TSKEY startTs, TSKEY int32_t lino = 0; SStreamFillOperatorInfo* pInfo = pOperator->info; SStreamFillSupporter* pFillSup = pInfo->pFillSup; + SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo; if (hasPrevWindow(pFillSup)) { TSKEY start = getNextWindowTs(pFillSup->prev.key, &pFillSup->interval); code = buildDeleteRange(pOperator, start, endTs, groupId, delRes); @@ -820,7 +821,7 @@ static int32_t buildDeleteResult(SOperatorInfo* pOperator, TSKEY startTs, TSKEY _end: if (code != TSDB_CODE_SUCCESS) { - qError("%s failed at line %d since %s", __func__, lino, tstrerror(code)); + qError("%s failed at line %d since %s. task:%s", __func__, lino, tstrerror(code), GET_TASKID(pTaskInfo)); } return code; } @@ -830,6 +831,7 @@ static int32_t doDeleteFillResultImpl(SOperatorInfo* pOperator, TSKEY startTs, T int32_t lino = 0; SStorageAPI* pAPI = &pOperator->pTaskInfo->storageAPI; SStreamFillOperatorInfo* pInfo = pOperator->info; + SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo; getWindowFromDiscBuf(pOperator, startTs, groupId, pInfo->pFillSup); setDeleteFillValueInfo(startTs, endTs, pInfo->pFillSup, pInfo->pFillInfo); SWinKey key = {.ts = startTs, .groupId = groupId}; @@ -852,7 +854,7 @@ static int32_t doDeleteFillResultImpl(SOperatorInfo* pOperator, TSKEY startTs, T _end: if (code != TSDB_CODE_SUCCESS) { - qError("%s failed at line %d since %s", __func__, lino, tstrerror(code)); + qError("%s failed at line %d since %s. task:%s", __func__, lino, tstrerror(code), GET_TASKID(pTaskInfo)); } return code; } @@ -911,6 +913,7 @@ static int32_t doDeleteFillResult(SOperatorInfo* pOperator) { SStreamFillOperatorInfo* pInfo = pOperator->info; SStreamFillInfo* pFillInfo = pInfo->pFillInfo; SSDataBlock* pBlock = pInfo->pSrcDelBlock; + SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo; SColumnInfoData* pStartCol = taosArrayGet(pBlock->pDataBlock, START_TS_COLUMN_INDEX); TSKEY* tsStarts = (TSKEY*)pStartCol->pData; @@ -967,7 +970,7 @@ static int32_t doDeleteFillResult(SOperatorInfo* pOperator) { _end: if (code != TSDB_CODE_SUCCESS) { - qError("%s failed at line %d since %s", __func__, lino, tstrerror(code)); + qError("%s failed at line %d since %s. task:%s", __func__, lino, tstrerror(code), GET_TASKID(pTaskInfo)); } return code; } @@ -985,6 +988,7 @@ static int32_t doApplyStreamScalarCalculation(SOperatorInfo* pOperator, SSDataBl int32_t lino = 0; SStreamFillOperatorInfo* pInfo = pOperator->info; SExprSupp* pSup = &pOperator->exprSupp; + SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo; blockDataCleanup(pDstBlock); code = blockDataEnsureCapacity(pDstBlock, pSrcBlock->info.rows); @@ -1008,19 +1012,20 @@ static int32_t doApplyStreamScalarCalculation(SOperatorInfo* pOperator, SSDataBl _end: if (code != TSDB_CODE_SUCCESS) { - qError("%s failed at line %d since %s", __func__, lino, tstrerror(code)); + qError("%s failed at line %d since %s. task:%s", __func__, lino, tstrerror(code), GET_TASKID(pTaskInfo)); } return code; } -static SSDataBlock* doStreamFill(SOperatorInfo* pOperator) { +static int32_t doStreamFillNext(SOperatorInfo* pOperator, SSDataBlock** ppRes) { int32_t code = TSDB_CODE_SUCCESS; int32_t lino = 0; SStreamFillOperatorInfo* pInfo = pOperator->info; SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo; if (pOperator->status == OP_EXEC_DONE) { - return NULL; + (*ppRes) = NULL; + return code; } blockDataCleanup(pInfo->pRes); if (hasRemainCalc(pInfo->pFillInfo) || @@ -1028,18 +1033,21 @@ static SSDataBlock* doStreamFill(SOperatorInfo* pOperator) { doStreamFillRange(pInfo->pFillInfo, pInfo->pFillSup, pInfo->pRes); if (pInfo->pRes->info.rows > 0) { printDataBlock(pInfo->pRes, getStreamOpName(pOperator->operatorType), GET_TASKID(pTaskInfo)); - return pInfo->pRes; + (*ppRes) = pInfo->pRes; + return code; } } if (pOperator->status == OP_RES_TO_RETURN) { doDeleteFillFinalize(pOperator); if (pInfo->pRes->info.rows > 0) { printDataBlock(pInfo->pRes, getStreamOpName(pOperator->operatorType), GET_TASKID(pTaskInfo)); - return pInfo->pRes; + (*ppRes) = pInfo->pRes; + return code; } setOperatorCompleted(pOperator); resetStreamFillInfo(pInfo); - return NULL; + (*ppRes) = NULL; + return code; } SSDataBlock* fillResult = NULL; @@ -1053,7 +1061,8 @@ static SSDataBlock* doStreamFill(SOperatorInfo* pOperator) { pInfo->pFillInfo->preRowKey = INT64_MIN; if (pInfo->pRes->info.rows > 0) { printDataBlock(pInfo->pRes, getStreamOpName(pOperator->operatorType), GET_TASKID(pTaskInfo)); - return pInfo->pRes; + (*ppRes) = pInfo->pRes; + return code; } break; } @@ -1071,7 +1080,8 @@ static SSDataBlock* doStreamFill(SOperatorInfo* pOperator) { switch (pBlock->info.type) { case STREAM_RETRIEVE: - return pBlock; + (*ppRes) = pBlock; + return code; case STREAM_DELETE_RESULT: { pInfo->pSrcDelBlock = pBlock; pInfo->srcDelRowIndex = 0; @@ -1082,7 +1092,8 @@ static SSDataBlock* doStreamFill(SOperatorInfo* pOperator) { if (pInfo->pDelRes->info.rows > 0) { printDataBlock(pInfo->pDelRes, getStreamOpName(pOperator->operatorType), GET_TASKID(pTaskInfo)); - return pInfo->pDelRes; + (*ppRes) = pInfo->pDelRes; + return code; } continue; } break; @@ -1097,7 +1108,8 @@ static SSDataBlock* doStreamFill(SOperatorInfo* pOperator) { } break; case STREAM_CHECKPOINT: case STREAM_CREATE_CHILD_TABLE: { - return pBlock; + (*ppRes) = pBlock; + return code; } break; default: ASSERTS(false, "invalid SSDataBlock type"); @@ -1121,20 +1133,30 @@ static SSDataBlock* doStreamFill(SOperatorInfo* pOperator) { if (pInfo->pRes->info.rows == 0) { setOperatorCompleted(pOperator); resetStreamFillInfo(pInfo); - return NULL; + (*ppRes) = NULL; + return code; } pOperator->resultInfo.totalRows += pInfo->pRes->info.rows; printDataBlock(pInfo->pRes, getStreamOpName(pOperator->operatorType), GET_TASKID(pTaskInfo)); - return pInfo->pRes; + (*ppRes) = pInfo->pRes; + return code; _end: if (code != TSDB_CODE_SUCCESS) { - qError("%s failed at line %d since %s", __func__, lino, tstrerror(code)); + pTaskInfo->code = code; + qError("%s failed at line %d since %s. task:%s", __func__, lino, tstrerror(code), GET_TASKID(pTaskInfo)); } setOperatorCompleted(pOperator); resetStreamFillInfo(pInfo); - return NULL; + (*ppRes) = NULL; + return code; +} + +static SSDataBlock* doStreamFill(SOperatorInfo* pOperator) { + SSDataBlock* pRes = NULL; + int32_t code = doStreamFillNext(pOperator, &pRes); + return pRes; } static int32_t initResultBuf(SStreamFillSupporter* pFillSup) { @@ -1406,7 +1428,7 @@ SOperatorInfo* createStreamFillOperatorInfo(SOperatorInfo* downstream, SStreamFi _error: if (code != TSDB_CODE_SUCCESS) { - qError("%s failed at line %d since %s", __func__, lino, tstrerror(code)); + qError("%s failed at line %d since %s. task:%s", __func__, lino, tstrerror(code), GET_TASKID(pTaskInfo)); } destroyStreamFillOperatorInfo(pInfo); taosMemoryFreeClear(pOperator); diff --git a/source/libs/executor/src/streamtimewindowoperator.c b/source/libs/executor/src/streamtimewindowoperator.c index 85cbe8f519..5aa7cac45d 100644 --- a/source/libs/executor/src/streamtimewindowoperator.c +++ b/source/libs/executor/src/streamtimewindowoperator.c @@ -236,6 +236,7 @@ static int32_t doDeleteWindows(SOperatorInfo* pOperator, SInterval* pInterval, S int32_t code = TSDB_CODE_SUCCESS; int32_t lino = 0; SStreamIntervalOperatorInfo* pInfo = pOperator->info; + SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo; SColumnInfoData* pStartTsCol = taosArrayGet(pBlock->pDataBlock, START_TS_COLUMN_INDEX); TSKEY* startTsCols = (TSKEY*)pStartTsCol->pData; SColumnInfoData* pEndTsCol = taosArrayGet(pBlock->pDataBlock, END_TS_COLUMN_INDEX); @@ -301,7 +302,7 @@ static int32_t doDeleteWindows(SOperatorInfo* pOperator, SInterval* pInterval, S } _end: if (code != TSDB_CODE_SUCCESS) { - qError("%s failed at line %d since %s", __func__, lino, tstrerror(code)); + qError("%s failed at line %d since %s. task:%s", __func__, lino, tstrerror(code), GET_TASKID(pTaskInfo)); } return code; } @@ -335,6 +336,7 @@ static int32_t closeStreamIntervalWindow(SSHashObj* pHashMap, STimeWindowAggSupp void* pIte = NULL; int32_t iter = 0; SStreamIntervalOperatorInfo* pInfo = pOperator->info; + SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo; int32_t delSize = taosArrayGetSize(pDelWins); while ((pIte = tSimpleHashIterate(pHashMap, pIte, &iter)) != NULL) { void* key = tSimpleHashGetKey(pIte, NULL); @@ -376,7 +378,7 @@ static int32_t closeStreamIntervalWindow(SSHashObj* pHashMap, STimeWindowAggSupp _end: if (code != TSDB_CODE_SUCCESS) { - qError("%s failed at line %d since %s", __func__, lino, tstrerror(code)); + qError("%s failed at line %d since %s. task:%s", __func__, lino, tstrerror(code), GET_TASKID(pTaskInfo)); } return code; } @@ -517,9 +519,10 @@ void reloadFromDownStream(SOperatorInfo* downstream, SStreamIntervalOperatorInfo } int32_t initIntervalDownStream(SOperatorInfo* downstream, uint16_t type, SStreamIntervalOperatorInfo* pInfo) { - int32_t code = TSDB_CODE_SUCCESS; - int32_t lino = 0; - SStateStore* pAPI = &downstream->pTaskInfo->storageAPI.stateStore; + int32_t code = TSDB_CODE_SUCCESS; + int32_t lino = 0; + SStateStore* pAPI = &downstream->pTaskInfo->storageAPI.stateStore; + SExecTaskInfo* pTaskInfo = downstream->pTaskInfo; if (downstream->operatorType != QUERY_NODE_PHYSICAL_PLAN_STREAM_SCAN) { return initIntervalDownStream(downstream->pDownstream[0], type, pInfo); @@ -542,7 +545,7 @@ int32_t initIntervalDownStream(SOperatorInfo* downstream, uint16_t type, SStream _end: if (code != TSDB_CODE_SUCCESS) { - qError("%s failed at line %d since %s", __func__, lino, tstrerror(code)); + qError("%s failed at line %d since %s. task:%s", __func__, lino, tstrerror(code), GET_TASKID(pTaskInfo)); } return code; } @@ -584,7 +587,7 @@ int32_t compactFunctions(SqlFunctionCtx* pDestCtx, SqlFunctionCtx* pSourceCtx, i _end: if (code != TSDB_CODE_SUCCESS) { - qError("%s failed at line %d since %s", __func__, lino, tstrerror(code)); + qError("%s failed at line %d since %s. task:%s", __func__, lino, tstrerror(code), GET_TASKID(pTaskInfo)); } return code; } @@ -946,7 +949,7 @@ void buildDataBlockFromGroupRes(SOperatorInfo* pOperator, void* pState, SSDataBl _end: if (code != TSDB_CODE_SUCCESS) { - qError("%s failed at line %d since %s", __func__, lino, tstrerror(code)); + qError("%s failed at line %d since %s. task:%s", __func__, lino, tstrerror(code), GET_TASKID(pTaskInfo)); } } @@ -1149,7 +1152,7 @@ static void doStreamIntervalAggImpl(SOperatorInfo* pOperator, SSDataBlock* pSDat } _end: if (code != TSDB_CODE_SUCCESS) { - qError("%s failed at line %d since %s", __func__, lino, tstrerror(code)); + qError("%s failed at line %d since %s. task:%s", __func__, lino, tstrerror(code), GET_TASKID(pTaskInfo)); } } @@ -1332,6 +1335,7 @@ void doStreamIntervalDecodeOpState(void* buf, int32_t len, SOperatorInfo* pOpera int32_t code = TSDB_CODE_SUCCESS; int32_t lino = 0; SStreamIntervalOperatorInfo* pInfo = pOperator->info; + SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo; if (!pInfo) { code = TSDB_CODE_FAILED; QUERY_CHECK_CODE(code, lino, _end); @@ -1401,7 +1405,7 @@ void doStreamIntervalDecodeOpState(void* buf, int32_t len, SOperatorInfo* pOpera _end: if (code != TSDB_CODE_SUCCESS) { - qError("%s failed at line %d since %s", __func__, lino, tstrerror(code)); + qError("%s failed at line %d since %s. task:%s", __func__, lino, tstrerror(code), GET_TASKID(pTaskInfo)); } } @@ -1445,15 +1449,16 @@ _end: return code; } -static SSDataBlock* buildIntervalResult(SOperatorInfo* pOperator) { +static int32_t buildIntervalResult(SOperatorInfo* pOperator, SSDataBlock** ppRes) { SStreamIntervalOperatorInfo* pInfo = pOperator->info; - - SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo; - uint16_t opType = pOperator->operatorType; + int32_t code = TSDB_CODE_SUCCESS; + SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo; + uint16_t opType = pOperator->operatorType; // check if query task is closed or not if (isTaskKilled(pTaskInfo)) { - return NULL; + (*ppRes) = NULL; + return code; } if (IS_FINAL_INTERVAL_OP(pOperator)) { @@ -1461,7 +1466,8 @@ static SSDataBlock* buildIntervalResult(SOperatorInfo* pOperator) { if (pInfo->pPullDataRes->info.rows != 0) { // process the rest of the data printDataBlock(pInfo->pPullDataRes, getStreamOpName(opType), GET_TASKID(pTaskInfo)); - return pInfo->pPullDataRes; + (*ppRes) = pInfo->pPullDataRes; + return code; } } @@ -1469,16 +1475,19 @@ static SSDataBlock* buildIntervalResult(SOperatorInfo* pOperator) { if (pInfo->pDelRes->info.rows != 0) { // process the rest of the data printDataBlock(pInfo->pDelRes, getStreamOpName(opType), GET_TASKID(pTaskInfo)); - return pInfo->pDelRes; + (*ppRes) = pInfo->pDelRes; + return code; } doBuildStreamIntervalResult(pOperator, pInfo->pState, pInfo->binfo.pRes, &pInfo->groupResInfo); if (pInfo->binfo.pRes->info.rows != 0) { printDataBlock(pInfo->binfo.pRes, getStreamOpName(opType), GET_TASKID(pTaskInfo)); - return pInfo->binfo.pRes; + (*ppRes) = pInfo->binfo.pRes; + return code; } - return NULL; + (*ppRes) = NULL; + return code; } int32_t copyUpdateResult(SSHashObj** ppWinUpdated, SArray* pUpdated, __compar_fn_t compar) { @@ -1504,7 +1513,7 @@ _end: return code; } -static SSDataBlock* doStreamFinalIntervalAgg(SOperatorInfo* pOperator) { +static int32_t doStreamFinalIntervalAggNext(SOperatorInfo* pOperator, SSDataBlock** ppRes) { int32_t code = TSDB_CODE_SUCCESS; int32_t lino = 0; SStreamIntervalOperatorInfo* pInfo = pOperator->info; @@ -1517,11 +1526,15 @@ static SSDataBlock* doStreamFinalIntervalAgg(SOperatorInfo* pOperator) { qDebug("stask:%s %s status: %d", GET_TASKID(pTaskInfo), getStreamOpName(pOperator->operatorType), pOperator->status); if (pOperator->status == OP_EXEC_DONE) { - return NULL; + (*ppRes) = NULL; + return code; } else if (pOperator->status == OP_RES_TO_RETURN) { - SSDataBlock* resBlock = buildIntervalResult(pOperator); + SSDataBlock* resBlock = NULL; + code = buildIntervalResult(pOperator, &resBlock); + QUERY_CHECK_CODE(code, lino, _end); if (resBlock != NULL) { - return resBlock; + (*ppRes) = resBlock; + return code; } if (pInfo->recvGetAll) { @@ -1532,7 +1545,8 @@ static SSDataBlock* doStreamFinalIntervalAgg(SOperatorInfo* pOperator) { if (pInfo->reCkBlock) { pInfo->reCkBlock = false; printDataBlock(pInfo->pCheckpointRes, getStreamOpName(pOperator->operatorType), GET_TASKID(pTaskInfo)); - return pInfo->pCheckpointRes; + (*ppRes) = pInfo->pCheckpointRes; + return code; } setStreamOperatorCompleted(pOperator); @@ -1542,18 +1556,23 @@ static SSDataBlock* doStreamFinalIntervalAgg(SOperatorInfo* pOperator) { clearStreamIntervalOperator(pInfo); qDebug("===stream===clear semi operator"); } - return NULL; + (*ppRes) = NULL; + return code; } else { if (!IS_FINAL_INTERVAL_OP(pOperator)) { - SSDataBlock* resBlock = buildIntervalResult(pOperator); + SSDataBlock* resBlock = NULL; + code = buildIntervalResult(pOperator, &resBlock); + QUERY_CHECK_CODE(code, lino, _end); if (resBlock != NULL) { - return resBlock; + (*ppRes) = resBlock; + return code; } if (pInfo->recvRetrive) { pInfo->recvRetrive = false; printDataBlock(pInfo->pMidRetriveRes, getStreamOpName(pOperator->operatorType), GET_TASKID(pTaskInfo)); - return pInfo->pMidRetriveRes; + (*ppRes) = pInfo->pMidRetriveRes; + return code; } } } @@ -1569,7 +1588,8 @@ static SSDataBlock* doStreamFinalIntervalAgg(SOperatorInfo* pOperator) { while (1) { if (isTaskKilled(pTaskInfo)) { qInfo("===stream=== %s task is killed, code %s", GET_TASKID(pTaskInfo), tstrerror(pTaskInfo->code)); - return NULL; + (*ppRes) = NULL; + return code; } SSDataBlock* pBlock = downstream->fpSet.getNextFn(downstream); @@ -1625,7 +1645,8 @@ static SSDataBlock* doStreamFinalIntervalAgg(SOperatorInfo* pOperator) { } else { pInfo->pDelRes->info.type = STREAM_DELETE_RESULT; } - return pInfo->pDelRes; + (*ppRes) = pInfo->pDelRes; + return code; } break; @@ -1652,7 +1673,8 @@ static SSDataBlock* doStreamFinalIntervalAgg(SOperatorInfo* pOperator) { QUERY_CHECK_CODE(code, lino, _end); continue; } else if (pBlock->info.type == STREAM_CREATE_CHILD_TABLE) { - return pBlock; + (*ppRes) = pBlock; + return code; } else if (pBlock->info.type == STREAM_CHECKPOINT) { pAPI->stateStore.streamStateCommit(pInfo->pState); doStreamIntervalSaveCheckpoint(pOperator); @@ -1703,23 +1725,35 @@ static SSDataBlock* doStreamFinalIntervalAgg(SOperatorInfo* pOperator) { code = blockDataEnsureCapacity(pInfo->binfo.pRes, pOperator->resultInfo.capacity); QUERY_CHECK_CODE(code, lino, _end); - SSDataBlock* resBlock = buildIntervalResult(pOperator); + SSDataBlock* resBlock = NULL; + code = buildIntervalResult(pOperator, &resBlock); + QUERY_CHECK_CODE(code, lino, _end); if (resBlock != NULL) { - return resBlock; + (*ppRes) = resBlock; + return code; } if (pInfo->recvRetrive) { pInfo->recvRetrive = false; printDataBlock(pInfo->pMidRetriveRes, getStreamOpName(pOperator->operatorType), GET_TASKID(pTaskInfo)); - return pInfo->pMidRetriveRes; + (*ppRes) = pInfo->pMidRetriveRes; + return code; } _end: if (code != TSDB_CODE_SUCCESS) { - qError("%s failed at line %d since %s", __func__, lino, tstrerror(code)); + pTaskInfo->code = code; + qError("%s failed at line %d since %s. task:%s", __func__, lino, tstrerror(code), GET_TASKID(pTaskInfo)); } setStreamOperatorCompleted(pOperator); - return NULL; + (*ppRes) = NULL; + return code; +} + +static SSDataBlock* doStreamFinalIntervalAgg(SOperatorInfo* pOperator) { + SSDataBlock* pRes = NULL; + int32_t code = doStreamFinalIntervalAggNext(pOperator, &pRes); + return pRes; } int64_t getDeleteMark(SWindowPhysiNode* pWinPhyNode, int64_t interval) { @@ -1780,6 +1814,7 @@ void streamIntervalReloadState(SOperatorInfo* pOperator) { int32_t code = TSDB_CODE_SUCCESS; int32_t lino = 0; SStreamIntervalOperatorInfo* pInfo = pOperator->info; + SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo; if (pOperator->operatorType != QUERY_NODE_PHYSICAL_PLAN_STREAM_SEMI_INTERVAL && pOperator->operatorType != QUERY_NODE_PHYSICAL_PLAN_STREAM_MID_INTERVAL) { int32_t size = 0; @@ -1801,7 +1836,7 @@ void streamIntervalReloadState(SOperatorInfo* pOperator) { _end: if (code != TSDB_CODE_SUCCESS) { - qError("%s failed at line %d since %s", __func__, lino, tstrerror(code)); + qError("%s failed at line %d since %s. task:%s", __func__, lino, tstrerror(code), GET_TASKID(pTaskInfo)); } } @@ -2017,8 +2052,9 @@ void initDummyFunction(SqlFunctionCtx* pDummy, SqlFunctionCtx* pCtx, int32_t num int32_t initDownStream(SOperatorInfo* downstream, SStreamAggSupporter* pAggSup, uint16_t type, int32_t tsColIndex, STimeWindowAggSupp* pTwSup, struct SSteamOpBasicInfo* pBasic) { - int32_t code = TSDB_CODE_SUCCESS; - int32_t lino = 0; + SExecTaskInfo* pTaskInfo = downstream->pTaskInfo; + int32_t code = TSDB_CODE_SUCCESS; + int32_t lino = 0; if (downstream->operatorType == QUERY_NODE_PHYSICAL_PLAN_STREAM_PARTITION) { SStreamPartitionOperatorInfo* pScanInfo = downstream->info; pScanInfo->tsColIndex = tsColIndex; @@ -2043,7 +2079,7 @@ int32_t initDownStream(SOperatorInfo* downstream, SStreamAggSupporter* pAggSup, _end: if (code != TSDB_CODE_SUCCESS) { - qError("%s failed at line %d since %s", __func__, lino, tstrerror(code)); + qError("%s failed at line %d since %s. task:%s", __func__, lino, tstrerror(code), GET_TASKID(pTaskInfo)); } return code; } @@ -2205,15 +2241,11 @@ void removeSessionResult(SStreamAggSupporter* pAggSup, SSHashObj* pHashMap, SSHa void* pVal = tSimpleHashGet(pHashMap, &key, sizeof(SSessionKey)); if (pVal) { releaseOutputBuf(pAggSup->pState, *(void**)pVal, &pAggSup->pSessionAPI->stateStore); - code = tSimpleHashRemove(pHashMap, &key, sizeof(SSessionKey)); - if (code != TSDB_CODE_SUCCESS) { - qWarn("%s failed at line %d since %s", __func__, __LINE__, tstrerror(code)); - } - } - code = tSimpleHashRemove(pResMap, &key, sizeof(SSessionKey)); - if (code != TSDB_CODE_SUCCESS) { - qWarn("%s failed at line %d since %s", __func__, __LINE__, tstrerror(code)); + int32_t tmpRes = tSimpleHashRemove(pHashMap, &key, sizeof(SSessionKey)); + qTrace("%s at line %d res:%d", __func__, __LINE__, tmpRes); } + int32_t tmpRes = tSimpleHashRemove(pResMap, &key, sizeof(SSessionKey)); + qTrace("%s at line %d res:%d", __func__, __LINE__, tmpRes); } void getSessionHashKey(const SSessionKey* pKey, SSessionKey* pHashKey) { @@ -2313,7 +2345,7 @@ int32_t doOneWindowAggImpl(SColumnInfoData* pTimeWindowData, SResultWindowInfo* _end: if (code != TSDB_CODE_SUCCESS) { - qError("%s failed at line %d since %s", __func__, lino, tstrerror(code)); + qError("%s failed at line %d since %s. task:%s", __func__, lino, tstrerror(code), GET_TASKID(pTaskInfo)); } return code; } @@ -2322,10 +2354,8 @@ void doDeleteSessionWindow(SStreamAggSupporter* pAggSup, SSessionKey* pKey) { pAggSup->stateStore.streamStateSessionDel(pAggSup->pState, pKey); SSessionKey hashKey = {0}; getSessionHashKey(pKey, &hashKey); - int32_t code = tSimpleHashRemove(pAggSup->pResultRows, &hashKey, sizeof(SSessionKey)); - if (code != TSDB_CODE_SUCCESS) { - qTrace("%s failed at line %d since %s", __func__, __LINE__, tstrerror(code)); - } + int32_t tmpRes = tSimpleHashRemove(pAggSup->pResultRows, &hashKey, sizeof(SSessionKey)); + qTrace("%s at line %d res:%d", __func__, __LINE__, tmpRes); } void setSessionWinOutputInfo(SSHashObj* pStUpdated, SResultWindowInfo* pWinInfo) { @@ -2391,7 +2421,7 @@ int32_t compactTimeWindow(SExprSupp* pSup, SStreamAggSupporter* pAggSup, STimeWi _end: if (code != TSDB_CODE_SUCCESS) { - qError("%s failed at line %d since %s", __func__, lino, tstrerror(code)); + qError("%s failed at line %d since %s. task:%s", __func__, lino, tstrerror(code), GET_TASKID(pTaskInfo)); } return code; } @@ -2429,7 +2459,7 @@ static int32_t compactSessionWindow(SOperatorInfo* pOperator, SResultWindowInfo* _end: if (code != TSDB_CODE_SUCCESS) { - qError("%s failed at line %d since %s", __func__, lino, tstrerror(code)); + qError("%s failed at line %d since %s. task:%s", __func__, lino, tstrerror(code), GET_TASKID(pTaskInfo)); } return code; } @@ -2561,7 +2591,7 @@ static void doStreamSessionAggImpl(SOperatorInfo* pOperator, SSDataBlock* pSData _end: if (code != TSDB_CODE_SUCCESS) { - qError("%s failed at line %d since %s", __func__, lino, tstrerror(code)); + qError("%s failed at line %d since %s. task:%s", __func__, lino, tstrerror(code), GET_TASKID(pTaskInfo)); } } @@ -2618,9 +2648,10 @@ inline int32_t sessionKeyCompareAsc(const void* pKey1, const void* pKey2) { } void doBuildDeleteDataBlock(SOperatorInfo* pOp, SSHashObj* pStDeleted, SSDataBlock* pBlock, void** Ite) { - int32_t code = TSDB_CODE_SUCCESS; - int32_t lino = 0; - SStorageAPI* pAPI = &pOp->pTaskInfo->storageAPI; + int32_t code = TSDB_CODE_SUCCESS; + int32_t lino = 0; + SStorageAPI* pAPI = &pOp->pTaskInfo->storageAPI; + SExecTaskInfo* pTaskInfo = pOp->pTaskInfo; blockDataCleanup(pBlock); int32_t size = tSimpleHashGetSize(pStDeleted); @@ -2686,7 +2717,7 @@ _end: } if (code != TSDB_CODE_SUCCESS) { - qError("%s failed at line %d since %s", __func__, lino, tstrerror(code)); + qError("%s failed at line %d since %s. task:%s", __func__, lino, tstrerror(code), GET_TASKID(pTaskInfo)); } } @@ -2773,7 +2804,7 @@ static int32_t rebuildSessionWindow(SOperatorInfo* pOperator, SArray* pWinArray, _end: if (code != TSDB_CODE_SUCCESS) { - qError("%s failed at line %d since %s", __func__, lino, tstrerror(code)); + qError("%s failed at line %d since %s. task:%s", __func__, lino, tstrerror(code), GET_TASKID(pTaskInfo)); } return code; } @@ -2961,7 +2992,7 @@ int32_t buildSessionResultDataBlock(SOperatorInfo* pOperator, void* pState, SSDa _end: if (code != TSDB_CODE_SUCCESS) { - qError("%s failed at line %d since %s", __func__, lino, tstrerror(code)); + qError("%s failed at line %d since %s. task:%s", __func__, lino, tstrerror(code), GET_TASKID(pTaskInfo)); } return code; } @@ -2990,11 +3021,12 @@ void doBuildSessionResult(SOperatorInfo* pOperator, void* pState, SGroupResInfo* _end: if (code != TSDB_CODE_SUCCESS) { - qError("%s failed at line %d since %s", __func__, lino, tstrerror(code)); + qError("%s failed at line %d since %s. task:%s", __func__, lino, tstrerror(code), GET_TASKID(pTaskInfo)); } } -static SSDataBlock* buildSessionResult(SOperatorInfo* pOperator) { +static int32_t buildSessionResult(SOperatorInfo* pOperator, SSDataBlock** ppRes) { + int32_t code = TSDB_CODE_SUCCESS; SStreamSessionAggOperatorInfo* pInfo = pOperator->info; SStreamAggSupporter* pAggSup = &pInfo->streamAggSup; SOptrBasicInfo* pBInfo = &pInfo->binfo; @@ -3002,15 +3034,18 @@ static SSDataBlock* buildSessionResult(SOperatorInfo* pOperator) { doBuildDeleteDataBlock(pOperator, pInfo->pStDeleted, pInfo->pDelRes, &pInfo->pDelIterator); if (pInfo->pDelRes->info.rows > 0) { printDataBlock(pInfo->pDelRes, getStreamOpName(pOperator->operatorType), GET_TASKID(pTaskInfo)); - return pInfo->pDelRes; + (*ppRes) = pInfo->pDelRes; + return code; } doBuildSessionResult(pOperator, pAggSup->pState, &pInfo->groupResInfo, pBInfo->pRes); if (pBInfo->pRes->info.rows > 0) { printDataBlock(pBInfo->pRes, getStreamOpName(pOperator->operatorType), GET_TASKID(pTaskInfo)); - return pBInfo->pRes; + (*ppRes) = pBInfo->pRes; + return code; } - return NULL; + (*ppRes) = NULL; + return code; } int32_t getMaxTsWins(const SArray* pAllWins, SArray* pMaxWins) { @@ -3130,6 +3165,7 @@ int32_t doStreamSessionDecodeOpState(void* buf, int32_t len, SOperatorInfo* pOpe int32_t code = TSDB_CODE_SUCCESS; int32_t lino = 0; SStreamSessionAggOperatorInfo* pInfo = pOperator->info; + SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo; if (!pInfo) { code = TSDB_CODE_FAILED; QUERY_CHECK_CODE(code, lino, _end); @@ -3187,7 +3223,7 @@ int32_t doStreamSessionDecodeOpState(void* buf, int32_t len, SOperatorInfo* pOpe _end: if (code != TSDB_CODE_SUCCESS) { - qError("%s failed at line %d since %s", __func__, lino, tstrerror(code)); + qError("%s failed at line %d since %s. task:%s", __func__, lino, tstrerror(code), GET_TASKID(pTaskInfo)); } return code; } @@ -3242,7 +3278,7 @@ _end: return code; } -static SSDataBlock* doStreamSessionAgg(SOperatorInfo* pOperator) { +static int32_t doStreamSessionAggNext(SOperatorInfo* pOperator, SSDataBlock** ppRes) { int32_t code = TSDB_CODE_SUCCESS; int32_t lino = 0; SExprSupp* pSup = &pOperator->exprSupp; @@ -3252,11 +3288,15 @@ static SSDataBlock* doStreamSessionAgg(SOperatorInfo* pOperator) { SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo; qDebug("stask:%s %s status: %d", GET_TASKID(pTaskInfo), getStreamOpName(pOperator->operatorType), pOperator->status); if (pOperator->status == OP_EXEC_DONE) { - return NULL; + (*ppRes) = NULL; + return code; } else if (pOperator->status == OP_RES_TO_RETURN) { - SSDataBlock* opRes = buildSessionResult(pOperator); + SSDataBlock* opRes = NULL; + code = buildSessionResult(pOperator, &opRes); + QUERY_CHECK_CODE(code, lino, _end); if (opRes) { - return opRes; + (*ppRes) = opRes; + return code; } if (pInfo->recvGetAll) { @@ -3267,11 +3307,13 @@ static SSDataBlock* doStreamSessionAgg(SOperatorInfo* pOperator) { if (pInfo->reCkBlock) { pInfo->reCkBlock = false; printDataBlock(pInfo->pCheckpointRes, getStreamOpName(pOperator->operatorType), GET_TASKID(pTaskInfo)); - return pInfo->pCheckpointRes; + (*ppRes) = pInfo->pCheckpointRes; + return code; } setStreamOperatorCompleted(pOperator); - return NULL; + (*ppRes) = NULL; + return code; } SOperatorInfo* downstream = pOperator->pDownstream[0]; @@ -3324,7 +3366,8 @@ static SSDataBlock* doStreamSessionAgg(SOperatorInfo* pOperator) { QUERY_CHECK_CODE(code, lino, _end); continue; } else if (pBlock->info.type == STREAM_CREATE_CHILD_TABLE) { - return pBlock; + (*ppRes) = pBlock; + return code; } else if (pBlock->info.type == STREAM_CHECKPOINT) { pAggSup->stateStore.streamStateCommit(pAggSup->pState); doStreamSessionSaveCheckpoint(pOperator); @@ -3401,17 +3444,28 @@ static SSDataBlock* doStreamSessionAgg(SOperatorInfo* pOperator) { code = blockDataEnsureCapacity(pInfo->binfo.pRes, pOperator->resultInfo.capacity); QUERY_CHECK_CODE(code, lino, _end); - SSDataBlock* opRes = buildSessionResult(pOperator); + SSDataBlock* opRes = NULL; + code = buildSessionResult(pOperator, &opRes); + QUERY_CHECK_CODE(code, lino, _end); if (opRes) { - return opRes; + (*ppRes) = opRes; + return code; } _end: if (code != TSDB_CODE_SUCCESS) { - qError("%s failed at line %d since %s", __func__, lino, tstrerror(code)); + pTaskInfo->code = code; + qError("%s failed at line %d since %s. task:%s", __func__, lino, tstrerror(code), GET_TASKID(pTaskInfo)); } setStreamOperatorCompleted(pOperator); - return NULL; + (*ppRes) = NULL; + return code; +} + +static SSDataBlock* doStreamSessionAgg(SOperatorInfo* pOperator) { + SSDataBlock* pRes = NULL; + int32_t code = doStreamSessionAggNext(pOperator, &pRes); + return pRes; } void streamSessionReleaseState(SOperatorInfo* pOperator) { @@ -3479,6 +3533,7 @@ void streamSessionSemiReloadState(SOperatorInfo* pOperator) { int32_t lino = 0; SStreamSessionAggOperatorInfo* pInfo = pOperator->info; SStreamAggSupporter* pAggSup = &pInfo->streamAggSup; + SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo; resetWinRange(&pAggSup->winRange); SResultWindowInfo winInfo = {0}; @@ -3515,7 +3570,7 @@ void streamSessionSemiReloadState(SOperatorInfo* pOperator) { _end: if (code != TSDB_CODE_SUCCESS) { - qError("%s failed at line %d since %s", __func__, lino, tstrerror(code)); + qError("%s failed at line %d since %s. task:%s", __func__, lino, tstrerror(code), GET_TASKID(pTaskInfo)); } } @@ -3524,6 +3579,7 @@ void streamSessionReloadState(SOperatorInfo* pOperator) { int32_t lino = 0; SStreamSessionAggOperatorInfo* pInfo = pOperator->info; SStreamAggSupporter* pAggSup = &pInfo->streamAggSup; + SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo; resetWinRange(&pAggSup->winRange); int32_t size = 0; @@ -3587,7 +3643,7 @@ void streamSessionReloadState(SOperatorInfo* pOperator) { _end: if (code != TSDB_CODE_SUCCESS) { - qError("%s failed at line %d since %s", __func__, lino, tstrerror(code)); + qError("%s failed at line %d since %s. task:%s", __func__, lino, tstrerror(code), GET_TASKID(pTaskInfo)); } } @@ -3709,7 +3765,7 @@ _error: taosMemoryFreeClear(pOperator); pTaskInfo->code = code; - qError("%s failed at line %d since %s", __func__, lino, tstrerror(code)); + qError("%s failed at line %d since %s. task:%s", __func__, lino, tstrerror(code), GET_TASKID(pTaskInfo)); return NULL; } @@ -3748,7 +3804,7 @@ _end: return code; } -static SSDataBlock* doStreamSessionSemiAgg(SOperatorInfo* pOperator) { +static int32_t doStreamSessionSemiAggNext(SOperatorInfo* pOperator, SSDataBlock** ppRes) { int32_t code = TSDB_CODE_SUCCESS; int32_t lino = 0; SStreamSessionAggOperatorInfo* pInfo = pOperator->info; @@ -3760,13 +3816,17 @@ static SSDataBlock* doStreamSessionSemiAgg(SOperatorInfo* pOperator) { qDebug("stask:%s %s status: %d", GET_TASKID(pTaskInfo), getStreamOpName(pOperator->operatorType), pOperator->status); if (pOperator->status == OP_EXEC_DONE) { - return NULL; + (*ppRes) = NULL; + return code; } { - SSDataBlock* opRes = buildSessionResult(pOperator); + SSDataBlock* opRes = NULL; + code = buildSessionResult(pOperator, &opRes); + QUERY_CHECK_CODE(code, lino, _end); if (opRes) { - return opRes; + (*ppRes) = opRes; + return code; } if (pInfo->clearState) { @@ -3779,13 +3839,15 @@ static SSDataBlock* doStreamSessionSemiAgg(SOperatorInfo* pOperator) { if (pInfo->reCkBlock) { pInfo->reCkBlock = false; printDataBlock(pInfo->pCheckpointRes, getStreamOpName(pOperator->operatorType), GET_TASKID(pTaskInfo)); - return pInfo->pCheckpointRes; + (*ppRes) = pInfo->pCheckpointRes; + return code; } clearFunctionContext(&pOperator->exprSupp); // semi session operator clear disk buffer clearStreamSessionOperator(pInfo); setStreamOperatorCompleted(pOperator); - return NULL; + (*ppRes) = NULL; + return code; } } @@ -3818,7 +3880,8 @@ static SSDataBlock* doStreamSessionSemiAgg(SOperatorInfo* pOperator) { QUERY_CHECK_CODE(code, lino, _end); continue; } else if (pBlock->info.type == STREAM_CREATE_CHILD_TABLE) { - return pBlock; + (*ppRes) = pBlock; + return code; } else if (pBlock->info.type == STREAM_CHECKPOINT) { pAggSup->stateStore.streamStateCommit(pAggSup->pState); doStreamSessionSaveCheckpoint(pOperator); @@ -3857,21 +3920,32 @@ static SSDataBlock* doStreamSessionSemiAgg(SOperatorInfo* pOperator) { code = blockDataEnsureCapacity(pBInfo->pRes, pOperator->resultInfo.capacity); QUERY_CHECK_CODE(code, lino, _end); - SSDataBlock* opRes = buildSessionResult(pOperator); + SSDataBlock* opRes = NULL; + code = buildSessionResult(pOperator, &opRes); + QUERY_CHECK_CODE(code, lino, _end); if (opRes) { - return opRes; + (*ppRes) = opRes; + return code; } _end: if (code != TSDB_CODE_SUCCESS) { - qError("%s failed at line %d since %s", __func__, lino, tstrerror(code)); + pTaskInfo->code = code; + qError("%s failed at line %d since %s. task:%s", __func__, lino, tstrerror(code), GET_TASKID(pTaskInfo)); } clearFunctionContext(&pOperator->exprSupp); // semi session operator clear disk buffer clearStreamSessionOperator(pInfo); setStreamOperatorCompleted(pOperator); - return NULL; + (*ppRes) = NULL; + return code; +} + +static SSDataBlock* doStreamSessionSemiAgg(SOperatorInfo* pOperator) { + SSDataBlock* pRes = NULL; + int32_t code = doStreamSessionSemiAggNext(pOperator, &pRes); + return pRes; } SOperatorInfo* createStreamFinalSessionAggOperatorInfo(SOperatorInfo* downstream, SPhysiNode* pPhyNode, @@ -3941,7 +4015,7 @@ _error: taosMemoryFreeClear(pOperator); pTaskInfo->code = code; if (code != TSDB_CODE_SUCCESS) { - qError("%s failed at line %d since %s", __func__, lino, tstrerror(code)); + qError("%s failed at line %d since %s. task:%s", __func__, lino, tstrerror(code), GET_TASKID(pTaskInfo)); } return NULL; } @@ -4248,8 +4322,8 @@ static void doStreamStateAggImpl(SOperatorInfo* pOperator, SSDataBlock* pSDataBl code = appendDataToSpecialBlock(pAggSup->pScanBlock, &curWin.winInfo.sessionWin.win.skey, &curWin.winInfo.sessionWin.win.ekey, &uid, &groupId, NULL); QUERY_CHECK_CODE(code, lino, _end); - code = tSimpleHashRemove(pSeUpdated, &curWin.winInfo.sessionWin, sizeof(SSessionKey)); - QUERY_CHECK_CODE(code, lino, _end); + int32_t tmpRes = tSimpleHashRemove(pSeUpdated, &curWin.winInfo.sessionWin, sizeof(SSessionKey)); + qTrace("%s at line %d res:%d", __func__, __LINE__, tmpRes); doDeleteSessionWindow(pAggSup, &curWin.winInfo.sessionWin); releaseOutputBuf(pAggSup->pState, curWin.winInfo.pStatePos, &pAPI->stateStore); @@ -4285,7 +4359,7 @@ static void doStreamStateAggImpl(SOperatorInfo* pOperator, SSDataBlock* pSDataBl _end: if (code != TSDB_CODE_SUCCESS) { - qError("%s failed at line %d since %s", __func__, lino, tstrerror(code)); + qError("%s failed at line %d since %s. task:%s", __func__, lino, tstrerror(code), GET_TASKID(pTaskInfo)); } } @@ -4342,6 +4416,7 @@ int32_t doStreamStateDecodeOpState(void* buf, int32_t len, SOperatorInfo* pOpera int32_t code = TSDB_CODE_SUCCESS; int32_t lino = 0; SStreamAggSupporter* pAggSup = &pInfo->streamAggSup; + SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo; if (!pInfo) { code = TSDB_CODE_FAILED; QUERY_CHECK_CODE(code, lino, _end); @@ -4399,7 +4474,7 @@ int32_t doStreamStateDecodeOpState(void* buf, int32_t len, SOperatorInfo* pOpera _end: if (code != TSDB_CODE_SUCCESS) { - qError("%s failed at line %d since %s", __func__, lino, tstrerror(code)); + qError("%s failed at line %d since %s. task:%s", __func__, lino, tstrerror(code), GET_TASKID(pTaskInfo)); } return code; } @@ -4422,7 +4497,8 @@ void doStreamStateSaveCheckpoint(SOperatorInfo* pOperator) { } } -static SSDataBlock* buildStateResult(SOperatorInfo* pOperator) { +static int32_t buildStateResult(SOperatorInfo* pOperator, SSDataBlock** ppRes) { + int32_t code = TSDB_CODE_SUCCESS; SStreamStateAggOperatorInfo* pInfo = pOperator->info; SOptrBasicInfo* pBInfo = &pInfo->binfo; SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo; @@ -4430,20 +4506,24 @@ static SSDataBlock* buildStateResult(SOperatorInfo* pOperator) { doBuildDeleteDataBlock(pOperator, pInfo->pSeDeleted, pInfo->pDelRes, &pInfo->pDelIterator); if (pInfo->pDelRes->info.rows > 0) { printDataBlock(pInfo->pDelRes, getStreamOpName(pOperator->operatorType), GET_TASKID(pTaskInfo)); - return pInfo->pDelRes; + (*ppRes) = pInfo->pDelRes; + return code; } doBuildSessionResult(pOperator, pInfo->streamAggSup.pState, &pInfo->groupResInfo, pBInfo->pRes); if (pBInfo->pRes->info.rows > 0) { printDataBlock(pBInfo->pRes, getStreamOpName(pOperator->operatorType), GET_TASKID(pTaskInfo)); - return pBInfo->pRes; + (*ppRes) = pBInfo->pRes; + return code; } - return NULL; + (*ppRes) = NULL; + return code; } -static SSDataBlock* doStreamStateAgg(SOperatorInfo* pOperator) { +static int32_t doStreamStateAggNext(SOperatorInfo* pOperator, SSDataBlock** ppRes) { if (pOperator->status == OP_EXEC_DONE) { - return NULL; + (*ppRes) = NULL; + return TSDB_CODE_SUCCESS; } int32_t code = TSDB_CODE_SUCCESS; @@ -4454,9 +4534,12 @@ static SSDataBlock* doStreamStateAgg(SOperatorInfo* pOperator) { SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo; qDebug("===stream=== stream state agg"); if (pOperator->status == OP_RES_TO_RETURN) { - SSDataBlock* resBlock = buildStateResult(pOperator); + SSDataBlock* resBlock = NULL; + code = buildStateResult(pOperator, &resBlock); + QUERY_CHECK_CODE(code, lino, _end); if (resBlock != NULL) { - return resBlock; + (*ppRes) = resBlock; + return code; } if (pInfo->recvGetAll) { @@ -4467,11 +4550,13 @@ static SSDataBlock* doStreamStateAgg(SOperatorInfo* pOperator) { if (pInfo->reCkBlock) { pInfo->reCkBlock = false; printDataBlock(pInfo->pCheckpointRes, getStreamOpName(pOperator->operatorType), GET_TASKID(pTaskInfo)); - return pInfo->pCheckpointRes; + (*ppRes) = pInfo->pCheckpointRes; + return code; } setStreamOperatorCompleted(pOperator); - return NULL; + (*ppRes) = NULL; + return code; } SOperatorInfo* downstream = pOperator->pDownstream[0]; @@ -4503,7 +4588,8 @@ static SSDataBlock* doStreamStateAgg(SOperatorInfo* pOperator) { QUERY_CHECK_CODE(code, lino, _end); continue; } else if (pBlock->info.type == STREAM_CREATE_CHILD_TABLE) { - return pBlock; + (*ppRes) = pBlock; + return code; } else if (pBlock->info.type == STREAM_CHECKPOINT) { pInfo->streamAggSup.stateStore.streamStateCommit(pInfo->streamAggSup.pState); doStreamStateSaveCheckpoint(pOperator); @@ -4551,17 +4637,28 @@ static SSDataBlock* doStreamStateAgg(SOperatorInfo* pOperator) { code = blockDataEnsureCapacity(pInfo->binfo.pRes, pOperator->resultInfo.capacity); QUERY_CHECK_CODE(code, lino, _end); - SSDataBlock* resBlock = buildStateResult(pOperator); + SSDataBlock* resBlock = NULL; + code = buildStateResult(pOperator, &resBlock); + QUERY_CHECK_CODE(code, lino, _end); if (resBlock != NULL) { - return resBlock; + (*ppRes) = resBlock; + return code; } _end: if (code != TSDB_CODE_SUCCESS) { - qError("%s failed at line %d since %s", __func__, lino, tstrerror(code)); + pTaskInfo->code = code; + qError("%s failed at line %d since %s. task:%s", __func__, lino, tstrerror(code), GET_TASKID(pTaskInfo)); } setStreamOperatorCompleted(pOperator); - return NULL; + (*ppRes) = NULL; + return code; +} + +static SSDataBlock* doStreamStateAgg(SOperatorInfo* pOperator) { + SSDataBlock* pRes = NULL; + int32_t code = doStreamStateAggNext(pOperator, &pRes); + return pRes; } void streamStateReleaseState(SOperatorInfo* pOperator) { @@ -4597,6 +4694,7 @@ void streamStateReloadState(SOperatorInfo* pOperator) { int32_t lino = 0; SStreamStateAggOperatorInfo* pInfo = pOperator->info; SStreamAggSupporter* pAggSup = &pInfo->streamAggSup; + SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo; resetWinRange(&pAggSup->winRange); SSessionKey seKey = {.win.skey = INT64_MIN, .win.ekey = INT64_MIN, .groupId = 0}; @@ -4673,7 +4771,7 @@ void streamStateReloadState(SOperatorInfo* pOperator) { _end: if (code != TSDB_CODE_SUCCESS) { - qError("%s failed at line %d since %s", __func__, lino, tstrerror(code)); + qError("%s failed at line %d since %s. task:%s", __func__, lino, tstrerror(code), GET_TASKID(pTaskInfo)); } } @@ -4782,7 +4880,7 @@ _error: destroyStreamStateOperatorInfo(pInfo); taosMemoryFreeClear(pOperator); pTaskInfo->code = code; - qError("%s failed at line %d since %s", __func__, lino, tstrerror(code)); + qError("%s failed at line %d since %s. task:%s", __func__, lino, tstrerror(code), GET_TASKID(pTaskInfo)); return NULL; } @@ -4798,7 +4896,7 @@ static void setInverFunction(SqlFunctionCtx* pCtx, int32_t num, EStreamType type } #endif -static SSDataBlock* doStreamIntervalAgg(SOperatorInfo* pOperator) { +static int32_t doStreamIntervalAggNext(SOperatorInfo* pOperator, SSDataBlock** ppRes) { int32_t code = TSDB_CODE_SUCCESS; int32_t lino = 0; SStreamIntervalOperatorInfo* pInfo = pOperator->info; @@ -4809,13 +4907,17 @@ static SSDataBlock* doStreamIntervalAgg(SOperatorInfo* pOperator) { qDebug("stask:%s %s status: %d", GET_TASKID(pTaskInfo), getStreamOpName(pOperator->operatorType), pOperator->status); if (pOperator->status == OP_EXEC_DONE) { - return NULL; + (*ppRes) = NULL; + return code; } if (pOperator->status == OP_RES_TO_RETURN) { - SSDataBlock* resBlock = buildIntervalResult(pOperator); + SSDataBlock* resBlock = NULL; + code = buildIntervalResult(pOperator, &resBlock); + QUERY_CHECK_CODE(code, lino, _end); if (resBlock != NULL) { - return resBlock; + (*ppRes) = resBlock; + return code; } if (pInfo->recvGetAll) { @@ -4826,11 +4928,13 @@ static SSDataBlock* doStreamIntervalAgg(SOperatorInfo* pOperator) { if (pInfo->reCkBlock) { pInfo->reCkBlock = false; printDataBlock(pInfo->pCheckpointRes, getStreamOpName(pOperator->operatorType), GET_TASKID(pTaskInfo)); - return pInfo->pCheckpointRes; + (*ppRes) = pInfo->pCheckpointRes; + return code; } setStreamOperatorCompleted(pOperator); - return NULL; + (*ppRes) = NULL; + return code; } SOperatorInfo* downstream = pOperator->pDownstream[0]; @@ -4869,7 +4973,8 @@ static SSDataBlock* doStreamIntervalAgg(SOperatorInfo* pOperator) { continue; } else if (pBlock->info.type == STREAM_CREATE_CHILD_TABLE) { printDataBlock(pBlock, getStreamOpName(pOperator->operatorType), GET_TASKID(pTaskInfo)); - return pBlock; + (*ppRes) = pBlock; + return code; } else if (pBlock->info.type == STREAM_CHECKPOINT) { pAPI->stateStore.streamStateCommit(pInfo->pState); doStreamIntervalSaveCheckpoint(pOperator); @@ -4940,14 +5045,25 @@ static SSDataBlock* doStreamIntervalAgg(SOperatorInfo* pOperator) { tSimpleHashCleanup(pInfo->pUpdatedMap); pInfo->pUpdatedMap = NULL; - return buildIntervalResult(pOperator); + code = buildIntervalResult(pOperator, ppRes); + QUERY_CHECK_CODE(code, lino, _end); + + return code; _end: if (code != TSDB_CODE_SUCCESS) { - qError("%s failed at line %d since %s", __func__, lino, tstrerror(code)); + pTaskInfo->code = code; + qError("%s failed at line %d since %s. task:%s", __func__, lino, tstrerror(code), GET_TASKID(pTaskInfo)); } setStreamOperatorCompleted(pOperator); - return NULL; + (*ppRes) = NULL; + return code; +} + +static SSDataBlock* doStreamIntervalAgg(SOperatorInfo* pOperator) { + SSDataBlock* pRes = NULL; + int32_t code = doStreamIntervalAggNext(pOperator, &pRes); + return pRes; } SOperatorInfo* createStreamIntervalOperatorInfo(SOperatorInfo* downstream, SPhysiNode* pPhyNode, @@ -5178,7 +5294,7 @@ static void doStreamMidIntervalAggImpl(SOperatorInfo* pOperator, SSDataBlock* pS _end: if (code != TSDB_CODE_SUCCESS) { - qError("%s failed at line %d since %s", __func__, lino, tstrerror(code)); + qError("%s failed at line %d since %s. task:%s", __func__, lino, tstrerror(code), GET_TASKID(pTaskInfo)); } } @@ -5230,7 +5346,7 @@ static SSDataBlock* buildMidIntervalResult(SOperatorInfo* pOperator) { return NULL; } -static SSDataBlock* doStreamMidIntervalAgg(SOperatorInfo* pOperator) { +static int32_t doStreamMidIntervalAggNext(SOperatorInfo* pOperator, SSDataBlock** ppRes) { int32_t code = TSDB_CODE_SUCCESS; int32_t lino = 0; SStreamIntervalOperatorInfo* pInfo = pOperator->info; @@ -5242,27 +5358,36 @@ static SSDataBlock* doStreamMidIntervalAgg(SOperatorInfo* pOperator) { qDebug("stask:%s %s status: %d", GET_TASKID(pTaskInfo), getStreamOpName(pOperator->operatorType), pOperator->status); if (pOperator->status == OP_EXEC_DONE) { - return NULL; + (*ppRes) = NULL; + return code; } else if (pOperator->status == OP_RES_TO_RETURN) { - SSDataBlock* resBlock = buildIntervalResult(pOperator); + SSDataBlock* resBlock = NULL; + code = buildIntervalResult(pOperator, &resBlock); + QUERY_CHECK_CODE(code, lino, _end); if (resBlock != NULL) { - return resBlock; + (*ppRes) = resBlock; + return code; } setOperatorCompleted(pOperator); clearFunctionContext(&pOperator->exprSupp); clearStreamIntervalOperator(pInfo); qDebug("stask:%s ===stream===%s clear", GET_TASKID(pTaskInfo), getStreamOpName(pOperator->operatorType)); - return NULL; + (*ppRes) = NULL; + return code; } else { - SSDataBlock* resBlock = buildIntervalResult(pOperator); + SSDataBlock* resBlock = NULL; + code = buildIntervalResult(pOperator, &resBlock); + QUERY_CHECK_CODE(code, lino, _end); if (resBlock != NULL) { - return resBlock; + (*ppRes) = resBlock; + return code; } resBlock = buildMidIntervalResult(pOperator); if (resBlock != NULL) { - return resBlock; + (*ppRes) = resBlock; + return code; } if (pInfo->clearState) { @@ -5283,7 +5408,8 @@ static SSDataBlock* doStreamMidIntervalAgg(SOperatorInfo* pOperator) { while (1) { if (isTaskKilled(pTaskInfo)) { qInfo("===stream=== %s task is killed, code %s", GET_TASKID(pTaskInfo), tstrerror(pTaskInfo->code)); - return NULL; + (*ppRes) = NULL; + return code; } SSDataBlock* pBlock = downstream->fpSet.getNextFn(downstream); @@ -5329,11 +5455,13 @@ static SSDataBlock* doStreamMidIntervalAgg(SOperatorInfo* pOperator) { pInfo->pDelRes->info.type = STREAM_DELETE_RESULT; } ASSERT(taosArrayGetSize(pInfo->pUpdated) == 0); - return pInfo->pDelRes; + (*ppRes) = pInfo->pDelRes; + return code; } continue; } else if (pBlock->info.type == STREAM_CREATE_CHILD_TABLE) { - return pBlock; + (*ppRes) = pBlock; + return code; } else if (pBlock->info.type == STREAM_PULL_OVER) { code = processPullOver(pBlock, pInfo->pPullDataMap, pInfo->pFinalPullDataMap, &pInfo->interval, pInfo->pPullWins, pInfo->numOfChild, pOperator, &pInfo->recvPullover); @@ -5413,14 +5541,18 @@ static SSDataBlock* doStreamMidIntervalAgg(SOperatorInfo* pOperator) { code = blockDataEnsureCapacity(pInfo->binfo.pRes, pOperator->resultInfo.capacity); QUERY_CHECK_CODE(code, lino, _end); - SSDataBlock* resBlock = buildIntervalResult(pOperator); + SSDataBlock* resBlock = NULL; + code = buildIntervalResult(pOperator, &resBlock); + QUERY_CHECK_CODE(code, lino, _end); if (resBlock != NULL) { - return resBlock; + (*ppRes) = resBlock; + return code; } resBlock = buildMidIntervalResult(pOperator); if (resBlock != NULL) { - return resBlock; + (*ppRes) = resBlock; + return code; } if (pInfo->clearState) { @@ -5431,9 +5563,17 @@ static SSDataBlock* doStreamMidIntervalAgg(SOperatorInfo* pOperator) { _end: if (code != TSDB_CODE_SUCCESS) { - qError("%s failed at line %d since %s", __func__, lino, tstrerror(code)); + pTaskInfo->code = code; + qError("%s failed at line %d since %s. task:%s", __func__, lino, tstrerror(code), GET_TASKID(pTaskInfo)); } - return NULL; + (*ppRes) = NULL; + return code; +} + +static SSDataBlock* doStreamMidIntervalAgg(SOperatorInfo* pOperator) { + SSDataBlock* pRes = NULL; + int32_t code = doStreamMidIntervalAggNext(pOperator, &pRes); + return pRes; } void setStreamOperatorCompleted(SOperatorInfo* pOperator) { diff --git a/source/libs/executor/src/sysscanoperator.c b/source/libs/executor/src/sysscanoperator.c index 4b247f871c..b502baa8ec 100644 --- a/source/libs/executor/src/sysscanoperator.c +++ b/source/libs/executor/src/sysscanoperator.c @@ -1872,8 +1872,9 @@ static void getDBNameFromCondition(SNode* pCondition, const char* dbName) { nodesWalkExpr(pCondition, getDBNameFromConditionWalker, (char*)dbName); } -static SSDataBlock* doSysTableScan(SOperatorInfo* pOperator) { +static int32_t doSysTableScanNext(SOperatorInfo* pOperator, SSDataBlock** ppRes) { // build message and send to mnode to fetch the content of system tables. + int32_t code = TSDB_CODE_SUCCESS; SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo; SSysTableScanInfo* pInfo = pOperator->info; char dbName[TSDB_DB_NAME_LEN] = {0}; @@ -1881,7 +1882,8 @@ static SSDataBlock* doSysTableScan(SOperatorInfo* pOperator) { while (1) { if (isTaskKilled(pOperator->pTaskInfo)) { setOperatorCompleted(pOperator); - return NULL; + (*ppRes) = NULL; + return code; } blockDataCleanup(pInfo->pRes); @@ -1923,13 +1925,21 @@ static SSDataBlock* doSysTableScan(SOperatorInfo* pOperator) { if (pBlock->info.rows == 0) { continue; } - return pBlock; + (*ppRes) = pBlock; + return code; } else { - return NULL; + (*ppRes) = NULL; + return code; } } } +static SSDataBlock* doSysTableScan(SOperatorInfo* pOperator) { + SSDataBlock* pRes = NULL; + int32_t code = doSysTableScanNext(pOperator, &pRes); + return pRes; +} + static void sysTableScanFillTbName(SOperatorInfo* pOperator, const SSysTableScanInfo* pInfo, const char* name, SSDataBlock* pBlock) { int32_t code = TSDB_CODE_SUCCESS; @@ -1974,7 +1984,11 @@ static SSDataBlock* sysTableScanFromMNode(SOperatorInfo* pOperator, SSysTableSca int32_t contLen = tSerializeSRetrieveTableReq(NULL, 0, &pInfo->req); char* buf1 = taosMemoryCalloc(1, contLen); - (void)tSerializeSRetrieveTableReq(buf1, contLen, &pInfo->req); + int32_t tempRes = tSerializeSRetrieveTableReq(buf1, contLen, &pInfo->req); + if (tempRes < 0) { + code = terrno; + return NULL; + } // send the fetch remote task result reques SMsgSendInfo* pMsgSendInfo = taosMemoryCalloc(1, sizeof(SMsgSendInfo)); @@ -2548,11 +2562,12 @@ static int32_t doGetTableRowSize(SReadHandle* pHandle, uint64_t uid, int32_t* ro return TSDB_CODE_SUCCESS; } -static SSDataBlock* doBlockInfoScan(SOperatorInfo* pOperator) { +static int32_t doBlockInfoScanNext(SOperatorInfo* pOperator, SSDataBlock** ppRes) { int32_t code = TSDB_CODE_SUCCESS; int32_t lino = 0; if (pOperator->status == OP_EXEC_DONE) { - return NULL; + (*ppRes) = NULL; + return code; } SBlockDistInfo* pBlockScanInfo = pOperator->info; @@ -2578,7 +2593,11 @@ static SSDataBlock* doBlockInfoScan(SOperatorInfo* pOperator) { char* p = taosMemoryCalloc(1, len + VARSTR_HEADER_SIZE); QUERY_CHECK_NULL(p, code, lino, _end, TSDB_CODE_OUT_OF_MEMORY); - (void)tSerializeBlockDistInfo(varDataVal(p), len, &blockDistInfo); + int32_t tempRes = tSerializeBlockDistInfo(varDataVal(p), len, &blockDistInfo); + if (tempRes < 0) { + code = terrno; + QUERY_CHECK_CODE(code, lino, _end); + } varDataSetLen(p, len); code = colDataSetVal(pColInfo, 0, p, false); @@ -2602,7 +2621,14 @@ _end: pTaskInfo->code = code; T_LONG_JMP(pTaskInfo->env, code); } - return pBlock; + (*ppRes) = pBlock; + return code; +} + +static SSDataBlock* doBlockInfoScan(SOperatorInfo* pOperator) { + SSDataBlock* pRes = NULL; + int32_t code = doBlockInfoScanNext(pOperator, &pRes); + return pRes; } static void destroyBlockDistScanOperatorInfo(void* param) { diff --git a/source/libs/executor/src/tfill.c b/source/libs/executor/src/tfill.c index 3a024bc22d..a9bc6e8c0f 100644 --- a/source/libs/executor/src/tfill.c +++ b/source/libs/executor/src/tfill.c @@ -47,9 +47,9 @@ static void setNotFillColumn(SFillInfo* pFillInfo, SColumnInfoData* pDstColInfo, } SGroupKeys* pKey = taosArrayGet(p->pRowVal, colIdx); - int32_t code = doSetVal(pDstColInfo, rowIndex, pKey); + int32_t code = doSetVal(pDstColInfo, rowIndex, pKey); if (code != TSDB_CODE_SUCCESS) { - qError("%s failed at line %d since %s", __func__, __LINE__, tstrerror(code)); + qError("%s failed at line %d since %s", __func__, __LINE__, tstrerror(code)); T_LONG_JMP(pFillInfo->pTaskInfo->env, code); } } @@ -511,20 +511,18 @@ static int32_t taosNumOfRemainRows(SFillInfo* pFillInfo) { return pFillInfo->numOfRows - pFillInfo->index; } -struct SFillInfo* taosCreateFillInfo(TSKEY skey, int32_t numOfFillCols, int32_t numOfNotFillCols, int32_t capacity, - SInterval* pInterval, int32_t fillType, struct SFillColInfo* pCol, - int32_t primaryTsSlotId, int32_t order, const char* id, SExecTaskInfo* pTaskInfo) { +void taosCreateFillInfo(TSKEY skey, int32_t numOfFillCols, int32_t numOfNotFillCols, int32_t capacity, + SInterval* pInterval, int32_t fillType, struct SFillColInfo* pCol, int32_t primaryTsSlotId, + int32_t order, const char* id, SExecTaskInfo* pTaskInfo, SFillInfo** ppFillInfo) { int32_t code = TSDB_CODE_SUCCESS; int32_t lino = 0; if (fillType == TSDB_FILL_NONE) { - return NULL; + (*ppFillInfo) = NULL; + return; } SFillInfo* pFillInfo = taosMemoryCalloc(1, sizeof(SFillInfo)); - if (pFillInfo == NULL) { - terrno = TSDB_CODE_OUT_OF_MEMORY; - return NULL; - } + QUERY_CHECK_NULL(pFillInfo, code, lino, _end, TSDB_CODE_OUT_OF_MEMORY); pFillInfo->order = order; pFillInfo->srcTsSlotId = primaryTsSlotId; @@ -562,10 +560,10 @@ _end: if (code != TSDB_CODE_SUCCESS) { taosArrayDestroy(pFillInfo->next.pRowVal); taosArrayDestroy(pFillInfo->prev.pRowVal); - terrno = TSDB_CODE_OUT_OF_MEMORY; - return NULL; + terrno = code; + T_LONG_JMP(pTaskInfo->env, code); } - return pFillInfo; + (*ppFillInfo) = pFillInfo; } void taosResetFillInfo(SFillInfo* pFillInfo, TSKEY startTimestamp) { diff --git a/source/libs/executor/src/timesliceoperator.c b/source/libs/executor/src/timesliceoperator.c index c2e7b16dea..58899c87ff 100644 --- a/source/libs/executor/src/timesliceoperator.c +++ b/source/libs/executor/src/timesliceoperator.c @@ -321,7 +321,7 @@ static bool genInterpolationResult(STimeSliceOperatorInfo* pSliceInfo, SExprSupp char* v = colDataGetData(pSrc, index); code = colDataSetVal(pDst, pResBlock->info.rows, v, false); QUERY_CHECK_CODE(code, lino, _end); - } else if(!isSelectGroupConstValueFunc(pExprInfo)){ + } else if (!isSelectGroupConstValueFunc(pExprInfo)) { // use stored group key SGroupKeys* pkey = pSliceInfo->pPrevGroupKey; if (pkey->isNull == false) { @@ -331,7 +331,7 @@ static bool genInterpolationResult(STimeSliceOperatorInfo* pSliceInfo, SExprSupp colDataSetNULL(pDst, rows); } } else { - int32_t srcSlot = pExprInfo->base.pParam[0].pCol->slotId; + int32_t srcSlot = pExprInfo->base.pParam[0].pCol->slotId; SGroupKeys* pkey = taosArrayGet(pSliceInfo->pPrevRow, srcSlot); if (pkey->isNull == false) { colDataSetVal(pDst, rows, pkey->pData, false); @@ -781,10 +781,10 @@ static void saveBlockStatus(STimeSliceOperatorInfo* pSliceInfo, SSDataBlock* pBl static void doTimesliceImpl(SOperatorInfo* pOperator, STimeSliceOperatorInfo* pSliceInfo, SSDataBlock* pBlock, SExecTaskInfo* pTaskInfo, bool ignoreNull) { - int32_t code = TSDB_CODE_SUCCESS; - int32_t lino = 0; - SSDataBlock* pResBlock = pSliceInfo->pRes; - SInterval* pInterval = &pSliceInfo->interval; + int32_t code = TSDB_CODE_SUCCESS; + int32_t lino = 0; + SSDataBlock* pResBlock = pSliceInfo->pRes; + SInterval* pInterval = &pSliceInfo->interval; SColumnInfoData* pTsCol = taosArrayGet(pBlock->pDataBlock, pSliceInfo->tsCol.slotId); SColumnInfoData* pPkCol = NULL; @@ -988,12 +988,13 @@ static void doHandleTimeslice(SOperatorInfo* pOperator, SSDataBlock* pBlock) { copyPrevGroupKey(&pOperator->exprSupp, pSliceInfo->pPrevGroupKey, pBlock); } -static SSDataBlock* doTimeslice(SOperatorInfo* pOperator) { +static int32_t doTimesliceNext(SOperatorInfo* pOperator, SSDataBlock** ppRes) { int32_t code = TSDB_CODE_SUCCESS; int32_t lino = 0; SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo; if (pOperator->status == OP_EXEC_DONE) { - return NULL; + (*ppRes) = NULL; + return code; } STimeSliceOperatorInfo* pSliceInfo = pOperator->info; @@ -1079,7 +1080,14 @@ _finished: T_LONG_JMP(pTaskInfo->env, code); } - return pResBlock->info.rows == 0 ? NULL : pResBlock; + (*ppRes) = pResBlock->info.rows == 0 ? NULL : pResBlock; + return code; +} + +static SSDataBlock* doTimeslice(SOperatorInfo* pOperator) { + SSDataBlock* pRes = NULL; + int32_t code = doTimesliceNext(pOperator, &pRes); + return pRes; } static int32_t extractPkColumnFromFuncs(SNodeList* pFuncs, bool* pHasPk, SColumn* pPkColumn) { diff --git a/source/libs/executor/src/timewindowoperator.c b/source/libs/executor/src/timewindowoperator.c index e448cd8e3a..4d924d4a0b 100644 --- a/source/libs/executor/src/timewindowoperator.c +++ b/source/libs/executor/src/timewindowoperator.c @@ -811,9 +811,10 @@ void doCloseWindow(SResultRowInfo* pResultRowInfo, const SIntervalAggOperatorInf } } -SResultRowPosition addToOpenWindowList(SResultRowInfo* pResultRowInfo, const SResultRow* pResult, uint64_t groupId, SExecTaskInfo* pTaskInfo) { - int32_t code = TSDB_CODE_SUCCESS; - int32_t lino = 0; +SResultRowPosition addToOpenWindowList(SResultRowInfo* pResultRowInfo, const SResultRow* pResult, uint64_t groupId, + SExecTaskInfo* pTaskInfo) { + int32_t code = TSDB_CODE_SUCCESS; + int32_t lino = 0; SOpenWindowInfo openWin = {0}; openWin.pos.pageId = pResult->pageId; openWin.pos.offset = pResult->offset; @@ -1053,36 +1054,28 @@ _end: return code; } -static SSDataBlock* doStateWindowAgg(SOperatorInfo* pOperator) { +static int32_t doStateWindowAggNext(SOperatorInfo* pOperator, SSDataBlock** ppRes) { if (pOperator->status == OP_EXEC_DONE) { - return NULL; + (*ppRes) = NULL; + return TSDB_CODE_SUCCESS; } + int32_t code = TSDB_CODE_SUCCESS; + int32_t lino = 0; SStateWindowOperatorInfo* pInfo = pOperator->info; SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo; SOptrBasicInfo* pBInfo = &pInfo->binfo; - pTaskInfo->code = pOperator->fpSet._openFn(pOperator); - if (pTaskInfo->code != TSDB_CODE_SUCCESS) { - setOperatorCompleted(pOperator); - return NULL; - } + code = pOperator->fpSet._openFn(pOperator); + QUERY_CHECK_CODE(code, lino, _end); - int32_t code = blockDataEnsureCapacity(pBInfo->pRes, pOperator->resultInfo.capacity); - if (code != TSDB_CODE_SUCCESS) { - qError("%s failed at line %d since %s", __func__, __LINE__, tstrerror(code)); - pTaskInfo->code = code; - T_LONG_JMP(pTaskInfo->env, code); - } + code = blockDataEnsureCapacity(pBInfo->pRes, pOperator->resultInfo.capacity); + QUERY_CHECK_CODE(code, lino, _end); while (1) { doBuildResultDatablock(pOperator, &pInfo->binfo, &pInfo->groupResInfo, pInfo->aggSup.pResultBuf); code = doFilter(pBInfo->pRes, pOperator->exprSupp.pFilterInfo, NULL); - if (code != TSDB_CODE_SUCCESS) { - qError("%s failed at line %d since %s", __func__, __LINE__, tstrerror(code)); - pTaskInfo->code = code; - T_LONG_JMP(pTaskInfo->env, code); - } + QUERY_CHECK_CODE(code, lino, _end); bool hasRemain = hasRemainResults(&pInfo->groupResInfo); if (!hasRemain) { @@ -1096,31 +1089,42 @@ static SSDataBlock* doStateWindowAgg(SOperatorInfo* pOperator) { } pOperator->resultInfo.totalRows += pBInfo->pRes->info.rows; - return (pBInfo->pRes->info.rows == 0) ? NULL : pBInfo->pRes; + +_end: + if (code != TSDB_CODE_SUCCESS) { + qError("%s failed at line %d since %s", __func__, lino, tstrerror(code)); + pTaskInfo->code = code; + T_LONG_JMP(pTaskInfo->env, code); + } + (*ppRes) = (pBInfo->pRes->info.rows == 0) ? NULL : pBInfo->pRes; + return code; } -static SSDataBlock* doBuildIntervalResult(SOperatorInfo* pOperator) { +static SSDataBlock* doStateWindowAgg(SOperatorInfo* pOperator) { + SSDataBlock* pRes = NULL; + int32_t code = doStateWindowAggNext(pOperator, &pRes); + return pRes; +} + +static int32_t doBuildIntervalResultNext(SOperatorInfo* pOperator, SSDataBlock** ppRes) { + int32_t code = TSDB_CODE_SUCCESS; + int32_t lino = 0; SIntervalAggOperatorInfo* pInfo = pOperator->info; SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo; if (pOperator->status == OP_EXEC_DONE) { - return NULL; + (*ppRes) = NULL; + return code; } SSDataBlock* pBlock = pInfo->binfo.pRes; - pTaskInfo->code = pOperator->fpSet._openFn(pOperator); - if (pTaskInfo->code != TSDB_CODE_SUCCESS) { - return NULL; - } + code = pOperator->fpSet._openFn(pOperator); + QUERY_CHECK_CODE(code, lino, _end); while (1) { doBuildResultDatablock(pOperator, &pInfo->binfo, &pInfo->groupResInfo, pInfo->aggSup.pResultBuf); - int32_t code = doFilter(pBlock, pOperator->exprSupp.pFilterInfo, NULL); - if (code != TSDB_CODE_SUCCESS) { - qError("%s failed at line %d since %s", __func__, __LINE__, tstrerror(code)); - pTaskInfo->code = code; - T_LONG_JMP(pTaskInfo->env, code); - } + code = doFilter(pBlock, pOperator->exprSupp.pFilterInfo, NULL); + QUERY_CHECK_CODE(code, lino, _end); bool hasRemain = hasRemainResults(&pInfo->groupResInfo); if (!hasRemain) { @@ -1136,7 +1140,20 @@ static SSDataBlock* doBuildIntervalResult(SOperatorInfo* pOperator) { size_t rows = pBlock->info.rows; pOperator->resultInfo.totalRows += rows; - return (rows == 0) ? NULL : pBlock; +_end: + if (code != TSDB_CODE_SUCCESS) { + qError("%s failed at line %d since %s", __func__, lino, tstrerror(code)); + pTaskInfo->code = code; + T_LONG_JMP(pTaskInfo->env, code); + } + (*ppRes) = (rows == 0) ? NULL : pBlock; + return code; +} + +static SSDataBlock* doBuildIntervalResult(SOperatorInfo* pOperator) { + SSDataBlock* pRes = NULL; + int32_t code = doBuildIntervalResultNext(pOperator, &pRes); + return pRes; } static void destroyStateWindowOperatorInfo(void* param) { @@ -1429,9 +1446,10 @@ static void doSessionWindowAggImpl(SOperatorInfo* pOperator, SSessionAggOperator pRowSup->numOfRows, pBlock->info.rows, numOfOutput); } -static SSDataBlock* doSessionWindowAgg(SOperatorInfo* pOperator) { +static int32_t doSessionWindowAggNext(SOperatorInfo* pOperator, SSDataBlock** ppRes) { if (pOperator->status == OP_EXEC_DONE) { - return NULL; + (*ppRes) = NULL; + return TSDB_CODE_SUCCESS; } int32_t code = TSDB_CODE_SUCCESS; @@ -1458,7 +1476,8 @@ static SSDataBlock* doSessionWindowAgg(SOperatorInfo* pOperator) { } } pOperator->resultInfo.totalRows += pBInfo->pRes->info.rows; - return (pBInfo->pRes->info.rows == 0) ? NULL : pBInfo->pRes; + (*ppRes) = (pBInfo->pRes->info.rows == 0) ? NULL : pBInfo->pRes; + return code; } int64_t st = taosGetTimestampUs(); @@ -1519,7 +1538,14 @@ _end: pTaskInfo->code = code; T_LONG_JMP(pTaskInfo->env, code); } - return (pBInfo->pRes->info.rows == 0) ? NULL : pBInfo->pRes; + (*ppRes) = (pBInfo->pRes->info.rows == 0) ? NULL : pBInfo->pRes; + return code; +} + +static SSDataBlock* doSessionWindowAgg(SOperatorInfo* pOperator) { + SSDataBlock* pRes = NULL; + int32_t code = doSessionWindowAggNext(pOperator, &pRes); + return pRes; } // todo make this as an non-blocking operator @@ -1883,13 +1909,14 @@ _end: } } -static SSDataBlock* mergeAlignedIntervalAgg(SOperatorInfo* pOperator) { - SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo; - +static int32_t mergeAlignedIntervalAggNext(SOperatorInfo* pOperator, SSDataBlock** ppRes) { + SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo; + int32_t code = TSDB_CODE_SUCCESS; SMergeAlignedIntervalAggOperatorInfo* pMiaInfo = pOperator->info; SIntervalAggOperatorInfo* iaInfo = pMiaInfo->intervalAggOperatorInfo; if (pOperator->status == OP_EXEC_DONE) { - return NULL; + (*ppRes) = NULL; + return code; } SSDataBlock* pRes = iaInfo->binfo.pRes; @@ -1913,7 +1940,14 @@ static SSDataBlock* mergeAlignedIntervalAgg(SOperatorInfo* pOperator) { size_t rows = pRes->info.rows; pOperator->resultInfo.totalRows += rows; - return (rows == 0) ? NULL : pRes; + (*ppRes) = (rows == 0) ? NULL : pRes; + return code; +} + +static SSDataBlock* mergeAlignedIntervalAgg(SOperatorInfo* pOperator) { + SSDataBlock* pRes = NULL; + int32_t code = mergeAlignedIntervalAggNext(pOperator, &pRes); + return pRes; } SOperatorInfo* createMergeAlignedIntervalOperatorInfo(SOperatorInfo* downstream, SMergeAlignedIntervalPhysiNode* pNode, @@ -2151,7 +2185,7 @@ static void doMergeIntervalAggImpl(SOperatorInfo* pOperatorInfo, SResultRowInfo* } } -static SSDataBlock* doMergeIntervalAgg(SOperatorInfo* pOperator) { +static int32_t doMergeIntervalAggNext(SOperatorInfo* pOperator, SSDataBlock** ppRes) { int32_t code = TSDB_CODE_SUCCESS; int32_t lino = 0; SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo; @@ -2161,7 +2195,8 @@ static SSDataBlock* doMergeIntervalAgg(SOperatorInfo* pOperator) { SExprSupp* pExpSupp = &pOperator->exprSupp; if (pOperator->status == OP_EXEC_DONE) { - return NULL; + (*ppRes) = NULL; + return code; } SSDataBlock* pRes = iaInfo->binfo.pRes; @@ -2231,7 +2266,14 @@ _end: pTaskInfo->code = code; T_LONG_JMP(pTaskInfo->env, code); } - return (rows == 0) ? NULL : pRes; + (*ppRes) = (rows == 0) ? NULL : pRes; + return code; +} + +static SSDataBlock* doMergeIntervalAgg(SOperatorInfo* pOperator) { + SSDataBlock* pRes = NULL; + int32_t code = doMergeIntervalAggNext(pOperator, &pRes); + return pRes; } SOperatorInfo* createMergeIntervalOperatorInfo(SOperatorInfo* downstream, SMergeIntervalPhysiNode* pIntervalPhyNode, diff --git a/source/libs/sync/src/syncRaftLog.c b/source/libs/sync/src/syncRaftLog.c index 19c8837d83..57c70d8df1 100644 --- a/source/libs/sync/src/syncRaftLog.c +++ b/source/libs/sync/src/syncRaftLog.c @@ -51,7 +51,12 @@ SSyncLogStore* logStoreCreate(SSyncNode* pSyncNode) { taosLRUCacheSetStrictCapacity(pLogStore->pCache, false); pLogStore->data = taosMemoryMalloc(sizeof(SSyncLogStoreData)); - ASSERT(pLogStore->data != NULL); + if (!pLogStore->data) { + taosMemoryFree(pLogStore); + taosLRUCacheCleanup(pLogStore->pCache); + terrno = TSDB_CODE_OUT_OF_MEMORY; + return NULL; + } SSyncLogStoreData* pData = pLogStore->data; pData->pSyncNode = pSyncNode; @@ -60,7 +65,13 @@ SSyncLogStore* logStoreCreate(SSyncNode* pSyncNode) { taosThreadMutexInit(&(pData->mutex), NULL); pData->pWalHandle = walOpenReader(pData->pWal, NULL, 0); - ASSERT(pData->pWalHandle != NULL); + if (!pData->pWalHandle) { + taosMemoryFree(pLogStore); + taosLRUCacheCleanup(pLogStore->pCache); + taosThreadMutexDestroy(&(pData->mutex)); + terrno = TSDB_CODE_OUT_OF_MEMORY; + return NULL; + } pLogStore->syncLogUpdateCommitIndex = raftLogUpdateCommitIndex; pLogStore->syncLogCommitIndex = raftlogCommitIndex; @@ -110,7 +121,7 @@ static int32_t raftLogRestoreFromSnapshot(struct SSyncLogStore* pLogStore, SyncI SWal* pWal = pData->pWal; int32_t code = walRestoreFromSnapshot(pWal, snapshotIndex); if (code != 0) { - int32_t err = terrno; + int32_t err = code; const char* errStr = tstrerror(err); int32_t sysErr = errno; const char* sysErrStr = strerror(errno); @@ -118,10 +129,10 @@ static int32_t raftLogRestoreFromSnapshot(struct SSyncLogStore* pLogStore, SyncI sNError(pData->pSyncNode, "wal restore from snapshot error, index:%" PRId64 ", err:0x%x, msg:%s, syserr:%d, sysmsg:%s", snapshotIndex, err, errStr, sysErr, sysErrStr); - return -1; + TAOS_RETURN(err); } - return 0; + TAOS_RETURN(TSDB_CODE_SUCCESS); } SyncIndex raftLogBeginIndex(struct SSyncLogStore* pLogStore) { @@ -224,7 +235,8 @@ static int32_t raftLogAppendEntry(struct SSyncLogStore* pLogStore, SSyncRaftEntr sNError(pData->pSyncNode, "wal write error, index:%" PRId64 ", err:0x%x, msg:%s, syserr:%d, sysmsg:%s", pEntry->index, err, errStr, sysErr, sysErrStr); - return -1; + + TAOS_RETURN(err); } code = walFsync(pWal, forceSync); @@ -235,7 +247,7 @@ static int32_t raftLogAppendEntry(struct SSyncLogStore* pLogStore, SSyncRaftEntr sNTrace(pData->pSyncNode, "write index:%" PRId64 ", type:%s, origin type:%s, elapsed:%" PRId64, pEntry->index, TMSG_INFO(pEntry->msgType), TMSG_INFO(pEntry->originalRpcType), tsElapsed); - return 0; + TAOS_RETURN(TSDB_CODE_SUCCESS); } // entry found, return 0 @@ -253,10 +265,10 @@ int32_t raftLogGetEntry(struct SSyncLogStore* pLogStore, SyncIndex index, SSyncR SWalReader* pWalHandle = pData->pWalHandle; if (pWalHandle == NULL) { - terrno = TSDB_CODE_SYN_INTERNAL_ERROR; sError("vgId:%d, wal handle is NULL", pData->pSyncNode->vgId); taosThreadMutexUnlock(&(pData->mutex)); - return -1; + + TAOS_RETURN(TSDB_CODE_SYN_INTERNAL_ERROR); } int64_t ts2 = taosGetTimestampNs(); @@ -266,7 +278,7 @@ int32_t raftLogGetEntry(struct SSyncLogStore* pLogStore, SyncIndex index, SSyncR // code = walReadVerCached(pWalHandle, index); if (code != 0) { - int32_t err = terrno; + int32_t err = code; const char* errStr = tstrerror(err); int32_t sysErr = errno; const char* sysErrStr = strerror(errno); @@ -286,7 +298,8 @@ int32_t raftLogGetEntry(struct SSyncLogStore* pLogStore, SyncIndex index, SSyncR */ taosThreadMutexUnlock(&(pData->mutex)); - return code; + + TAOS_RETURN(code); } *ppEntry = syncEntryBuild(pWalHandle->pHead->head.bodyLen); @@ -319,7 +332,7 @@ int32_t raftLogGetEntry(struct SSyncLogStore* pLogStore, SyncIndex index, SSyncR ", elapsed-build:%" PRId64, index, tsElapsed, tsElapsedLock, tsElapsedRead, tsElapsedBuild); - return code; + TAOS_RETURN(code); } // truncate semantic @@ -329,7 +342,7 @@ static int32_t raftLogTruncate(struct SSyncLogStore* pLogStore, SyncIndex fromIn int32_t code = walRollback(pWal, fromIndex); if (code != 0) { - int32_t err = terrno; + int32_t err = code; const char* errStr = tstrerror(err); int32_t sysErr = errno; const char* sysErrStr = strerror(errno); @@ -339,7 +352,8 @@ static int32_t raftLogTruncate(struct SSyncLogStore* pLogStore, SyncIndex fromIn // event log sNTrace(pData->pSyncNode, "log truncate, from-index:%" PRId64, fromIndex); - return code; + + TAOS_RETURN(code); } // entry found, return 0 @@ -352,16 +366,16 @@ static int32_t raftLogGetLastEntry(SSyncLogStore* pLogStore, SSyncRaftEntry** pp *ppLastEntry = NULL; if (walIsEmpty(pWal)) { - terrno = TSDB_CODE_WAL_LOG_NOT_EXIST; - return -1; + TAOS_RETURN(TSDB_CODE_WAL_LOG_NOT_EXIST); } else { SyncIndex lastIndex = raftLogLastIndex(pLogStore); ASSERT(lastIndex >= SYNC_INDEX_BEGIN); int32_t code = raftLogGetEntry(pLogStore, lastIndex, ppLastEntry); - return code; + + TAOS_RETURN(code); } - return -1; + TAOS_RETURN(TSDB_CODE_FAILED); } int32_t raftLogUpdateCommitIndex(SSyncLogStore* pLogStore, SyncIndex index) { @@ -375,20 +389,22 @@ int32_t raftLogUpdateCommitIndex(SSyncLogStore* pLogStore, SyncIndex index) { if (index < snapshotVer || index > wallastVer) { // ignore - return 0; + TAOS_RETURN(TSDB_CODE_SUCCESS); } int32_t code = walCommit(pWal, index); if (code != 0) { - int32_t err = terrno; + int32_t err = code; const char* errStr = tstrerror(err); int32_t sysErr = errno; const char* sysErrStr = strerror(errno); sError("vgId:%d, wal update commit index error, index:%" PRId64 ", err:0x%x, msg:%s, syserr:%d, sysmsg:%s", pData->pSyncNode->vgId, index, err, errStr, sysErr, sysErrStr); - return -1; + + TAOS_RETURN(code); } - return 0; + + TAOS_RETURN(TSDB_CODE_SUCCESS); } SyncIndex raftlogCommitIndex(SSyncLogStore* pLogStore) { @@ -405,5 +421,6 @@ SyncIndex logStoreFirstIndex(SSyncLogStore* pLogStore) { SyncIndex logStoreWalCommitVer(SSyncLogStore* pLogStore) { SSyncLogStoreData* pData = pLogStore->data; SWal* pWal = pData->pWal; + return walGetCommittedVer(pWal); } diff --git a/source/libs/sync/src/syncRaftStore.c b/source/libs/sync/src/syncRaftStore.c index c200c6cb4b..7f702c3766 100644 --- a/source/libs/sync/src/syncRaftStore.c +++ b/source/libs/sync/src/syncRaftStore.c @@ -25,17 +25,17 @@ static int32_t raftStoreDecode(const SJson *pJson, SRaftStore *pStore) { int32_t code = 0; tjsonGetNumberValue(pJson, "current_term", pStore->currentTerm, code); - if (code < 0) return -1; + if (code < 0) TAOS_RETURN(TSDB_CODE_FAILED); tjsonGetNumberValue(pJson, "vote_for_addr", pStore->voteFor.addr, code); - if (code < 0) return -1; + if (code < 0) TAOS_RETURN(TSDB_CODE_FAILED); tjsonGetInt32ValueFromDouble(pJson, "vote_for_vgid", pStore->voteFor.vgId, code); - if (code < 0) return -1; + if (code < 0) TAOS_RETURN(TSDB_CODE_FAILED); - return 0; + TAOS_RETURN(TSDB_CODE_SUCCESS); } int32_t raftStoreReadFile(SSyncNode *pNode) { - int32_t code = -1; + int32_t code = -1, lino = 0; TdFilePtr pFile = NULL; char *pData = NULL; SJson *pJson = NULL; @@ -52,41 +52,38 @@ int32_t raftStoreReadFile(SSyncNode *pNode) { pFile = taosOpenFile(file, TD_FILE_READ); if (pFile == NULL) { - terrno = TAOS_SYSTEM_ERROR(errno); sError("vgId:%d, failed to open raft store file:%s since %s", pNode->vgId, file, terrstr()); - goto _OVER; + + TAOS_CHECK_GOTO(TAOS_SYSTEM_ERROR(errno), &lino, _OVER); } int64_t size = 0; if (taosFStatFile(pFile, &size, NULL) < 0) { - terrno = TAOS_SYSTEM_ERROR(errno); sError("vgId:%d, failed to fstat raft store file:%s since %s", pNode->vgId, file, terrstr()); - goto _OVER; + + TAOS_CHECK_GOTO(TAOS_SYSTEM_ERROR(errno), &lino, _OVER); } pData = taosMemoryMalloc(size + 1); if (pData == NULL) { - terrno = TSDB_CODE_OUT_OF_MEMORY; - goto _OVER; + TAOS_CHECK_GOTO(TSDB_CODE_OUT_OF_MEMORY, &lino, _OVER); } if (taosReadFile(pFile, pData, size) != size) { - terrno = TAOS_SYSTEM_ERROR(errno); sError("vgId:%d, failed to read raft store file:%s since %s", pNode->vgId, file, terrstr()); - goto _OVER; + + TAOS_CHECK_GOTO(TAOS_SYSTEM_ERROR(errno), &lino, _OVER); } pData[size] = '\0'; pJson = tjsonParse(pData); if (pJson == NULL) { - terrno = TSDB_CODE_INVALID_JSON_FORMAT; - goto _OVER; + TAOS_CHECK_GOTO(TSDB_CODE_INVALID_JSON_FORMAT, &lino, _OVER); } if (raftStoreDecode(pJson, pStore) < 0) { - terrno = TSDB_CODE_INVALID_JSON_FORMAT; - goto _OVER; + TAOS_CHECK_GOTO(TSDB_CODE_INVALID_JSON_FORMAT, &lino, _OVER); } code = 0; @@ -100,18 +97,20 @@ _OVER: if (code != 0) { sError("vgId:%d, failed to read raft store file:%s since %s", pNode->vgId, file, terrstr()); } - return code; + + TAOS_RETURN(code); } static int32_t raftStoreEncode(SJson *pJson, SRaftStore *pStore) { - if (tjsonAddIntegerToObject(pJson, "current_term", pStore->currentTerm) < 0) return -1; - if (tjsonAddIntegerToObject(pJson, "vote_for_addr", pStore->voteFor.addr) < 0) return -1; - if (tjsonAddDoubleToObject(pJson, "vote_for_vgid", pStore->voteFor.vgId) < 0) return -1; - return 0; + if (tjsonAddIntegerToObject(pJson, "current_term", pStore->currentTerm) < 0) TAOS_RETURN(TSDB_CODE_FAILED); + if (tjsonAddIntegerToObject(pJson, "vote_for_addr", pStore->voteFor.addr) < 0) TAOS_RETURN(TSDB_CODE_FAILED); + if (tjsonAddDoubleToObject(pJson, "vote_for_vgid", pStore->voteFor.vgId) < 0) TAOS_RETURN(TSDB_CODE_FAILED); + + TAOS_RETURN(TSDB_CODE_SUCCESS); } int32_t raftStoreWriteFile(SSyncNode *pNode) { - int32_t code = -1; + int32_t code = -1, lino = 0; char *buffer = NULL; SJson *pJson = NULL; TdFilePtr pFile = NULL; @@ -120,23 +119,23 @@ int32_t raftStoreWriteFile(SSyncNode *pNode) { char file[PATH_MAX] = {0}; snprintf(file, sizeof(file), "%s.bak", realfile); - terrno = TSDB_CODE_OUT_OF_MEMORY; pJson = tjsonCreateObject(); - if (pJson == NULL) goto _OVER; - if (raftStoreEncode(pJson, pStore) != 0) goto _OVER; + if (pJson == NULL) TAOS_CHECK_GOTO(TSDB_CODE_OUT_OF_MEMORY, &lino, _OVER); + if (raftStoreEncode(pJson, pStore) != 0) TAOS_CHECK_GOTO(TSDB_CODE_OUT_OF_MEMORY, &lino, _OVER); + buffer = tjsonToString(pJson); - if (buffer == NULL) goto _OVER; - terrno = 0; + if (buffer == NULL) TAOS_CHECK_GOTO(TSDB_CODE_OUT_OF_MEMORY, &lino, _OVER); pFile = taosOpenFile(file, TD_FILE_CREATE | TD_FILE_WRITE | TD_FILE_TRUNC | TD_FILE_WRITE_THROUGH); - if (pFile == NULL) goto _OVER; + if (pFile == NULL) TAOS_CHECK_GOTO(TAOS_SYSTEM_ERROR(errno), &lino, _OVER); int32_t len = strlen(buffer); - if (taosWriteFile(pFile, buffer, len) <= 0) goto _OVER; - if (taosFsyncFile(pFile) < 0) goto _OVER; + if (taosWriteFile(pFile, buffer, len) <= 0) TAOS_CHECK_GOTO(TAOS_SYSTEM_ERROR(errno), &lino, _OVER); + + if (taosFsyncFile(pFile) < 0) TAOS_CHECK_GOTO(TAOS_SYSTEM_ERROR(errno), &lino, _OVER); taosCloseFile(&pFile); - if (taosRenameFile(file, realfile) != 0) goto _OVER; + if (taosRenameFile(file, realfile) != 0) TAOS_CHECK_GOTO(TAOS_SYSTEM_ERROR(errno), &lino, _OVER); code = 0; sInfo("vgId:%d, succeed to write raft store file:%s, term:%" PRId64, pNode->vgId, realfile, pStore->currentTerm); @@ -147,7 +146,6 @@ _OVER: if (pFile != NULL) taosCloseFile(&pFile); if (code != 0) { - if (terrno == 0) terrno = TAOS_SYSTEM_ERROR(errno); sError("vgId:%d, failed to write raft store file:%s since %s", pNode->vgId, realfile, terrstr()); } return code; diff --git a/source/libs/sync/src/syncReplication.c b/source/libs/sync/src/syncReplication.c index 9312719be7..dfe9f51af2 100644 --- a/source/libs/sync/src/syncReplication.c +++ b/source/libs/sync/src/syncReplication.c @@ -52,7 +52,8 @@ int32_t syncNodeReplicateReset(SSyncNode* pNode, SRaftId* pDestId) { SSyncLogReplMgr* pMgr = syncNodeGetLogReplMgr(pNode, pDestId); syncLogReplReset(pMgr); taosThreadMutexUnlock(&pBuf->mutex); - return 0; + + TAOS_RETURN(TSDB_CODE_SUCCESS); } int32_t syncNodeReplicate(SSyncNode* pNode) { @@ -60,13 +61,14 @@ int32_t syncNodeReplicate(SSyncNode* pNode) { taosThreadMutexLock(&pBuf->mutex); int32_t ret = syncNodeReplicateWithoutLock(pNode); taosThreadMutexUnlock(&pBuf->mutex); - return ret; + + TAOS_RETURN(ret); } int32_t syncNodeReplicateWithoutLock(SSyncNode* pNode) { if ((pNode->state != TAOS_SYNC_STATE_LEADER && pNode->state != TAOS_SYNC_STATE_ASSIGNED_LEADER) || pNode->raftCfg.cfg.totalReplicaNum == 1) { - return -1; + TAOS_RETURN(TSDB_CODE_FAILED); } for (int32_t i = 0; i < pNode->totalReplicaNum; i++) { if (syncUtilSameId(&pNode->replicasId[i], &pNode->myRaftId)) { @@ -75,14 +77,16 @@ int32_t syncNodeReplicateWithoutLock(SSyncNode* pNode) { SSyncLogReplMgr* pMgr = pNode->logReplMgrs[i]; (void)syncLogReplStart(pMgr, pNode); } - return 0; + + TAOS_RETURN(TSDB_CODE_SUCCESS); } int32_t syncNodeSendAppendEntries(SSyncNode* pSyncNode, const SRaftId* destRaftId, SRpcMsg* pRpcMsg) { SyncAppendEntries* pMsg = pRpcMsg->pCont; pMsg->destId = *destRaftId; syncNodeSendMsgById(destRaftId, pSyncNode, pRpcMsg); - return 0; + + TAOS_RETURN(TSDB_CODE_SUCCESS); } int32_t syncNodeSendHeartbeat(SSyncNode* pSyncNode, const SRaftId* destId, SRpcMsg* pMsg) { @@ -112,5 +116,5 @@ int32_t syncNodeHeartbeatPeers(SSyncNode* pSyncNode) { syncNodeSendHeartbeat(pSyncNode, &pSyncMsg->destId, &rpcMsg); } - return 0; + TAOS_RETURN(TSDB_CODE_SUCCESS); } diff --git a/source/libs/sync/src/syncRequestVote.c b/source/libs/sync/src/syncRequestVote.c index 77e5498127..0e50cca94c 100644 --- a/source/libs/sync/src/syncRequestVote.c +++ b/source/libs/sync/src/syncRequestVote.c @@ -20,7 +20,6 @@ #include "syncRaftStore.h" #include "syncUtil.h" #include "syncVoteMgr.h" -#include "syncUtil.h" // TLA+ Spec // HandleRequestVoteRequest(i, j, m) == @@ -95,7 +94,8 @@ int32_t syncNodeOnRequestVote(SSyncNode* ths, const SRpcMsg* pRpcMsg) { // if already drop replica, do not process if (!syncNodeInRaftGroup(ths, &pMsg->srcId)) { syncLogRecvRequestVote(ths, pMsg, -1, "not in my config"); - return -1; + + TAOS_RETURN(TSDB_CODE_FAILED); } bool logOK = syncNodeOnRequestVoteLogOK(ths, pMsg); @@ -122,8 +122,8 @@ int32_t syncNodeOnRequestVote(SSyncNode* ths, const SRpcMsg* pRpcMsg) { // send msg SRpcMsg rpcMsg = {0}; - ret = syncBuildRequestVoteReply(&rpcMsg, ths->vgId); - ASSERT(ret == 0); + + TAOS_CHECK_RETURN(syncBuildRequestVoteReply(&rpcMsg, ths->vgId)); SyncRequestVoteReply* pReply = rpcMsg.pCont; pReply->srcId = ths->myRaftId; @@ -138,5 +138,6 @@ int32_t syncNodeOnRequestVote(SSyncNode* ths, const SRpcMsg* pRpcMsg) { syncNodeSendMsgById(&pReply->destId, ths, &rpcMsg); if (resetElect) syncNodeResetElectTimer(ths); - return 0; + + TAOS_RETURN(TSDB_CODE_SUCCESS); } diff --git a/source/libs/sync/src/syncRequestVoteReply.c b/source/libs/sync/src/syncRequestVoteReply.c index 25c9f813a6..10d9a6c96b 100644 --- a/source/libs/sync/src/syncRequestVoteReply.c +++ b/source/libs/sync/src/syncRequestVoteReply.c @@ -45,19 +45,22 @@ int32_t syncNodeOnRequestVoteReply(SSyncNode* ths, const SRpcMsg* pRpcMsg) { // if already drop replica, do not process if (!syncNodeInRaftGroup(ths, &(pMsg->srcId))) { syncLogRecvRequestVoteReply(ths, pMsg, "not in my config"); - return -1; + + TAOS_RETURN(TSDB_CODE_FAILED); } SyncTerm currentTerm = raftStoreGetTerm(ths); // drop stale response if (pMsg->term < currentTerm) { syncLogRecvRequestVoteReply(ths, pMsg, "drop stale response"); - return -1; + + TAOS_RETURN(TSDB_CODE_FAILED); } if (pMsg->term > currentTerm) { syncLogRecvRequestVoteReply(ths, pMsg, "error term"); syncNodeStepDown(ths, pMsg->term); - return -1; + + TAOS_RETURN(TSDB_CODE_FAILED); } syncLogRecvRequestVoteReply(ths, pMsg, ""); @@ -69,7 +72,8 @@ int32_t syncNodeOnRequestVoteReply(SSyncNode* ths, const SRpcMsg* pRpcMsg) { if (ths->pVotesRespond->term != pMsg->term) { sNError(ths, "vote respond error vote-respond-mgr term:%" PRIu64 ", msg term:%" PRIu64 "", ths->pVotesRespond->term, pMsg->term); - return -1; + + TAOS_RETURN(TSDB_CODE_FAILED); } votesRespondAdd(ths->pVotesRespond, pMsg); @@ -93,5 +97,5 @@ int32_t syncNodeOnRequestVoteReply(SSyncNode* ths, const SRpcMsg* pRpcMsg) { } } - return 0; + TAOS_RETURN(TSDB_CODE_SUCCESS); } diff --git a/source/libs/tdb/src/db/tdbBtree.c b/source/libs/tdb/src/db/tdbBtree.c index 4dd3d3298c..187d65d975 100644 --- a/source/libs/tdb/src/db/tdbBtree.c +++ b/source/libs/tdb/src/db/tdbBtree.c @@ -114,7 +114,7 @@ int tdbBtreeOpen(int keyLen, int valLen, SPager *pPager, char const *tbname, SPg ret = tdbBegin(pEnv, &txn, tdbDefaultMalloc, tdbDefaultFree, NULL, TDB_TXN_WRITE | TDB_TXN_READ_UNCOMMITTED); if (ret < 0) { tdbOsFree(pBt); - return -1; + return ret; } SBtreeInitPageArg zArg; @@ -124,7 +124,7 @@ int tdbBtreeOpen(int keyLen, int valLen, SPager *pPager, char const *tbname, SPg if (ret < 0) { tdbAbort(pEnv, txn); tdbOsFree(pBt); - return -1; + return ret; } ret = tdbPagerWrite(pPager, pPage); @@ -132,7 +132,7 @@ int tdbBtreeOpen(int keyLen, int valLen, SPager *pPager, char const *tbname, SPg tdbError("failed to write page since %s", terrstr()); tdbAbort(pEnv, txn); tdbOsFree(pBt); - return -1; + return ret; } if (strcmp(TDB_MAINDB_NAME, tbname)) { @@ -145,20 +145,23 @@ int tdbBtreeOpen(int keyLen, int valLen, SPager *pPager, char const *tbname, SPg if (ret < 0) { tdbAbort(pEnv, txn); tdbOsFree(pBt); - return -1; + return ret; } } tdbPCacheRelease(pPager->pCache, pPage, txn); - tdbCommit(pPager->pEnv, txn); - tdbPostCommit(pPager->pEnv, txn); + ret = tdbCommit(pPager->pEnv, txn); + if (ret) return ret; + + ret = tdbPostCommit(pPager->pEnv, txn); + if (ret) return ret; } if (pgno == 0) { tdbError("tdb/btree-open: pgno cannot be zero."); tdbOsFree(pBt); - return -1; + ASSERT(0); } pBt->root = pgno; /* @@ -200,7 +203,7 @@ int tdbBtreeInsert(SBTree *pBt, const void *pKey, int kLen, const void *pVal, in if (ret < 0) { tdbBtcClose(&btc); tdbError("tdb/btree-insert: btc move to failed with ret: %d.", ret); - return -1; + return ret; } if (btc.idx == -1) { @@ -212,7 +215,7 @@ int tdbBtreeInsert(SBTree *pBt, const void *pKey, int kLen, const void *pVal, in // dup key not allowed with insert tdbBtcClose(&btc); tdbError("tdb/btree-insert: dup key. pKey: %p, kLen: %d, btc: %p, pTxn: %p", pKey, kLen, &btc, pTxn); - return -1; + return TSDB_CODE_DUP_KEY; } } @@ -220,7 +223,7 @@ int tdbBtreeInsert(SBTree *pBt, const void *pKey, int kLen, const void *pVal, in if (ret < 0) { tdbBtcClose(&btc); tdbError("tdb/btree-insert: btc upsert failed with ret: %d.", ret); - return -1; + return ret; } tdbBtcClose(&btc); @@ -245,18 +248,19 @@ int tdbBtreeDelete(SBTree *pBt, const void *pKey, int kLen, TXN *pTxn) { if (ret < 0) { tdbBtcClose(&btc); tdbError("tdb/btree-delete: btc move to failed with ret: %d.", ret); - return -1; + return ret; } if (btc.idx < 0 || c != 0) { tdbBtcClose(&btc); - return -1; + return TSDB_CODE_NOT_FOUND; } // delete the key - if (tdbBtcDelete(&btc) < 0) { + ret = tdbBtcDelete(&btc); + if (ret < 0) { tdbBtcClose(&btc); - return -1; + return ret; } /* SArray *ofps = btc.coder.ofps; @@ -341,13 +345,12 @@ int tdbBtreePGet(SBTree *pBt, const void *pKey, int kLen, void **ppKey, int *pkL if (ret < 0) { tdbBtcClose(&btc); tdbError("tdb/btree-pget: btc move to failed with ret: %d.", ret); - return -1; + return ret; } if (btc.idx < 0 || cret) { tdbBtcClose(&btc); - - return -1; + return TSDB_CODE_NOT_FOUND; } pCell = tdbPageGetCell(btc.pPage, btc.idx); @@ -355,7 +358,7 @@ int tdbBtreePGet(SBTree *pBt, const void *pKey, int kLen, void **ppKey, int *pkL if (ret < 0) { tdbBtcClose(&btc); tdbError("tdb/btree-pget: decode cell failed with ret: %d.", ret); - return -1; + return ret; } if (ppKey) { @@ -363,7 +366,7 @@ int tdbBtreePGet(SBTree *pBt, const void *pKey, int kLen, void **ppKey, int *pkL if (pTKey == NULL) { tdbBtcClose(&btc); tdbError("tdb/btree-pget: realloc pTKey failed."); - return -1; + return terrno; } *ppKey = pTKey; *pkLen = cd.kLen; @@ -375,7 +378,7 @@ int tdbBtreePGet(SBTree *pBt, const void *pKey, int kLen, void **ppKey, int *pkL if (pTVal == NULL) { tdbBtcClose(&btc); tdbError("tdb/btree-pget: realloc pTVal failed."); - return -1; + return terrno; } *ppVal = pTVal; *vLen = cd.vLen; @@ -495,7 +498,7 @@ static int tdbBtreeBalanceDeeper(SBTree *pBt, SPage *pRoot, SPage **ppChild, TXN zArg.pBt = pBt; ret = tdbPagerFetchPage(pPager, &pgnoChild, &pChild, tdbBtreeInitPage, &zArg, pTxn); if (ret < 0) { - return -1; + return ret; } if (!leaf) { @@ -505,7 +508,7 @@ static int tdbBtreeBalanceDeeper(SBTree *pBt, SPage *pRoot, SPage **ppChild, TXN ret = tdbPagerWrite(pPager, pChild); if (ret < 0) { tdbError("failed to write page since %s", terrstr()); - return -1; + return ret; } // Copy the root page content to the child page @@ -516,7 +519,7 @@ static int tdbBtreeBalanceDeeper(SBTree *pBt, SPage *pRoot, SPage **ppChild, TXN zArg.pBt = pBt; ret = tdbBtreeInitPage(pRoot, &zArg, 0); if (ret < 0) { - return -1; + return ret; } pIntHdr = (SIntHdr *)(pRoot->pData); @@ -557,13 +560,13 @@ static int tdbBtreeBalanceNonRoot(SBTree *pBt, SPage *pParent, int idx, TXN *pTx } for (int i = 0; i < nOlds; i++) { if (ASSERT(sIdx + i <= nCells)) { - return -1; + return TSDB_CODE_FAILED; } SPgno pgno; if (sIdx + i == nCells) { if (ASSERT(!TDB_BTREE_PAGE_IS_LEAF(pParent))) { - return -1; + return TSDB_CODE_FAILED; } pgno = ((SIntHdr *)(pParent->pData))->pgno; } else { @@ -575,13 +578,13 @@ static int tdbBtreeBalanceNonRoot(SBTree *pBt, SPage *pParent, int idx, TXN *pTx &((SBtreeInitPageArg){.pBt = pBt, .flags = 0}), pTxn); if (ret < 0) { tdbError("tdb/btree-balance: fetch page failed with ret: %d.", ret); - return -1; + return TSDB_CODE_FAILED; } ret = tdbPagerWrite(pBt->pPager, pOlds[i]); if (ret < 0) { tdbError("failed to write page since %s", terrstr()); - return -1; + return TSDB_CODE_FAILED; } } // copy the parent key out if child pages are not leaf page @@ -608,7 +611,7 @@ static int tdbBtreeBalanceNonRoot(SBTree *pBt, SPage *pParent, int idx, TXN *pTx ret = tdbPagerWrite(pBt->pPager, pParent); if (ret < 0) { tdbError("failed to write page since %s", terrstr()); - return -1; + return ret; } // drop the cells on parent page @@ -718,7 +721,7 @@ static int tdbBtreeBalanceNonRoot(SBTree *pBt, SPage *pParent, int idx, TXN *pTx } if (ASSERT(infoNews[iNew - 1].cnt > 0)) { - return -1; + return TSDB_CODE_FAILED; } if (infoNews[iNew].size + szRCell >= infoNews[iNew - 1].size - szRCell) { @@ -763,13 +766,13 @@ static int tdbBtreeBalanceNonRoot(SBTree *pBt, SPage *pParent, int idx, TXN *pTx ret = tdbPagerFetchPage(pBt->pPager, &pgno, pNews + iNew, tdbBtreeInitPage, &iarg, pTxn); if (ret < 0) { tdbError("tdb/btree-balance: fetch page failed with ret: %d.", ret); - return -1; + return ret; } ret = tdbPagerWrite(pBt->pPager, pNews[iNew]); if (ret < 0) { tdbError("failed to write page since %s", terrstr()); - return -1; + return ret; } } } @@ -808,10 +811,10 @@ static int tdbBtreeBalanceNonRoot(SBTree *pBt, SPage *pParent, int idx, TXN *pTx szCell = tdbBtreeCellSize(pPage, pCell, 0, NULL, NULL); if (ASSERT(nNewCells <= infoNews[iNew].cnt)) { - return -1; + return TSDB_CODE_FAILED; } if (ASSERT(iNew < nNews)) { - return -1; + return TSDB_CODE_FAILED; } if (nNewCells < infoNews[iNew].cnt) { @@ -852,10 +855,10 @@ static int tdbBtreeBalanceNonRoot(SBTree *pBt, SPage *pParent, int idx, TXN *pTx } } else { if (ASSERT(childNotLeaf)) { - return -1; + return TSDB_CODE_FAILED; } if (ASSERT(iNew < nNews - 1)) { - return -1; + return TSDB_CODE_FAILED; } // set current new page right-most child @@ -863,7 +866,7 @@ static int tdbBtreeBalanceNonRoot(SBTree *pBt, SPage *pParent, int idx, TXN *pTx // insert to parent as divider cell if (ASSERT(iNew < nNews - 1)) { - return -1; + return TSDB_CODE_FAILED; } ((SPgno *)pCell)[0] = TDB_PAGE_PGNO(pNews[iNew]); tdbPageInsertCell(pParent, sIdx++, pCell, szCell, 0); @@ -880,7 +883,7 @@ static int tdbBtreeBalanceNonRoot(SBTree *pBt, SPage *pParent, int idx, TXN *pTx if (childNotLeaf) { if (ASSERT(TDB_PAGE_TOTAL_CELLS(pNews[nNews - 1]) == infoNews[nNews - 1].cnt)) { - return -1; + return TSDB_CODE_FAILED; } ((SIntHdr *)(pNews[nNews - 1]->pData))->pgno = rPgno; @@ -961,7 +964,7 @@ static int tdbBtreeBalance(SBTC *pBtc) { ret = tdbBtreeBalanceDeeper(pBtc->pBt, pPage, &(pBtc->pgStack[1]), pBtc->pTxn); if (ret < 0) { - return -1; + return ret; } pBtc->idx = 0; @@ -975,7 +978,7 @@ static int tdbBtreeBalance(SBTC *pBtc) { ret = tdbBtreeBalanceNonRoot(pBtc->pBt, pParent, pBtc->idxStack[pBtc->iPage - 1], pBtc->pTxn); if (ret < 0) { - return -1; + return ret; } tdbPagerReturnPage(pBtc->pBt->pPager, pBtc->pPage, pBtc->pTxn); @@ -998,14 +1001,14 @@ static int tdbFetchOvflPage(SPgno *pPgno, SPage **ppOfp, TXN *pTxn, SBTree *pBt) iArg.flags = TDB_FLAG_ADD(0, TDB_BTREE_OVFL); ret = tdbPagerFetchPage(pBt->pPager, pPgno, ppOfp, tdbBtreeInitPage, &iArg, pTxn); if (ret < 0) { - return -1; + return ret; } // mark dirty ret = tdbPagerWrite(pBt->pPager, *ppOfp); if (ret < 0) { tdbError("failed to write page since %s", terrstr()); - return -1; + return ret; } tdbPCacheRelease(pBt->pPager->pCache, *ppOfp, pTxn); @@ -1021,7 +1024,7 @@ static int tdbLoadOvflPage(SPgno *pPgno, SPage **ppOfp, TXN *pTxn, SBTree *pBt) iArg.flags = TDB_FLAG_ADD(0, TDB_BTREE_OVFL); ret = tdbPagerFetchPage(pBt->pPager, pPgno, ppOfp, tdbBtreeInitPage, &iArg, pTxn); if (ret < 0) { - return -1; + return ret; } return ret; @@ -1058,13 +1061,13 @@ static int tdbBtreeEncodePayload(SPage *pPage, SCell *pCell, int nHeader, const ret = tdbFetchOvflPage(&pgno, &ofp, pTxn, pBt); if (ret < 0) { - return -1; + return ret; } // local buffer for cell SCell *pBuf = tdbRealloc(NULL, pBt->pageSize); if (pBuf == NULL) { - return -1; + return ret; } int nLeft = nPayload; @@ -1078,7 +1081,7 @@ static int tdbBtreeEncodePayload(SPage *pPage, SCell *pCell, int nHeader, const if (nLocal > nHeader + kLen + sizeof(SPgno)) { if (ASSERT(pVal != NULL && vLen != 0)) { tdbFree(pBuf); - return -1; + return TSDB_CODE_FAILED; } memcpy(pCell + nHeader + kLen, pVal, nLocal - nHeader - kLen - sizeof(SPgno)); nLeft -= nLocal - nHeader - kLen - sizeof(SPgno); @@ -1103,7 +1106,7 @@ static int tdbBtreeEncodePayload(SPage *pPage, SCell *pCell, int nHeader, const ret = tdbFetchOvflPage(&pgno, &nextOfp, pTxn, pBt); if (ret < 0) { tdbFree(pBuf); - return -1; + return ret; } } else { pgno = 0; @@ -1115,7 +1118,7 @@ static int tdbBtreeEncodePayload(SPage *pPage, SCell *pCell, int nHeader, const ret = tdbPageInsertCell(ofp, 0, pBuf, bytes + sizeof(pgno), 0); if (ret < 0) { tdbFree(pBuf); - return -1; + return ret; } ofp = nextOfp; @@ -1163,7 +1166,7 @@ static int tdbBtreeEncodePayload(SPage *pPage, SCell *pCell, int nHeader, const ret = tdbFetchOvflPage(&pgno, &nextOfp, pTxn, pBt); if (ret < 0) { tdbFree(pBuf); - return -1; + return ret; } } } else { @@ -1171,7 +1174,7 @@ static int tdbBtreeEncodePayload(SPage *pPage, SCell *pCell, int nHeader, const ret = tdbFetchOvflPage(&pgno, &nextOfp, pTxn, pBt); if (ret < 0) { tdbFree(pBuf); - return -1; + return ret; } } @@ -1179,7 +1182,7 @@ static int tdbBtreeEncodePayload(SPage *pPage, SCell *pCell, int nHeader, const ret = tdbPageInsertCell(ofp, 0, pBuf, bytes + sizeof(pgno), 0); if (ret < 0) { - return -1; + return ret; } ofp = nextOfp; @@ -1203,7 +1206,7 @@ static int tdbBtreeEncodePayload(SPage *pPage, SCell *pCell, int nHeader, const ret = tdbFetchOvflPage(&pgno, &nextOfp, pTxn, pBt); if (ret < 0) { tdbFree(pBuf); - return -1; + return ret; } } else { pgno = 0; @@ -1214,13 +1217,13 @@ static int tdbBtreeEncodePayload(SPage *pPage, SCell *pCell, int nHeader, const if (ofp == NULL) { tdbFree(pBuf); - return -1; + return ret; } ret = tdbPageInsertCell(ofp, 0, pBuf, bytes + sizeof(pgno), 0); if (ret < 0) { tdbFree(pBuf); - return -1; + return ret; } ofp = nextOfp; @@ -1245,13 +1248,13 @@ static int tdbBtreeEncodeCell(SPage *pPage, const void *pKey, int kLen, const vo int ret; if (ASSERT(pPage->kLen == TDB_VARIANT_LEN || pPage->kLen == kLen)) { - return -1; + return TSDB_CODE_FAILED; } if (ASSERT(pPage->vLen == TDB_VARIANT_LEN || pPage->vLen == vLen)) { - return -1; + return TSDB_CODE_FAILED; } if (ASSERT(pKey != NULL && kLen > 0)) { - return -1; + return TSDB_CODE_FAILED; } nPayload = 0; @@ -1263,7 +1266,7 @@ static int tdbBtreeEncodeCell(SPage *pPage, const void *pKey, int kLen, const vo if (!leaf) { if (pPage->vLen != sizeof(SPgno)) { tdbError("tdb/btree-encode-cell: invalid cell."); - return -1; + return TSDB_CODE_INVALID_PARA; } ((SPgno *)(pCell + nHeader))[0] = ((SPgno *)pVal)[0]; @@ -1290,7 +1293,7 @@ static int tdbBtreeEncodeCell(SPage *pPage, const void *pKey, int kLen, const vo if (ret < 0) { // TODO tdbError("tdb/btree-encode-cell: encode payload failed with ret: %d.", ret); - return -1; + return ret; } *szCell = nHeader + nPayload; @@ -1309,7 +1312,7 @@ static int tdbBtreeDecodePayload(SPage *pPage, const SCell *pCell, int nHeader, if (pDecoder->pVal) { if (TDB_BTREE_PAGE_IS_LEAF(pPage)) { tdbError("tdb/btree-decode-payload: leaf page with non-null pVal."); - return -1; + return TSDB_CODE_INVALID_DATA_FMT; } nPayload = pDecoder->kLen; } else { @@ -1344,7 +1347,7 @@ static int tdbBtreeDecodePayload(SPage *pPage, const SCell *pCell, int nHeader, // read partial val to local pDecoder->pVal = tdbRealloc(pDecoder->pVal, vLen); if (pDecoder->pVal == NULL) { - return -1; + return terrno; } TDB_CELLDECODER_SET_FREE_VAL(pDecoder); @@ -1361,7 +1364,7 @@ static int tdbBtreeDecodePayload(SPage *pPage, const SCell *pCell, int nHeader, while (pgno != 0) { ret = tdbLoadOvflPage(&pgno, &ofp, pTxn, pBt); if (ret < 0) { - return -1; + return ret; } /* if (pDecoder->ofps) { @@ -1389,7 +1392,7 @@ static int tdbBtreeDecodePayload(SPage *pPage, const SCell *pCell, int nHeader, // load partial key and nextPgno pDecoder->pKey = tdbRealloc(pDecoder->pKey, kLen); if (pDecoder->pKey == NULL) { - return -1; + return terrno; } TDB_CELLDECODER_SET_FREE_KEY(pDecoder); @@ -1406,7 +1409,7 @@ static int tdbBtreeDecodePayload(SPage *pPage, const SCell *pCell, int nHeader, // printf("tdb decode-ofp, pTxn: %p, pgno:%u by cell:%p\n", pTxn, pgno, pCell); ret = tdbLoadOvflPage(&pgno, &ofp, pTxn, pBt); if (ret < 0) { - return -1; + return ret; } /* if (pDecoder->ofps) { @@ -1439,7 +1442,7 @@ static int tdbBtreeDecodePayload(SPage *pPage, const SCell *pCell, int nHeader, // read partial val to local pDecoder->pVal = tdbRealloc(pDecoder->pVal, vLen); if (pDecoder->pVal == NULL) { - return -1; + return terrno; } TDB_CELLDECODER_SET_FREE_VAL(pDecoder); @@ -1459,7 +1462,7 @@ static int tdbBtreeDecodePayload(SPage *pPage, const SCell *pCell, int nHeader, while (nLeft > 0) { ret = tdbLoadOvflPage(&pgno, &ofp, pTxn, pBt); if (ret < 0) { - return -1; + return ret; } ofpCell = tdbPageGetCell(ofp, 0); @@ -1480,7 +1483,7 @@ static int tdbBtreeDecodePayload(SPage *pPage, const SCell *pCell, int nHeader, if (!pDecoder->pVal) { pDecoder->pVal = tdbRealloc(pDecoder->pVal, vLen); if (pDecoder->pVal == NULL) { - return -1; + return terrno; } TDB_CELLDECODER_SET_FREE_VAL(pDecoder); } @@ -1529,7 +1532,7 @@ static int tdbBtreeDecodeCell(SPage *pPage, const SCell *pCell, SCellDecoder *pD if (!leaf) { if (pPage->vLen != sizeof(SPgno)) { tdbError("tdb/btree-decode-cell: invalid cell."); - return -1; + return TSDB_CODE_INVALID_DATA_FMT; } pDecoder->pgno = ((SPgno *)(pCell + nHeader))[0]; @@ -1546,7 +1549,7 @@ static int tdbBtreeDecodeCell(SPage *pPage, const SCell *pCell, SCellDecoder *pD if (pPage->vLen == TDB_VARIANT_LEN) { if (!leaf) { tdbError("tdb/btree-decode-cell: not a leaf page."); - return -1; + return TSDB_CODE_INVALID_DATA_FMT; } nHeader += tdbGetVarInt(pCell + nHeader, &(pDecoder->vLen)); } else { @@ -1556,7 +1559,7 @@ static int tdbBtreeDecodeCell(SPage *pPage, const SCell *pCell, SCellDecoder *pD // 2. Decode payload part ret = tdbBtreeDecodePayload(pPage, pCell, nHeader, pDecoder, pTxn, pBt); if (ret < 0) { - return -1; + return ret; } return 0; @@ -1610,7 +1613,7 @@ static int tdbBtreeCellSize(const SPage *pPage, SCell *pCell, int dropOfp, TXN * while (pgno != 0) { ret = tdbLoadOvflPage(&pgno, &ofp, pTxn, pBt); if (ret < 0) { - return -1; + return ret; } SCell *ofpCell = tdbPageGetCell(ofp, 0); @@ -1627,7 +1630,7 @@ static int tdbBtreeCellSize(const SPage *pPage, SCell *pCell, int dropOfp, TXN * ret = tdbPagerWrite(pBt->pPager, ofp); if (ret < 0) { tdbError("failed to write page since %s", terrstr()); - return -1; + return ret; } /* tdbPageDropCell(ofp, 0, pTxn, pBt); @@ -1664,12 +1667,13 @@ int tdbBtcOpen(SBTC *pBtc, SBTree *pBt, TXN *pTxn) { if (pTxn == NULL) { TXN *pTxn = tdbOsCalloc(1, sizeof(*pTxn)); if (!pTxn) { - return -1; + return terrno; } - if (tdbTxnOpen(pTxn, 0, tdbDefaultMalloc, tdbDefaultFree, NULL, 0) < 0) { + int32_t ret = tdbTxnOpen(pTxn, 0, tdbDefaultMalloc, tdbDefaultFree, NULL, 0); + if (ret < 0) { tdbOsFree(pTxn); - return -1; + return ret; } pBtc->pTxn = pTxn; @@ -1698,12 +1702,12 @@ int tdbBtcMoveToFirst(SBTC *pBtc) { &((SBtreeInitPageArg){.pBt = pBt, .flags = TDB_BTREE_ROOT | TDB_BTREE_LEAF}), pBtc->pTxn); if (ret < 0) { tdbError("tdb/btc-move-tofirst: fetch page failed with ret: %d.", ret); - return -1; + return ret; } if (!TDB_BTREE_PAGE_IS_ROOT(pBtc->pPage)) { tdbError("tdb/btc-move-tofirst: not a root page"); - return -1; + return ret; } pBtc->iPage = 0; @@ -1713,7 +1717,7 @@ int tdbBtcMoveToFirst(SBTC *pBtc) { // no any data, point to an invalid position if (!TDB_BTREE_PAGE_IS_LEAF(pBtc->pPage)) { tdbError("tdb/btc-move-to-first: not a leaf page."); - return -1; + return TSDB_CODE_FAILED; } pBtc->idx = -1; @@ -1722,7 +1726,7 @@ int tdbBtcMoveToFirst(SBTC *pBtc) { } else { // TODO tdbError("tdb/btc-move-to-first: move from a dirty cursor."); - return -1; + return TSDB_CODE_FAILED; #if 0 // move from a position int iPage = 0; @@ -1755,7 +1759,7 @@ int tdbBtcMoveToFirst(SBTC *pBtc) { ret = tdbBtcMoveDownward(pBtc); if (ret < 0) { tdbError("tdb/btc-move-tofirst: btc move downward failed with ret: %d.", ret); - return -1; + return ret; } pBtc->idx = 0; @@ -1780,7 +1784,7 @@ int tdbBtcMoveToLast(SBTC *pBtc) { &((SBtreeInitPageArg){.pBt = pBt, .flags = TDB_BTREE_ROOT | TDB_BTREE_LEAF}), pBtc->pTxn); if (ret < 0) { tdbError("tdb/btc-move-tolast: fetch page failed with ret: %d.", ret); - return -1; + return ret; } nCells = TDB_PAGE_TOTAL_CELLS(pBtc->pPage); @@ -1791,7 +1795,7 @@ int tdbBtcMoveToLast(SBTC *pBtc) { // no data at all, point to an invalid position if (!TDB_BTREE_PAGE_IS_LEAF(pBtc->pPage)) { tdbError("tdb/btc-move-to-last: not a leaf page."); - return -1; + return TSDB_CODE_FAILED; } pBtc->idx = -1; @@ -1800,7 +1804,7 @@ int tdbBtcMoveToLast(SBTC *pBtc) { } else { // TODO tdbError("tdb/btc-move-to-last: move from a dirty cursor."); - return -1; + return TSDB_CODE_FAILED; #if 0 int iPage = 0; @@ -1838,7 +1842,7 @@ int tdbBtcMoveToLast(SBTC *pBtc) { ret = tdbBtcMoveDownward(pBtc); if (ret < 0) { tdbError("tdb/btc-move-tolast: btc move downward failed with ret: %d.", ret); - return -1; + return ret; } nCells = TDB_PAGE_TOTAL_CELLS(pBtc->pPage); @@ -1860,7 +1864,7 @@ int tdbBtreeNext(SBTC *pBtc, void **ppKey, int *kLen, void **ppVal, int *vLen) { // current cursor points to an invalid position if (pBtc->idx < 0) { - return -1; + return TSDB_CODE_FAILED; } pCell = tdbPageGetCell(pBtc->pPage, pBtc->idx); @@ -1868,12 +1872,12 @@ int tdbBtreeNext(SBTC *pBtc, void **ppKey, int *kLen, void **ppVal, int *vLen) { ret = tdbBtreeDecodeCell(pBtc->pPage, pCell, &cd, pBtc->pTxn, pBtc->pBt); if (ret < 0) { tdbError("tdb/btree-next: decode cell failed with ret: %d.", ret); - return -1; + return ret; } pKey = tdbRealloc(*ppKey, cd.kLen); if (pKey == NULL) { - return -1; + return terrno; } *ppKey = pKey; @@ -1885,7 +1889,7 @@ int tdbBtreeNext(SBTC *pBtc, void **ppKey, int *kLen, void **ppVal, int *vLen) { pVal = tdbRealloc(*ppVal, cd.vLen); if (pVal == NULL) { tdbFree(pKey); - return -1; + return terrno; } memcpy(pVal, cd.pVal, cd.vLen); @@ -1909,7 +1913,7 @@ int tdbBtreeNext(SBTC *pBtc, void **ppKey, int *kLen, void **ppVal, int *vLen) { ret = tdbBtcMoveToNext(pBtc); if (ret < 0) { tdbError("tdb/btree-next: btc move to next failed with ret: %d.", ret); - return -1; + return ret; } return 0; @@ -1923,7 +1927,7 @@ int tdbBtreePrev(SBTC *pBtc, void **ppKey, int *kLen, void **ppVal, int *vLen) { // current cursor points to an invalid position if (pBtc->idx < 0) { - return -1; + return TSDB_CODE_FAILED; } pCell = tdbPageGetCell(pBtc->pPage, pBtc->idx); @@ -1931,12 +1935,12 @@ int tdbBtreePrev(SBTC *pBtc, void **ppKey, int *kLen, void **ppVal, int *vLen) { ret = tdbBtreeDecodeCell(pBtc->pPage, pCell, &cd, pBtc->pTxn, pBtc->pBt); if (ret < 0) { tdbError("tdb/btree-prev: decode cell failed with ret: %d.", ret); - return -1; + return ret; } pKey = tdbRealloc(*ppKey, cd.kLen); if (pKey == NULL) { - return -1; + return terrno; } *ppKey = pKey; @@ -1948,7 +1952,7 @@ int tdbBtreePrev(SBTC *pBtc, void **ppKey, int *kLen, void **ppVal, int *vLen) { pVal = tdbRealloc(*ppVal, cd.vLen); if (pVal == NULL) { tdbFree(pKey); - return -1; + return terrno; } *ppVal = pVal; @@ -1959,7 +1963,7 @@ int tdbBtreePrev(SBTC *pBtc, void **ppKey, int *kLen, void **ppVal, int *vLen) { ret = tdbBtcMoveToPrev(pBtc); if (ret < 0) { tdbError("tdb/btree-prev: btc move to prev failed with ret: %d.", ret); - return -1; + return ret; } return 0; @@ -1972,10 +1976,10 @@ int tdbBtcMoveToNext(SBTC *pBtc) { if (!TDB_BTREE_PAGE_IS_LEAF(pBtc->pPage)) { tdbError("tdb/btc-move-to-next: not a leaf page."); - return -1; + return TSDB_CODE_FAILED; } - if (pBtc->idx < 0) return -1; + if (pBtc->idx < 0) return TSDB_CODE_FAILED; pBtc->idx++; if (pBtc->idx < TDB_PAGE_TOTAL_CELLS(pBtc->pPage)) { @@ -1994,7 +1998,7 @@ int tdbBtcMoveToNext(SBTC *pBtc) { if (TDB_BTREE_PAGE_IS_LEAF(pBtc->pPage)) { tdbError("tdb/btree-decode-cell: should not be a leaf page here."); - return -1; + return TSDB_CODE_FAILED; } if (pBtc->idx <= TDB_PAGE_TOTAL_CELLS(pBtc->pPage)) { break; @@ -2008,7 +2012,7 @@ int tdbBtcMoveToNext(SBTC *pBtc) { ret = tdbBtcMoveDownward(pBtc); if (ret < 0) { tdbError("tdb/btc-move-tonext: btc move downward failed with ret: %d.", ret); - return -1; + return ret; } pBtc->idx = 0; @@ -2018,7 +2022,7 @@ int tdbBtcMoveToNext(SBTC *pBtc) { } int tdbBtcMoveToPrev(SBTC *pBtc) { - if (pBtc->idx < 0) return -1; + if (pBtc->idx < 0) return TSDB_CODE_FAILED; pBtc->idx--; if (pBtc->idx >= 0) { @@ -2061,17 +2065,17 @@ static int tdbBtcMoveDownward(SBTC *pBtc) { if (pBtc->idx < 0) { tdbError("tdb/btc-move-downward: invalid idx: %d.", pBtc->idx); - return -1; + return TSDB_CODE_FAILED; } if (TDB_BTREE_PAGE_IS_LEAF(pBtc->pPage)) { tdbError("tdb/btc-move-downward: should not be a leaf page here."); - return -1; + return TSDB_CODE_FAILED; } if (TDB_BTREE_PAGE_IS_OVFL(pBtc->pPage)) { tdbError("tdb/btc-move-downward: should not be a ovfl page here."); - return -1; + return TSDB_CODE_FAILED; } if (pBtc->idx < TDB_PAGE_TOTAL_CELLS(pBtc->pPage)) { @@ -2083,7 +2087,7 @@ static int tdbBtcMoveDownward(SBTC *pBtc) { if (!pgno) { tdbError("tdb/btc-move-downward: invalid pgno."); - return -1; + return TSDB_CODE_FAILED; } pBtc->pgStack[pBtc->iPage] = pBtc->pPage; @@ -2096,14 +2100,14 @@ static int tdbBtcMoveDownward(SBTC *pBtc) { &((SBtreeInitPageArg){.pBt = pBtc->pBt, .flags = 0}), pBtc->pTxn); if (ret < 0) { tdbError("tdb/btc-move-downward: fetch page failed with ret: %d.", ret); - return -1; + return TSDB_CODE_FAILED; } return 0; } static int tdbBtcMoveUpward(SBTC *pBtc) { - if (pBtc->iPage == 0) return -1; + if (pBtc->iPage == 0) return TSDB_CODE_FAILED; tdbPagerReturnPage(pBtc->pBt->pPager, pBtc->pPage, pBtc->pTxn); @@ -2118,7 +2122,7 @@ int tdbBtcGet(SBTC *pBtc, const void **ppKey, int *kLen, const void **ppVal, int SCell *pCell; if (pBtc->idx < 0 || pBtc->idx >= TDB_PAGE_TOTAL_CELLS(pBtc->pPage)) { - return -1; + return TSDB_CODE_FAILED; } pCell = tdbPageGetCell(pBtc->pPage, pBtc->idx); @@ -2152,14 +2156,14 @@ int tdbBtcDelete(SBTC *pBtc) { if (idx < 0 || idx >= nCells) { tdbError("tdb/btc-delete: idx: %d out of range[%d, %d).", idx, 0, nCells); - return -1; + return TSDB_CODE_FAILED; } // drop the cell on the leaf ret = tdbPagerWrite(pPager, pBtc->pPage); if (ret < 0) { tdbError("failed to write page since %s", terrstr()); - return -1; + return ret; } bool destroyOfps = false; @@ -2200,7 +2204,7 @@ int tdbBtcDelete(SBTC *pBtc) { ret = tdbPagerWrite(pPager, pPage); if (ret < 0) { tdbError("failed to write page since %s", terrstr()); - return -1; + return ret; } // update the cell with new key @@ -2211,7 +2215,7 @@ int tdbBtcDelete(SBTC *pBtc) { if (ret < 0) { tdbOsFree(pCell); tdbError("tdb/btc-delete: page update cell failed with ret: %d.", ret); - return -1; + return ret; } tdbOsFree(pCell); @@ -2229,7 +2233,7 @@ int tdbBtcDelete(SBTC *pBtc) { ret = tdbBtreeBalance(pBtc); if (ret < 0) { tdbError("tdb/btc-delete: btree balance failed with ret: %d.", ret); - return -1; + return ret; } } @@ -2242,7 +2246,7 @@ int tdbBtcDelete(SBTC *pBtc) { // delete the leaf page and do balance if (TDB_PAGE_TOTAL_CELLS(pBtc->pPage) != 0) { tdbError("tdb/btc-delete: page to be deleted should be empty."); - return -1; + return TSDB_CODE_FAILED; } // printf("tdb/btc-delete: btree balance delete pgno: %d.\n", TDB_PAGE_PGNO(pBtc->pPage)); @@ -2250,7 +2254,7 @@ int tdbBtcDelete(SBTC *pBtc) { ret = tdbBtreeBalance(pBtc); if (ret < 0) { tdbError("tdb/btc-delete: btree balance failed with ret: %d.", ret); - return -1; + return ret; } } } @@ -2268,7 +2272,7 @@ int tdbBtcUpsert(SBTC *pBtc, const void *pKey, int kLen, const void *pData, int if (pBtc->idx < 0) { tdbError("tdb/btc-upsert: invalid idx: %d.", pBtc->idx); - return -1; + return TSDB_CODE_FAILED; } // alloc space @@ -2276,7 +2280,7 @@ int tdbBtcUpsert(SBTC *pBtc, const void *pKey, int kLen, const void *pData, int pBuf = tdbRealloc(pBtc->pBt->pBuf, pBtc->pBt->pageSize > szBuf ? szBuf : pBtc->pBt->pageSize); if (pBuf == NULL) { tdbError("tdb/btc-upsert: realloc pBuf failed."); - return -1; + return terrno; } pBtc->pBt->pBuf = pBuf; pCell = (SCell *)pBtc->pBt->pBuf; @@ -2285,35 +2289,35 @@ int tdbBtcUpsert(SBTC *pBtc, const void *pKey, int kLen, const void *pData, int ret = tdbBtreeEncodeCell(pBtc->pPage, pKey, kLen, pData, nData, pCell, &szCell, pBtc->pTxn, pBtc->pBt); if (ret < 0) { tdbError("tdb/btc-upsert: btree encode cell failed with ret: %d.", ret); - return -1; + return ret; } // mark dirty ret = tdbPagerWrite(pBtc->pBt->pPager, pBtc->pPage); if (ret < 0) { tdbError("failed to write page since %s", terrstr()); - return -1; + return ret; } // insert or update if (insert) { if (pBtc->idx > nCells) { tdbError("tdb/btc-upsert: invalid idx: %d, nCells: %d.", pBtc->idx, nCells); - return -1; + return TSDB_CODE_FAILED; } ret = tdbPageInsertCell(pBtc->pPage, pBtc->idx, pCell, szCell, 0); } else { if (pBtc->idx >= nCells) { tdbError("tdb/btc-upsert: invalid idx: %d, nCells: %d.", pBtc->idx, nCells); - return -1; + return TSDB_CODE_FAILED; } ret = tdbPageUpdateCell(pBtc->pPage, pBtc->idx, pCell, szCell, pBtc->pTxn, pBtc->pBt); } if (ret < 0) { tdbError("tdb/btc-upsert: page insert/update cell failed with ret: %d.", ret); - return -1; + return ret; } /* bool destroyOfps = false; @@ -2327,7 +2331,7 @@ int tdbBtcUpsert(SBTC *pBtc, const void *pKey, int kLen, const void *pData, int ret = tdbBtreeBalance(pBtc); if (ret < 0) { tdbError("tdb/btc-upsert: btree balance failed with ret: %d.", ret); - return -1; + return ret; } } /* @@ -2365,7 +2369,7 @@ int tdbBtcMoveTo(SBTC *pBtc, const void *pKey, int kLen, int *pCRst) { if (ret < 0) { // TODO tdbError("tdb/btc-move-to: fetch page failed with ret: %d.", ret); - return -1; + return ret; } pBtc->iPage = 0; @@ -2375,7 +2379,7 @@ int tdbBtcMoveTo(SBTC *pBtc, const void *pKey, int kLen, int *pCRst) { } else { // TODO tdbError("tdb/btc-move-to: move from a dirty cursor."); - return -1; + return TSDB_CODE_FAILED; #if 0 SPage *pPage; int idx; @@ -2499,7 +2503,7 @@ int tdbBtcClose(SBTC *pBtc) { for (;;) { if (NULL == pBtc->pPage) { tdbError("tdb/btc-close: null ptr pPage."); - return -1; + return TSDB_CODE_FAILED; } tdbPagerReturnPage(pBtc->pBt->pPager, pBtc->pPage, pBtc->pTxn); diff --git a/source/libs/tdb/src/db/tdbPager.c b/source/libs/tdb/src/db/tdbPager.c index 5d8b05ffcf..414ca42a02 100644 --- a/source/libs/tdb/src/db/tdbPager.c +++ b/source/libs/tdb/src/db/tdbPager.c @@ -862,7 +862,7 @@ static int tdbPagerAllocPage(SPager *pPager, SPgno *ppgno, TXN *pTxn) { // Try to allocate from the free list of the pager ret = tdbPagerAllocFreePage(pPager, ppgno, pTxn); if (ret < 0) { - return -1; + return ret; } if (*ppgno != 0) return 0; @@ -875,7 +875,7 @@ static int tdbPagerAllocPage(SPager *pPager, SPgno *ppgno, TXN *pTxn) { if (*ppgno == 0) { tdbError("tdb/pager:%p, alloc new page failed.", pPager); - return -1; + return TSDB_CODE_FAILED; } return 0; } @@ -907,7 +907,7 @@ static int tdbPagerInitPage(SPager *pPager, SPage *pPage, int (*initPage)(SPage if (nRead < pPage->pageSize) { tdbError("tdb/pager:%p, pgno:%d, nRead:%" PRId64 "pgSize:%" PRId32, pPager, pgno, nRead, pPage->pageSize); TDB_UNLOCK_PAGE(pPage); - return -1; + return TAOS_SYSTEM_ERROR(errno); } int32_t encryptAlgorithm = pPager->pEnv->encryptAlgorithm; @@ -954,7 +954,7 @@ static int tdbPagerInitPage(SPager *pPager, SPage *pPage, int (*initPage)(SPage tdbError("tdb/pager:%p, pgno:%d, nRead:%" PRId64 "pgSize:%" PRId32 " init page failed.", pPager, pgno, nRead, pPage->pageSize); TDB_UNLOCK_PAGE(pPage); - return -1; + return ret; } tmemory_barrier(); @@ -975,7 +975,7 @@ static int tdbPagerInitPage(SPager *pPager, SPage *pPage, int (*initPage)(SPage } else { tdbError("tdb/pager:%p, pgno:%d, nRead:%" PRId64 "pgSize:%" PRId32 " lock page failed.", pPager, pgno, nRead, pPage->pageSize); - return -1; + return TSDB_CODE_FAILED; } return 0; @@ -1127,14 +1127,12 @@ static int tdbPagerRestore(SPager *pPager, const char *jFileName) { if (tdbOsClose(jfd) < 0) { tdbError("failed to close jfd due to %s. jFileName:%s", strerror(errno), pPager->jFileName); - terrno = TAOS_SYSTEM_ERROR(errno); - return -1; + return terrno = TAOS_SYSTEM_ERROR(errno); } if (tdbOsRemove(jFileName) < 0 && errno != ENOENT) { tdbError("failed to remove file due to %s. jFileName:%s", strerror(errno), pPager->jFileName); - terrno = TAOS_SYSTEM_ERROR(errno); - return -1; + return terrno = TAOS_SYSTEM_ERROR(errno); } return 0; diff --git a/source/util/src/tlog.c b/source/util/src/tlog.c index 7a22efc887..6d4bf89c0a 100644 --- a/source/util/src/tlog.c +++ b/source/util/src/tlog.c @@ -19,6 +19,7 @@ #include "tconfig.h" #include "tglobal.h" #include "tjson.h" +#include "tutil.h" #define LOG_MAX_LINE_SIZE (10024) #define LOG_MAX_LINE_BUFFER_SIZE (LOG_MAX_LINE_SIZE + 3) @@ -146,7 +147,7 @@ static int32_t taosStartLog() { TdThreadAttr threadAttr; taosThreadAttrInit(&threadAttr); if (taosThreadCreate(&(tsLogObj.logHandle->asyncThread), &threadAttr, taosAsyncOutputLog, tsLogObj.logHandle) != 0) { - return -1; + return terrno; } taosThreadAttrDestroy(&threadAttr); return 0; @@ -176,13 +177,13 @@ int32_t taosInitSlowLog() { } tsLogObj.slowHandle = taosLogBuffNew(LOG_SLOW_BUF_SIZE); - if (tsLogObj.slowHandle == NULL) return -1; + if (tsLogObj.slowHandle == NULL) return terrno; taosUmaskFile(0); tsLogObj.slowHandle->pFile = taosOpenFile(fullName, TD_FILE_CREATE | TD_FILE_WRITE | TD_FILE_APPEND); if (tsLogObj.slowHandle->pFile == NULL) { printf("\nfailed to open slow log file:%s, reason:%s\n", fullName, strerror(errno)); - return -1; + return TAOS_SYSTEM_ERROR(errno); } return 0; @@ -209,11 +210,11 @@ int32_t taosInitLog(const char *logName, int32_t maxFiles) { taosUpdateDaylight(); tsLogObj.logHandle = taosLogBuffNew(LOG_DEFAULT_BUF_SIZE); - if (tsLogObj.logHandle == NULL) return -1; - if (taosOpenLogFile(fullName, maxFiles) < 0) return -1; + if (tsLogObj.logHandle == NULL) return terrno; + TAOS_CHECK_RETURN(taosOpenLogFile(fullName, maxFiles)); - if (taosInitSlowLog() < 0) return -1; - if (taosStartLog() < 0) return -1; + TAOS_CHECK_RETURN(taosInitSlowLog()); + TAOS_CHECK_RETURN(taosStartLog()); return 0; } @@ -484,7 +485,7 @@ static int32_t taosOpenLogFile(char *fn, int32_t maxFileNum) { if (tsLogObj.logHandle->pFile == NULL) { printf("\nfailed to open log file:%s, reason:%s\n", fileName, strerror(errno)); - return -1; + return TAOS_SYSTEM_ERROR(errno); } taosLockLogFile(tsLogObj.logHandle->pFile); @@ -492,7 +493,7 @@ static int32_t taosOpenLogFile(char *fn, int32_t maxFileNum) { int64_t filesize = 0; if (taosFStatFile(tsLogObj.logHandle->pFile, &filesize, NULL) < 0) { printf("\nfailed to fstat log file:%s, reason:%s\n", fileName, strerror(errno)); - return -1; + return TAOS_SYSTEM_ERROR(errno); } tsLogObj.lines = (int32_t)(filesize / 60); diff --git a/source/util/src/tlrucache.c b/source/util/src/tlrucache.c index 3de159797f..4f8e96c4c7 100644 --- a/source/util/src/tlrucache.c +++ b/source/util/src/tlrucache.c @@ -20,6 +20,7 @@ #include "tarray.h" #include "tdef.h" #include "tlog.h" +#include "tutil.h" typedef struct SLRUEntry SLRUEntry; typedef struct SLRUEntryTable SLRUEntryTable; @@ -114,13 +115,13 @@ static int taosLRUEntryTableInit(SLRUEntryTable *table, int maxUpperHashBits) { table->lengthBits = 4; table->list = taosMemoryCalloc(1 << table->lengthBits, sizeof(SLRUEntry *)); if (!table->list) { - return -1; + TAOS_RETURN(TSDB_CODE_OUT_OF_MEMORY); } table->elems = 0; table->maxLengthBits = maxUpperHashBits; - return 0; + TAOS_RETURN(TSDB_CODE_SUCCESS); } static void taosLRUEntryTableApply(SLRUEntryTable *table, _taos_lru_table_func_t func, uint32_t begin, uint32_t end) { @@ -349,9 +350,7 @@ static void taosLRUCacheShardSetCapacity(SLRUCacheShard *shard, size_t capacity) static int taosLRUCacheShardInit(SLRUCacheShard *shard, size_t capacity, bool strict, double highPriPoolRatio, int maxUpperHashBits) { - if (taosLRUEntryTableInit(&shard->table, maxUpperHashBits) < 0) { - return -1; - } + TAOS_CHECK_RETURN(taosLRUEntryTableInit(&shard->table, maxUpperHashBits)); taosThreadMutexInit(&shard->mutex, NULL); @@ -372,7 +371,7 @@ static int taosLRUCacheShardInit(SLRUCacheShard *shard, size_t capacity, bool st taosLRUCacheShardSetCapacity(shard, capacity); - return 0; + TAOS_RETURN(TSDB_CODE_SUCCESS); } static void taosLRUCacheShardCleanup(SLRUCacheShard *shard) { @@ -671,16 +670,13 @@ static int getDefaultCacheShardBits(size_t capacity) { SLRUCache *taosLRUCacheInit(size_t capacity, int numShardBits, double highPriPoolRatio) { if (numShardBits >= 20) { - terrno = TSDB_CODE_INVALID_PARA; return NULL; } if (highPriPoolRatio < 0.0 || highPriPoolRatio > 1.0) { - terrno = TSDB_CODE_INVALID_PARA; return NULL; } SLRUCache *cache = taosMemoryCalloc(1, sizeof(SLRUCache)); if (!cache) { - terrno = TSDB_CODE_OUT_OF_MEMORY; return NULL; } @@ -692,14 +688,15 @@ SLRUCache *taosLRUCacheInit(size_t capacity, int numShardBits, double highPriPoo cache->shards = taosMemoryCalloc(numShards, sizeof(SLRUCacheShard)); if (!cache->shards) { taosMemoryFree(cache); - terrno = TSDB_CODE_OUT_OF_MEMORY; return NULL; } bool strictCapacity = 1; size_t perShard = (capacity + (numShards - 1)) / numShards; for (int i = 0; i < numShards; ++i) { - taosLRUCacheShardInit(&cache->shards[i], perShard, strictCapacity, highPriPoolRatio, 32 - numShardBits); + if (TSDB_CODE_SUCCESS != + taosLRUCacheShardInit(&cache->shards[i], perShard, strictCapacity, highPriPoolRatio, 32 - numShardBits)) + return NULL; } cache->numShards = numShards; diff --git a/source/util/src/tsched.c b/source/util/src/tsched.c index 603547e30b..04d903491b 100644 --- a/source/util/src/tsched.c +++ b/source/util/src/tsched.c @@ -27,8 +27,10 @@ static void *taosProcessSchedQueue(void *param); static void taosDumpSchedulerStatus(void *qhandle, void *tmrId); void *taosInitScheduler(int32_t queueSize, int32_t numOfThreads, const char *label, SSchedQueue *pSched) { - bool schedMalloced = false; - + int32_t code = TSDB_CODE_SUCCESS; + int32_t lino = 0; + bool schedMalloced = false; + if (NULL == pSched) { pSched = (SSchedQueue *)taosMemoryCalloc(sizeof(SSchedQueue), 1); if (pSched == NULL) { @@ -95,23 +97,32 @@ void *taosInitScheduler(int32_t queueSize, int32_t numOfThreads, const char *lab atomic_store_8(&pSched->stop, 0); for (int32_t i = 0; i < numOfThreads; ++i) { TdThreadAttr attr; - taosThreadAttrInit(&attr); - taosThreadAttrSetDetachState(&attr, PTHREAD_CREATE_JOINABLE); - int32_t code = taosThreadCreate(pSched->qthread + i, &attr, taosProcessSchedQueue, (void *)pSched); - taosThreadAttrDestroy(&attr); - if (code != 0) { - uError("%s: failed to create rpc thread(%s)", label, strerror(errno)); - taosCleanUpScheduler(pSched); - if (schedMalloced) { - taosMemoryFree(pSched); - } - return NULL; - } + code = taosThreadAttrInit(&attr); + QUERY_CHECK_CODE(code, lino, _end); + + code = taosThreadAttrSetDetachState(&attr, PTHREAD_CREATE_JOINABLE); + QUERY_CHECK_CODE(code, lino, _end); + + code = taosThreadCreate(pSched->qthread + i, &attr, taosProcessSchedQueue, (void *)pSched); + QUERY_CHECK_CODE(code, lino, _end); + + (void)taosThreadAttrDestroy(&attr); ++pSched->numOfThreads; } uDebug("%s scheduler is initialized, numOfThreads:%d", label, pSched->numOfThreads); +_end: + if (code != TSDB_CODE_SUCCESS) { + taosCleanUpScheduler(pSched); + if (schedMalloced) { + taosMemoryFree(pSched); + } + terrno = code; + uError("%s failed at line %d since %s", __func__, lino, tstrerror(code)); + return NULL; + } + return (void *)pSched; } @@ -220,22 +231,22 @@ void taosCleanUpScheduler(void *param) { for (int32_t i = 0; i < pSched->numOfThreads; ++i) { if (taosCheckPthreadValid(pSched->qthread[i])) { - tsem_post(&pSched->fullSem); + (void)tsem_post(&pSched->fullSem); } } for (int32_t i = 0; i < pSched->numOfThreads; ++i) { if (taosCheckPthreadValid(pSched->qthread[i])) { - taosThreadJoin(pSched->qthread[i], NULL); + (void)taosThreadJoin(pSched->qthread[i], NULL); taosThreadClear(&pSched->qthread[i]); } } - tsem_destroy(&pSched->emptySem); - tsem_destroy(&pSched->fullSem); - taosThreadMutexDestroy(&pSched->queueMutex); + (void)tsem_destroy(&pSched->emptySem); + (void)tsem_destroy(&pSched->fullSem); + (void)taosThreadMutexDestroy(&pSched->queueMutex); if (pSched->pTimer) { - taosTmrStop(pSched->pTimer); + (void)taosTmrStop(pSched->pTimer); pSched->pTimer = NULL; } diff --git a/source/util/src/ttimer.c b/source/util/src/ttimer.c index cb01fb2d13..5f6439d8f6 100644 --- a/source/util/src/ttimer.c +++ b/source/util/src/ttimer.c @@ -516,7 +516,7 @@ static int32_t taosTmrModuleInit(void) { tmrCtrls = taosMemoryMalloc(sizeof(tmr_ctrl_t) * tsMaxTmrCtrl); if (tmrCtrls == NULL) { tmrError("failed to allocate memory for timer controllers."); - return -1; + return terrno; } memset(&timerMap, 0, sizeof(timerMap)); @@ -535,14 +535,14 @@ static int32_t taosTmrModuleInit(void) { time_wheel_t* wheel = wheels + i; if (taosThreadMutexInit(&wheel->mutex, NULL) != 0) { tmrError("failed to create the mutex for wheel, reason:%s", strerror(errno)); - return -1; + return terrno; } wheel->nextScanAt = now + wheel->resolution; wheel->index = 0; wheel->slots = (tmr_obj_t**)taosMemoryCalloc(wheel->size, sizeof(tmr_obj_t*)); if (wheel->slots == NULL) { tmrError("failed to allocate wheel slots"); - return -1; + return terrno; } timerMap.size += wheel->size; } @@ -551,7 +551,7 @@ static int32_t taosTmrModuleInit(void) { timerMap.slots = (timer_list_t*)taosMemoryCalloc(timerMap.size, sizeof(timer_list_t)); if (timerMap.slots == NULL) { tmrError("failed to allocate hash map"); - return -1; + return terrno; } tmrQhandle = taosInitScheduler(10000, taosTmrThreads, "tmr", NULL); @@ -570,7 +570,7 @@ static int32_t taosTmrInitModule(void) { if (atomic_load_32(&tmrModuleInit) < 0) { return -1; } - + while (true) { if (0 == atomic_val_compare_exchange_32(&tmrModuleInit, 0, 1)) { atomic_store_32(&tmrModuleInit, taosTmrModuleInit()); @@ -609,7 +609,7 @@ void* taosTmrInit(int32_t maxNumOfTmrs, int32_t resolution, int32_t longest, con } tstrncpy(ctrl->label, label, sizeof(ctrl->label)); - + tmrDebug("%s timer controller is initialized, number of timer controllers: %d.", label, numOfTmrCtrl); return ctrl; } diff --git a/source/util/src/tutil.c b/source/util/src/tutil.c index f201edcb5e..a14ea1a3cd 100644 --- a/source/util/src/tutil.c +++ b/source/util/src/tutil.c @@ -107,6 +107,9 @@ char **strsplit(char *z, const char *delim, int32_t *num) { int32_t size = 4; char **split = taosMemoryMalloc(POINTER_BYTES * size); + if (split == NULL) { + return NULL; + } for (char *p = strsep(&z, delim); p != NULL; p = strsep(&z, delim)) { size_t len = strlen(p); @@ -118,7 +121,10 @@ char **strsplit(char *z, const char *delim, int32_t *num) { if ((*num) >= size) { size = (size << 1); split = taosMemoryRealloc(split, POINTER_BYTES * size); - ASSERTS(NULL != split, "realloc memory failed. size=%d", (int32_t) POINTER_BYTES * size); + if (split == NULL) { + return NULL; + } + ASSERTS(NULL != split, "realloc memory failed. size=%d", (int32_t)POINTER_BYTES * size); } } @@ -145,10 +151,10 @@ char *strnchr(const char *haystack, char needle, int32_t len, bool skipquote) { return NULL; } -TdUcs4* wcsnchr(const TdUcs4* haystack, TdUcs4 needle, size_t len) { - for(int32_t i = 0; i < len; ++i) { +TdUcs4 *wcsnchr(const TdUcs4 *haystack, TdUcs4 needle, size_t len) { + for (int32_t i = 0; i < len; ++i) { if (haystack[i] == needle) { - return (TdUcs4*) &haystack[i]; + return (TdUcs4 *)&haystack[i]; } } @@ -314,6 +320,9 @@ char *strbetween(char *string, char *begin, char *end) { int32_t size = (int32_t)(_end - _begin); if (_end != NULL && size > 0) { result = (char *)taosMemoryCalloc(1, size); + if (result) { + return NULL; + } memcpy(result, _begin + strlen(begin), size - +strlen(begin)); } } @@ -324,13 +333,13 @@ int32_t tintToHex(uint64_t val, char hex[]) { const char hexstr[16] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'}; int32_t j = 0, k = 0; - if (val == 0) { + if (val == 0) { hex[j++] = hexstr[0]; return j; } // ignore the initial 0 - while((val & (((uint64_t)0xfL) << ((15 - k) * 4))) == 0) { + while ((val & (((uint64_t)0xfL) << ((15 - k) * 4))) == 0) { k += 1; } @@ -346,10 +355,10 @@ int32_t titoa(uint64_t val, size_t radix, char str[]) { return 0; } - const char* s = "0123456789abcdef"; - char buf[65] = {0}; + const char *s = "0123456789abcdef"; + char buf[65] = {0}; - int32_t i = 0; + int32_t i = 0; uint64_t v = val; do { buf[i++] = s[v % radix]; @@ -357,7 +366,7 @@ int32_t titoa(uint64_t val, size_t radix, char str[]) { } while (v > 0); // reverse order - for(int32_t j = 0; j < i; ++j) { + for (int32_t j = 0; j < i; ++j) { str[j] = buf[i - j - 1]; } @@ -429,8 +438,8 @@ void taosIpPort2String(uint32_t ip, uint16_t port, char *str) { size_t tstrncspn(const char *str, size_t size, const char *reject, size_t rsize) { if (rsize == 0 || rsize == 1) { - char* p = strnchr(str, reject[0], size, false); - return (p == NULL)? size:(p-str); + char *p = strnchr(str, reject[0], size, false); + return (p == NULL) ? size : (p - str); } /* Use multiple small memsets to enable inlining on most targets. */ @@ -441,15 +450,15 @@ size_t tstrncspn(const char *str, size_t size, const char *reject, size_t rsize) memset(p + 192, 0, 64); unsigned char *s = (unsigned char *)reject; - int32_t index = 0; + int32_t index = 0; do { p[s[index++]] = 1; } while (index < rsize); - s = (unsigned char*) str; + s = (unsigned char *)str; int32_t times = size >> 2; if (times == 0) { - for(int32_t i = 0; i < size; ++i) { + for (int32_t i = 0; i < size; ++i) { if (p[s[i]]) { return i; } @@ -460,7 +469,7 @@ size_t tstrncspn(const char *str, size_t size, const char *reject, size_t rsize) index = 0; uint32_t c0, c1, c2, c3; - for(int32_t i = 0; i < times; ++i, index += 4) { + for (int32_t i = 0; i < times; ++i, index += 4) { int32_t j = index; c0 = p[s[j]]; c1 = p[s[j + 1]]; @@ -474,7 +483,7 @@ size_t tstrncspn(const char *str, size_t size, const char *reject, size_t rsize) } int32_t offset = times * 4; - for(int32_t i = offset; i < size; ++i) { + for (int32_t i = offset; i < size; ++i) { if (p[s[i]]) { return i; } @@ -485,8 +494,8 @@ size_t tstrncspn(const char *str, size_t size, const char *reject, size_t rsize) size_t twcsncspn(const TdUcs4 *wcs, size_t size, const TdUcs4 *reject, size_t rsize) { if (rsize == 0 || rsize == 1) { - TdUcs4* p = wcsnchr(wcs, reject[0], size); - return (p == NULL)? size:(p-wcs); + TdUcs4 *p = wcsnchr(wcs, reject[0], size); + return (p == NULL) ? size : (p - wcs); } size_t index = 0; @@ -497,19 +506,17 @@ size_t twcsncspn(const TdUcs4 *wcs, size_t size, const TdUcs4 *reject, size_t rs return index; } -int32_t parseCfgReal(const char* str, double* out) { +int32_t parseCfgReal(const char *str, double *out) { double val; char *endPtr; errno = 0; val = taosStr2Double(str, &endPtr); if (str == endPtr || errno == ERANGE || isnan(val)) { - terrno = TSDB_CODE_INVALID_CFG_VALUE; - return -1; + return terrno = TSDB_CODE_INVALID_CFG_VALUE; } - while(isspace((unsigned char)*endPtr)) endPtr++; + while (isspace((unsigned char)*endPtr)) endPtr++; if (*endPtr != '\0') { - terrno = TSDB_CODE_INVALID_CFG_VALUE; - return -1; + return terrno = TSDB_CODE_INVALID_CFG_VALUE; } *out = val; return TSDB_CODE_SUCCESS;