diff --git a/src/tsdb/inc/tsdbReadImpl.h b/src/tsdb/inc/tsdbReadImpl.h index 5ea96a24281c988c9dad0a4095d6fa3ba9a3e419..38ad580a579eeccb2635a682966e69d9e97cbb51 100644 --- a/src/tsdb/inc/tsdbReadImpl.h +++ b/src/tsdb/inc/tsdbReadImpl.h @@ -122,6 +122,7 @@ typedef struct { uint8_t offsetH; char padding[1]; } SBlockColV0; + typedef struct { int16_t colId; int32_t len; @@ -239,7 +240,7 @@ int tsdbLoadBlockInfo(SReadH *pReadh, void **pTarget, int32_t *extendedLen); int tsdbLoadBlockData(SReadH *pReadh, SBlock *pBlock, SBlockInfo *pBlockInfo); int tsdbLoadBlockDataCols(SReadH *pReadh, SBlock *pBlock, SBlockInfo *pBlkInfo, int16_t *colIds, int numOfColsIds); int tsdbLoadBlockStatis(SReadH *pReadh, SBlock *pBlock); -// int tsdbLoadBlockHead(SReadH *pReadh, SBlock *pBlock); +int tsdbLoadBlockOffset(SReadH *pReadh, SBlock *pBlock); int tsdbEncodeSBlockIdx(void **buf, SBlockIdx *pIdx); void *tsdbDecodeSBlockIdx(void *buf, SBlockIdx *pIdx); void tsdbGetBlockStatis(SReadH *pReadh, SDataStatis *pStatis, int numOfCols, SBlock *pBlock); diff --git a/src/tsdb/src/tsdbFS.c b/src/tsdb/src/tsdbFS.c index 2755b42673c5ebe1e397f7fb2ab8168e6d9bcc67..60c73e2d27019cf2e78926fc4c33b976619c8a7b 100644 --- a/src/tsdb/src/tsdbFS.c +++ b/src/tsdb/src/tsdbFS.c @@ -985,7 +985,7 @@ static bool tsdbIsTFileInFS(STsdbFS *pfs, const TFILE *pf) { SDFileSet *pSet; while ((pSet = tsdbFSIterNext(&fsiter))) { - for (TSDB_FILE_T ftype = 0; ftype < TSDB_FILE_MAX; ftype++) { + for (TSDB_FILE_T ftype = 0; ftype < pSet->nFiles; ftype++) { SDFile *pDFile = TSDB_DFILE_IN_SET(pSet, ftype); if (tfsIsSameFile(pf, TSDB_FILE_F(pDFile))) { return true; diff --git a/src/tsdb/src/tsdbReadImpl.c b/src/tsdb/src/tsdbReadImpl.c index 76b86d71e7717cc4085a9b141e6195c9a6782ade..20e89ac8636e26cca0fcd371a89b6a437d9c3ea8 100644 --- a/src/tsdb/src/tsdbReadImpl.c +++ b/src/tsdb/src/tsdbReadImpl.c @@ -25,6 +25,8 @@ static int tsdbCheckAndDecodeColumnData(SDataCol *pDataCol, void *content, int3 static int tsdbLoadBlockDataColsImpl(SReadH *pReadh, SBlock *pBlock, SDataCols *pDataCols, int16_t *colIds, int numOfColIds); static int tsdbLoadColData(SReadH *pReadh, SDFile *pDFile, SBlock *pBlock, SBlockCol *pBlockCol, SDataCol *pDataCol); +static int tsdbLoadBlockStatisFromDFile(SReadH *pReadh, SBlock *pBlock); +static int tsdbLoadBlockStatisFromAggr(SReadH *pReadh, SBlock *pBlock); int tsdbInitReadH(SReadH *pReadh, STsdbRepo *pRepo) { ASSERT(pReadh != NULL && pRepo != NULL); @@ -492,23 +494,22 @@ static int tsdbLoadBlockStatisFromAggr(SReadH *pReadh, SBlock *pBlock) { int tsdbLoadBlockStatis(SReadH *pReadh, SBlock *pBlock) { ASSERT(pBlock->numOfSubBlocks <= 1); - if (pBlock->blkVer == TSDB_SBLK_VER_0) { - return tsdbLoadBlockStatisFromDFile(pReadh, pBlock); - } - if (tsdbLoadBlockStatisFromDFile(pReadh, pBlock) < 0) { - return -1; + if (pBlock->blkVer > TSDB_SBLK_VER_0) { + tsdbLoadBlockStatisFromAggr(pReadh, pBlock); + } - return tsdbLoadBlockStatisFromAggr(pReadh, pBlock); + return tsdbLoadBlockStatisFromDFile(pReadh, pBlock); } -// int tsdbLoadBlockHead(SReadH *pReadh, SBlock *pBlock) { -// ASSERT(pBlock->numOfSubBlocks <= 1); - -// if (pBlock->blkVer >= TSDB_SBLK_VER_1) { -// return tsdbLoadBlockStatisFromDFile(pReadh, pBlock); -// } -// return 0; -// } +int tsdbLoadBlockOffset(SReadH *pReadh, SBlock *pBlock) { + ASSERT(pBlock->numOfSubBlocks <= 1); + + if (pBlock->blkVer > TSDB_SBLK_VER_0) { + return tsdbLoadBlockStatisFromDFile(pReadh, pBlock); + } + + return 0; +} int tsdbEncodeSBlockIdx(void **buf, SBlockIdx *pIdx) { int tlen = 0; @@ -758,7 +759,7 @@ static int tsdbLoadBlockDataColsImpl(SReadH *pReadh, SBlock *pBlock, SDataCols * tdResetDataCols(pDataCols); // If only load timestamp column, no need to load SBlockData part - if (numOfColIds > 1 && tsdbLoadBlockStatis(pReadh, pBlock) < 0) return -1; + if (numOfColIds > 1 && tsdbLoadBlockOffset(pReadh, pBlock) < 0) return -1; pDataCols->numOfRows = pBlock->numOfRows; @@ -800,7 +801,18 @@ static int tsdbLoadBlockDataColsImpl(SReadH *pReadh, SBlock *pBlock, SDataCols * break; } - pBlockCol = &(pReadh->pBlkData->cols[ccol]); + if (pBlock->blkVer == SBlockVerLatest) { + pBlockCol = &(pReadh->pBlkData->cols[ccol]); + } else { + SBlockColV0 *pBlkCol = ((SBlockColV0 *)(pReadh->pBlkData->cols)) + ccol; + blockCol.colId = pBlkCol->colId; + blockCol.len = pBlkCol->len; + blockCol.type = pBlkCol->type; + blockCol.offset = pBlkCol->offset; + blockCol.offsetH = pBlkCol->offsetH; + pBlockCol = &blockCol; + } + if (pBlockCol->colId > colId) { pBlockCol = NULL; break;