From ffb655bae6c04ef5ceef36500ca4c4b0fcee3067 Mon Sep 17 00:00:00 2001 From: Hongze Cheng Date: Mon, 3 Apr 2023 13:59:37 +0800 Subject: [PATCH] more code --- .../dnode/vnode/src/tsdb/dev/tsdbSttFWriter.c | 84 +++++++++++++++++-- source/dnode/vnode/src/tsdb/dev/tsdbUtil.h | 29 ++++--- 2 files changed, 94 insertions(+), 19 deletions(-) diff --git a/source/dnode/vnode/src/tsdb/dev/tsdbSttFWriter.c b/source/dnode/vnode/src/tsdb/dev/tsdbSttFWriter.c index 2a99ab5428..5102d9c720 100644 --- a/source/dnode/vnode/src/tsdb/dev/tsdbSttFWriter.c +++ b/source/dnode/vnode/src/tsdb/dev/tsdbSttFWriter.c @@ -21,11 +21,6 @@ extern int32_t tsdbWriteFile(STsdbFD *pFD, int64_t offset, const uint8_t *pBuf, extern int32_t tsdbReadFile(STsdbFD *pFD, int64_t offset, uint8_t *pBuf, int64_t size); extern int32_t tsdbFsyncFile(STsdbFD *pFD); -typedef struct SFDataPtr { - int64_t offset; - int64_t size; -} SFDataPtr; - typedef struct { SFDataPtr dict[4]; // 0:bloom filter, 1:SSttBlk, 2:STbStatisBlk, 3:SDelBlk uint8_t reserved[32]; @@ -106,16 +101,91 @@ _exit: static int32_t write_statistics_block(struct SSttFWriter *pWriter) { int32_t code = 0; + int32_t lino; + + STbStatisBlk *pStatisBlk = (STbStatisBlk *)taosArrayReserve(pWriter->aStatisBlk, 1); + if (pStatisBlk == NULL) { + code = TSDB_CODE_OUT_OF_MEMORY; + TSDB_CHECK_CODE(code, lino, _exit); + } + + pStatisBlk->nRow = pWriter->sData.nRow; + pStatisBlk->minTid.suid = pWriter->sData.aData[0][0]; + pStatisBlk->minTid.uid = pWriter->sData.aData[1][0]; + pStatisBlk->maxTid.suid = pWriter->sData.aData[0][pWriter->sData.nRow - 1]; + pStatisBlk->maxTid.uid = pWriter->sData.aData[1][pWriter->sData.nRow - 1]; + pStatisBlk->minVer = pStatisBlk->maxVer = pStatisBlk->maxVer = pWriter->sData.aData[2][0]; + for (int32_t iRow = 1; iRow < pWriter->sData.nRow; iRow++) { + if (pStatisBlk->minVer > pWriter->sData.aData[2][iRow]) pStatisBlk->minVer = pWriter->sData.aData[2][iRow]; + if (pStatisBlk->maxVer < pWriter->sData.aData[2][iRow]) pStatisBlk->maxVer = pWriter->sData.aData[2][iRow]; + } + + pStatisBlk->dp.offset = pWriter->config.file.size; + pStatisBlk->dp.size = 0; // TODO + + int64_t tsize = sizeof(int64_t) * pWriter->sData.nRow; + for (int32_t i = 0; i < ARRAY_SIZE(pWriter->sData.aData); i++) { + code = tsdbWriteFile(pWriter->pFd, pWriter->config.file.size, (const uint8_t *)pWriter->sData.aData[i], tsize); + TSDB_CHECK_CODE(code, lino, _exit); + + pStatisBlk->dp.size += tsize; + pWriter->config.file.size += tsize; + } tTbStatisBlockClear(&pWriter->sData); - // TODO +_exit: + if (code) { + tsdbError("vgId:%d %s failed at line %d since %s", TD_VID(pWriter->config.pTsdb->pVnode), __func__, lino, + tstrerror(code)); + } else { + // tsdbTrace(); + } return code; } static int32_t write_delete_block(struct SSttFWriter *pWriter) { int32_t code = 0; - // TODO + int32_t lino; + + SDelBlk *pDelBlk = taosArrayReserve(pWriter->aDelBlk, 1); + if (pDelBlk == NULL) { + code = TSDB_CODE_OUT_OF_MEMORY; + TSDB_CHECK_CODE(code, lino, _exit); + } + + pDelBlk->nRow = pWriter->sData.nRow; + pDelBlk->minTid.suid = pWriter->sData.aData[0][0]; + pDelBlk->minTid.uid = pWriter->sData.aData[1][0]; + pDelBlk->maxTid.suid = pWriter->sData.aData[0][pWriter->sData.nRow - 1]; + pDelBlk->maxTid.uid = pWriter->sData.aData[1][pWriter->sData.nRow - 1]; + pDelBlk->minVer = pDelBlk->maxVer = pDelBlk->maxVer = pWriter->sData.aData[2][0]; + for (int32_t iRow = 1; iRow < pWriter->sData.nRow; iRow++) { + if (pDelBlk->minVer > pWriter->sData.aData[2][iRow]) pDelBlk->minVer = pWriter->sData.aData[2][iRow]; + if (pDelBlk->maxVer < pWriter->sData.aData[2][iRow]) pDelBlk->maxVer = pWriter->sData.aData[2][iRow]; + } + + pDelBlk->dp.offset = pWriter->config.file.size; + pDelBlk->dp.size = 0; // TODO + + int64_t tsize = sizeof(int64_t) * pWriter->dData.nRow; + for (int32_t i = 0; i < ARRAY_SIZE(pWriter->dData.aData); i++) { + code = tsdbWriteFile(pWriter->pFd, pWriter->config.file.size, (const uint8_t *)pWriter->dData.aData[i], tsize); + TSDB_CHECK_CODE(code, lino, _exit); + + pDelBlk->dp.size += tsize; + pWriter->config.file.size += tsize; + } + + tDelBlockDestroy(&pWriter->dData); + +_exit: + if (code) { + tsdbError("vgId:%d %s failed at line %d since %s", TD_VID(pWriter->config.pTsdb->pVnode), __func__, lino, + tstrerror(code)); + } else { + // tsdbTrace(); + } return code; } diff --git a/source/dnode/vnode/src/tsdb/dev/tsdbUtil.h b/source/dnode/vnode/src/tsdb/dev/tsdbUtil.h index 6fafd2af5b..106ad1a340 100644 --- a/source/dnode/vnode/src/tsdb/dev/tsdbUtil.h +++ b/source/dnode/vnode/src/tsdb/dev/tsdbUtil.h @@ -26,6 +26,11 @@ extern "C" { typedef struct SDelBlock SDelBlock; typedef struct SDelBlk SDelBlk; +typedef struct SFDataPtr { + int64_t offset; + int64_t size; +} SFDataPtr; + int32_t tDelBlockCreate(SDelBlock *pDelBlock, int32_t capacity); int32_t tDelBlockDestroy(SDelBlock *pDelBlock); int32_t tDelBlockClear(SDelBlock *pDelBlock); @@ -52,12 +57,12 @@ struct SDelBlock { }; struct SDelBlk { - int64_t suidMax; - int64_t suidMin; - int64_t uidMax; - int64_t uidMin; - int64_t verMax; - int64_t verMin; + int32_t nRow; + TABLEID minTid; + TABLEID maxTid; + int64_t minVer; + int64_t maxVer; + SFDataPtr dp; }; struct STbStatisBlock { int32_t capacity; @@ -65,12 +70,12 @@ struct STbStatisBlock { int64_t *aData[7]; // [suid, uid, skey, sver, ekey, ever, count] }; struct STbStatisBlk { - int64_t suidMax; - int64_t suidMin; - int64_t uidMax; - int64_t uidMin; - int64_t offset; - int64_t size; + int32_t nRow; + TABLEID minTid; + TABLEID maxTid; + int64_t minVer; + int64_t maxVer; + SFDataPtr dp; }; #ifdef __cplusplus