From eb1fed177f9e0a6ee75c755588c1e7e1f71faca0 Mon Sep 17 00:00:00 2001 From: Haojun Liao Date: Fri, 19 Apr 2024 00:32:41 +0800 Subject: [PATCH] fix(tsdb): set correct compare func for merge tree. --- source/dnode/vnode/src/tsdb/tsdbMergeTree.c | 17 +++++++++++------ source/dnode/vnode/src/tsdb/tsdbRead2.c | 21 ++++++++++----------- source/dnode/vnode/src/tsdb/tsdbReadUtil.h | 9 +++++++++ 3 files changed, 30 insertions(+), 17 deletions(-) diff --git a/source/dnode/vnode/src/tsdb/tsdbMergeTree.c b/source/dnode/vnode/src/tsdb/tsdbMergeTree.c index 49c0c483dd..6b459f90f3 100644 --- a/source/dnode/vnode/src/tsdb/tsdbMergeTree.c +++ b/source/dnode/vnode/src/tsdb/tsdbMergeTree.c @@ -828,17 +828,22 @@ static FORCE_INLINE int32_t tLDataIterCmprFn(const SRBTreeNode *p1, const SRBTre SLDataIter *pIter1 = (SLDataIter *)(((uint8_t *)p1) - offsetof(SLDataIter, node)); SLDataIter *pIter2 = (SLDataIter *)(((uint8_t *)p2) - offsetof(SLDataIter, node)); - TSDBKEY key1 = TSDBROW_KEY(&pIter1->rInfo.row); - TSDBKEY key2 = TSDBROW_KEY(&pIter2->rInfo.row); + SRowKey rkey1, rkey2; + tRowGetKeyEx(&pIter1->rInfo.row, &rkey1); + tRowGetKeyEx(&pIter2->rInfo.row, &rkey2); - if (key1.ts < key2.ts) { + int32_t ret = tRowKeyCompare(&rkey1, &rkey2); + if (ret < 0) { return -1; - } else if (key1.ts > key2.ts) { + } else if (ret > 0) { return 1; } else { - if (key1.version < key2.version) { + int64_t ver1 = TSDBROW_VERSION(&pIter1->rInfo.row); + int64_t ver2 = TSDBROW_VERSION(&pIter2->rInfo.row); + + if (ver1 < ver2) { return -1; - } else if (key1.version > key2.version) { + } else if (ver1 > ver2) { return 1; } else { return 0; diff --git a/source/dnode/vnode/src/tsdb/tsdbRead2.c b/source/dnode/vnode/src/tsdb/tsdbRead2.c index 1fb108ed7f..63d8c05bf3 100644 --- a/source/dnode/vnode/src/tsdb/tsdbRead2.c +++ b/source/dnode/vnode/src/tsdb/tsdbRead2.c @@ -25,15 +25,6 @@ #define ASCENDING_TRAVERSE(o) (o == TSDB_ORDER_ASC) #define getCurrentKeyInSttBlock(_r) (&((_r)->currentKey)) -#define tRowGetKeyEx(_pRow, _pKey) \ - do { \ - if ((_pRow)->type == TSDBROW_ROW_FMT) { \ - tRowGetKey((_pRow)->pTSRow, (_pKey)); \ - } else { \ - tColRowGetKey((_pRow)->pBlockData, (_pRow)->iRow, (_pKey)); \ - } \ - } while (0) - typedef struct { bool overlapWithNeighborBlock; bool hasDupTs; @@ -1619,6 +1610,11 @@ static bool tryCopyDistinctRowFromSttBlock(TSDBROW* fRow, SSttBlockReader* pSttB doUnpinSttBlock(pSttBlockReader); if (hasVal) { SRowKey* pNext = getCurrentKeyInSttBlock(pSttBlockReader); + + if (IS_VAR_DATA_TYPE(pSttKey->pks[0].type)) { + tsdbInfo("current pk:%s, next pk:%s", pSttKey->pks[0].pData, pNext->pks[0].pData); + } + if (pkCompEx(pSttKey, pNext) != 0) { code = doAppendRowFromFileBlock(pReader->resBlockInfo.pResBlock, pReader, fRow->pBlockData, fRow->iRow); *copied = (code == TSDB_CODE_SUCCESS); @@ -2311,8 +2307,11 @@ int32_t mergeRowsInSttBlocks(SSttBlockReader* pSttBlockReader, STableBlockScanIn TSDBROW* pRow = tMergeTreeGetRow(&pSttBlockReader->mergeTree); TSDBROW fRow = {.iRow = pRow->iRow, .type = TSDBROW_COL_FMT, .pBlockData = pRow->pBlockData}; - tsdbTrace("fRow ptr:%p, %d, uid:%" PRIu64 ", ts:%" PRId64 " %s", pRow->pBlockData, pRow->iRow, pSttBlockReader->uid, - fRow.pBlockData->aTSKEY[fRow.iRow], pReader->idStr); + + if (IS_VAR_DATA_TYPE(pScanInfo->lastProcKey.pks[0].type)) { + tsdbTrace("fRow ptr:%p, %d, uid:%" PRIu64 ", ts:%" PRId64 " pk:%s %s", pRow->pBlockData, pRow->iRow, pSttBlockReader->uid, + fRow.pBlockData->aTSKEY[fRow.iRow], pScanInfo->lastProcKey.pks[0].pData, pReader->idStr); + } int32_t code = tryCopyDistinctRowFromSttBlock(&fRow, pSttBlockReader, pScanInfo, &pScanInfo->lastProcKey, pReader, &copied); diff --git a/source/dnode/vnode/src/tsdb/tsdbReadUtil.h b/source/dnode/vnode/src/tsdb/tsdbReadUtil.h index 96ce911b78..5f0a58c378 100644 --- a/source/dnode/vnode/src/tsdb/tsdbReadUtil.h +++ b/source/dnode/vnode/src/tsdb/tsdbReadUtil.h @@ -38,6 +38,15 @@ extern "C" { (_k)->ekey.ts = INT64_MIN; \ } while (0); +#define tRowGetKeyEx(_pRow, _pKey) \ + do { \ + if ((_pRow)->type == TSDBROW_ROW_FMT) { \ + tRowGetKey((_pRow)->pTSRow, (_pKey)); \ + } else { \ + tColRowGetKey((_pRow)->pBlockData, (_pRow)->iRow, (_pKey)); \ + } \ + } while (0) + typedef enum { READER_STATUS_SUSPEND = 0x1, READER_STATUS_NORMAL = 0x2,