From b0cfcbcd1a5e7d53ddb1039364e4c7f8fca7de9a Mon Sep 17 00:00:00 2001 From: Hongze Cheng Date: Fri, 17 Jun 2022 09:27:31 +0000 Subject: [PATCH] more work --- source/dnode/vnode/src/inc/tsdb.h | 15 +++- source/dnode/vnode/src/tsdb/tsdbCommit.c | 2 +- source/dnode/vnode/src/tsdb/tsdbUtil.c | 91 +++++++++++++++++++++--- 3 files changed, 96 insertions(+), 12 deletions(-) diff --git a/source/dnode/vnode/src/inc/tsdb.h b/source/dnode/vnode/src/inc/tsdb.h index 41c3574954..8d901a684a 100644 --- a/source/dnode/vnode/src/inc/tsdb.h +++ b/source/dnode/vnode/src/inc/tsdb.h @@ -131,6 +131,9 @@ int32_t tsdbReadDelData(SDelFReader *pReader, SDelIdx *pDelIdx, SMapData *pDelDa int32_t tsdbReadDelIdx(SDelFReader *pReader, SMapData *pDelIdxMap, uint8_t **ppBuf); // tsdbUtil.c ============================================================================================== +// TSDBROW +TSDBKEY tsdbRowKey(TSDBROW *pRow); + int32_t tsdbKeyFid(TSKEY key, int32_t minutes, int8_t precision); void tsdbFidKeyRange(int32_t fid, int32_t minutes, int8_t precision, TSKEY *minKey, TSKEY *maxKey); @@ -174,8 +177,10 @@ int32_t tGetBlock(uint8_t *p, void *ph); int32_t tBlockCmprFn(const void *p1, const void *p2); // SBlockData -void tsdbBlockDataReset(SBlockData *pBlockData); +#define tsdbBlockDataCreate() ((SBlockData){0}) +void tsdbBlockDataClear(SBlockData *pBlockData); int32_t tsdbBlockDataAppendRow(SBlockData *pBlockData, TSDBROW *pRow, STSchema *pTSchema); +void tsdbBlockDataDestroy(SBlockData *pBlockData); // SDelIdx int32_t tPutDelIdx(uint8_t *p, void *ph); @@ -326,8 +331,12 @@ struct SColData { }; struct SBlockData { - int32_t nRow; - SArray *aColData; + int32_t maxRow; + int32_t nRow; + TSDBKEY *aKey; + int32_t maxCol; + int32_t nCol; + SColData *aColData; }; // ================== TSDB global config diff --git a/source/dnode/vnode/src/tsdb/tsdbCommit.c b/source/dnode/vnode/src/tsdb/tsdbCommit.c index d288e54c5c..deaa171748 100644 --- a/source/dnode/vnode/src/tsdb/tsdbCommit.c +++ b/source/dnode/vnode/src/tsdb/tsdbCommit.c @@ -388,7 +388,7 @@ static int32_t tsdbCommitMemoryData(SCommitter *pCommitter, SBlockIdx *pBlockIdx if (code) goto _err; block = BLOCK_INIT_VAL; - tsdbBlockDataReset(&pCommitter->bDataN); + tsdbBlockDataClear(&pCommitter->bDataN); } return code; diff --git a/source/dnode/vnode/src/tsdb/tsdbUtil.c b/source/dnode/vnode/src/tsdb/tsdbUtil.c index cfe5259971..af7e724836 100644 --- a/source/dnode/vnode/src/tsdb/tsdbUtil.c +++ b/source/dnode/vnode/src/tsdb/tsdbUtil.c @@ -405,6 +405,11 @@ void tsdbFidKeyRange(int32_t fid, int32_t minutes, int8_t precision, TSKEY *minK // } // TSDBROW ====================================================== +TSDBKEY tsdbRowKey(TSDBROW *pRow) { + // TODO: support SBlockData version + return (TSDBKEY){.version = pRow->version, .ts = pRow->pTSRow->ts}; +} + void tsdbRowGetColVal(TSDBROW *pRow, STSchema *pTSchema, int32_t iCol, SColVal *pColVal) { // TODO } @@ -515,13 +520,6 @@ int32_t tsdbBuildDeleteSkyline(SArray *aDelData, int32_t sidx, int32_t eidx, SAr return code; } -// SBlockData ====================================================== -int32_t tsdbBlockDataAppendRow(SBlockData *pBlockData, TSDBROW *pRow, STSchema *pTSchema) { - int32_t code = 0; - // TODO - return code; -} - // KEYINFO ====================================================== int32_t tPutKEYINFO(uint8_t *p, KEYINFO *pKeyInfo) { int32_t n = 0; @@ -545,4 +543,81 @@ int32_t tGetKEYINFO(uint8_t *p, KEYINFO *pKeyInfo) { return n; } -// SBlockData ====================================================== \ No newline at end of file +// SBlockData ====================================================== +void tsdbBlockDataClear(SBlockData *pBlockData) { + pBlockData->nRow = 0; + for (int32_t iCol = 0; iCol < pBlockData->nCol; iCol++) { + pBlockData->aColData[iCol] = (SColData){.cid = 0, .type = 0, .bytes = 0, .flags = 0, .nData = 0}; + } +} + +int32_t tsdbBlockDataAppendRow(SBlockData *pBlockData, TSDBROW *pRow, STSchema *pTSchema) { + int32_t code = 0; + TSDBKEY key = tsdbRowKey(pRow); + int32_t nRow = pBlockData->nRow; + SColVal colVal; + SColVal *pColVal = &colVal; + STColumn *pTColumn; + SColData *pColData; + + pBlockData->nRow++; + + // aKey + if (nRow >= pBlockData->maxRow) { + if (pBlockData->maxRow == 0) { + pBlockData->maxRow = 1024; + } else { + pBlockData->maxRow = pBlockData->maxRow * 2; + } + ASSERT(pBlockData->maxRow > pBlockData->nRow); + + code = tsdbRealloc((uint8_t **)&pBlockData->aKey, sizeof(TSDBKEY) * pBlockData->maxRow); + if (code) goto _err; + } + pBlockData->aKey[nRow] = key; + + // other cols + int16_t iColData = 0; + int16_t iCol = 1; + while (iCol < pTSchema->numOfCols) { + pTColumn = &pTSchema->columns[iCol]; + + if (iColData < pBlockData->nCol) { + pColData = &pBlockData->aColData[iColData]; + if (pColData->cid < pTColumn->colId) { + iColData++; + } else if (pColData->cid > pTColumn->colId) { + // add a new SColData + iCol++; + } else { + iCol++; + iColData++; + } + } else { + // add a new column data + } + + if (pColVal->isNone) { + // set bit + } else if (pColVal->isNull) { + // set bit + } else { + // set bit + // put data + } + } + + return code; + +_err: + tsdbError("block data append row failed since %s", tstrerror(code)); + return code; +} + +void tsdbBlockDataDestroy(SBlockData *pBlockData) { + tsdbFree((uint8_t *)pBlockData->aKey); + for (int32_t iCol = 0; iCol < pBlockData->nCol; iCol++) { + tsdbFree(pBlockData->aColData[iCol].pBitMap); + tsdbFree(pBlockData->aColData[iCol].pData); + } +} -- GitLab