From 9059454c905b6125525fc091ac469fe9652132c9 Mon Sep 17 00:00:00 2001 From: Haojun Liao Date: Fri, 16 Aug 2024 13:11:10 +0800 Subject: [PATCH 1/2] fix(tsdb): check return value. --- source/dnode/vnode/src/tsdb/tsdbMergeTree.c | 69 ++++++++++++--------- 1 file changed, 41 insertions(+), 28 deletions(-) diff --git a/source/dnode/vnode/src/tsdb/tsdbMergeTree.c b/source/dnode/vnode/src/tsdb/tsdbMergeTree.c index e55ede560e..77a82e0dd9 100644 --- a/source/dnode/vnode/src/tsdb/tsdbMergeTree.c +++ b/source/dnode/vnode/src/tsdb/tsdbMergeTree.c @@ -146,10 +146,14 @@ static void updateBlockLoadSlot(SSttBlockLoadInfo *pLoadInfo) { pLoadInfo->currentLoadBlockIndex = nextSlotIndex; } -static SBlockData *loadLastBlock(SLDataIter *pIter, const char *idStr) { - int32_t code = 0; +static int32_t loadLastBlock(SLDataIter *pIter, const char *idStr, SBlockData **pResBlock) { + if (pResBlock != NULL) { + *pResBlock = NULL; + } + int32_t code = 0; SSttBlockLoadInfo *pInfo = pIter->pBlockLoadInfo; + if (pInfo->blockData[0].sttBlockIndex == pIter->iSttBlk) { if (pInfo->currentLoadBlockIndex != 0) { tsdbDebug("current load index is set to 0, block index:%d, fileVer:%" PRId64 ", due to uid:%" PRIu64 @@ -157,7 +161,9 @@ static SBlockData *loadLastBlock(SLDataIter *pIter, const char *idStr) { pIter->iSttBlk, pIter->cid, pIter->uid, idStr); pInfo->currentLoadBlockIndex = 0; } - return &pInfo->blockData[0].data; + + *pResBlock = &pInfo->blockData[0].data; + return code; } if (pInfo->blockData[1].sttBlockIndex == pIter->iSttBlk) { @@ -167,11 +173,13 @@ static SBlockData *loadLastBlock(SLDataIter *pIter, const char *idStr) { pIter->iSttBlk, pIter->cid, pIter->uid, idStr); pInfo->currentLoadBlockIndex = 1; } - return &pInfo->blockData[1].data; + + *pResBlock = &pInfo->blockData[1].data; + return code; } if (pIter->pSttBlk == NULL || pInfo->pSchema == NULL) { - return NULL; + return code; } updateBlockLoadSlot(pInfo); @@ -181,7 +189,7 @@ static SBlockData *loadLastBlock(SLDataIter *pIter, const char *idStr) { code = tsdbSttFileReadBlockDataByColumn(pIter->pReader, pIter->pSttBlk, pBlock, pInfo->pSchema, &pInfo->colIds[1], pInfo->numOfCols - 1); if (code != TSDB_CODE_SUCCESS) { - goto _exit; + return code; } double el = (taosGetTimestampUs() - st) / 1000.0; @@ -200,14 +208,9 @@ static SBlockData *loadLastBlock(SLDataIter *pIter, const char *idStr) { tsdbDebug("last block index list:%d, %d, rowIndex:%d %s", pInfo->blockData[0].sttBlockIndex, pInfo->blockData[1].sttBlockIndex, pIter->iRow, idStr); - return &pInfo->blockData[pInfo->currentLoadBlockIndex].data; -_exit: - if (code != TSDB_CODE_SUCCESS) { - terrno = code; - } - - return NULL; + *pResBlock = &pInfo->blockData[pInfo->currentLoadBlockIndex].data; + return code; } // find the earliest block that contains the required records @@ -735,12 +738,17 @@ void tLDataIterNextBlock(SLDataIter *pIter, const char *idStr) { } } -static void findNextValidRow(SLDataIter *pIter, const char *idStr) { - bool hasVal = false; - int32_t step = pIter->backward ? -1 : 1; - int32_t i = pIter->iRow; +static int32_t findNextValidRow(SLDataIter *pIter, const char *idStr) { + bool hasVal = false; + int32_t step = pIter->backward ? -1 : 1; + int32_t i = pIter->iRow; + SBlockData *pData = NULL; - SBlockData *pData = loadLastBlock(pIter, idStr); + int32_t code = loadLastBlock(pIter, idStr, &pData); + if (code) { + tsdbError("failed to load stt block, code:%s, %s", tstrerror(code), idStr); + return code; + } // mostly we only need to find the start position for a given table if ((((i == 0) && (!pIter->backward)) || (i == pData->nRow - 1 && pIter->backward)) && pData->aUid != NULL) { @@ -748,7 +756,7 @@ static void findNextValidRow(SLDataIter *pIter, const char *idStr) { if (i == -1) { tsdbDebug("failed to find the data in pBlockData, uid:%" PRIu64 " , %s", pIter->uid, idStr); pIter->iRow = -1; - return; + return code; } } @@ -817,20 +825,22 @@ static void findNextValidRow(SLDataIter *pIter, const char *idStr) { } pIter->iRow = (hasVal) ? i : -1; + return code; } bool tLDataIterNextRow(SLDataIter *pIter, const char *idStr) { - int32_t step = pIter->backward ? -1 : 1; - terrno = TSDB_CODE_SUCCESS; + int32_t step = pIter->backward ? -1 : 1; + int32_t code = 0; + int32_t iBlockL = pIter->iSttBlk; + SBlockData *pBlockData = NULL; // no qualified last file block in current file, no need to fetch row if (pIter->pSttBlk == NULL) { return false; } - int32_t iBlockL = pIter->iSttBlk; - SBlockData *pBlockData = loadLastBlock(pIter, idStr); - if (pBlockData == NULL || terrno != TSDB_CODE_SUCCESS) { + code = loadLastBlock(pIter, idStr, &pBlockData); + if (pBlockData == NULL || code != TSDB_CODE_SUCCESS) { goto _exit; } @@ -838,7 +848,10 @@ bool tLDataIterNextRow(SLDataIter *pIter, const char *idStr) { while (1) { bool skipBlock = false; - findNextValidRow(pIter, idStr); + code = findNextValidRow(pIter, idStr); + if (code) { + goto _exit; + } if (pIter->pBlockLoadInfo->checkRemainingRow) { skipBlock = true; @@ -873,8 +886,8 @@ bool tLDataIterNextRow(SLDataIter *pIter, const char *idStr) { } if (iBlockL != pIter->iSttBlk) { - pBlockData = loadLastBlock(pIter, idStr); - if (pBlockData == NULL) { + code = loadLastBlock(pIter, idStr, &pBlockData); + if ((pBlockData == NULL) || (code != 0)) { goto _exit; } @@ -888,7 +901,7 @@ bool tLDataIterNextRow(SLDataIter *pIter, const char *idStr) { pIter->rInfo.row = tsdbRowFromBlockData(pBlockData, pIter->iRow); _exit: - return (terrno == TSDB_CODE_SUCCESS) && (pIter->pSttBlk != NULL) && (pBlockData != NULL); + return (code == TSDB_CODE_SUCCESS) && (pIter->pSttBlk != NULL) && (pBlockData != NULL); } // SMergeTree ================================================= From 5b82556ff5d716530a70390d3c4859c8f3b314cc Mon Sep 17 00:00:00 2001 From: Haojun Liao Date: Fri, 16 Aug 2024 22:31:21 +0800 Subject: [PATCH 2/2] fix(query): reset the errno code. --- source/dnode/vnode/src/tsdb/tsdbMergeTree.c | 3 ++- source/dnode/vnode/src/tsdb/tsdbRead2.c | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/source/dnode/vnode/src/tsdb/tsdbMergeTree.c b/source/dnode/vnode/src/tsdb/tsdbMergeTree.c index 099bde5897..9938c073ff 100644 --- a/source/dnode/vnode/src/tsdb/tsdbMergeTree.c +++ b/source/dnode/vnode/src/tsdb/tsdbMergeTree.c @@ -833,7 +833,8 @@ bool tLDataIterNextRow(SLDataIter *pIter, const char *idStr) { int32_t code = 0; int32_t iBlockL = pIter->iSttBlk; SBlockData *pBlockData = NULL; - + terrno = 0; + // no qualified last file block in current file, no need to fetch row if (pIter->pSttBlk == NULL) { return false; diff --git a/source/dnode/vnode/src/tsdb/tsdbRead2.c b/source/dnode/vnode/src/tsdb/tsdbRead2.c index 0572df2922..9a9c74a3a0 100644 --- a/source/dnode/vnode/src/tsdb/tsdbRead2.c +++ b/source/dnode/vnode/src/tsdb/tsdbRead2.c @@ -3598,6 +3598,7 @@ static int32_t buildBlockFromFiles(STsdbReader* pReader) { if (pBlockIter->numOfBlocks == 0) { // let's try to extract data from stt files. + terrno = 0; ERetrieveType type = doReadDataFromSttFiles(pReader); if (type == TSDB_READ_RETURN) { return terrno;