提交 ec2a0691 编写于 作者: H Hongze Cheng

more vnode snapshot writer

上级 5b5b6a03
...@@ -377,10 +377,9 @@ struct STsdbSnapWriter { ...@@ -377,10 +377,9 @@ struct STsdbSnapWriter {
SBlockIdx* pBlockIdx; SBlockIdx* pBlockIdx;
SMapData mBlock; // SMapData<SBlock> SMapData mBlock; // SMapData<SBlock>
int32_t iBlock; int32_t iBlock;
SBlock* pBlock; SBlockData* pBlockData;
SBlock block;
SBlockData bDataR;
int32_t iRow; int32_t iRow;
SBlockData bDataR;
SDataFWriter* pDataFWriter; SDataFWriter* pDataFWriter;
SBlockIdx* pBlockIdxW; // NULL when no committing table SBlockIdx* pBlockIdxW; // NULL when no committing table
...@@ -550,15 +549,13 @@ static int32_t tsdbSnapWriteDataImpl(STsdbSnapWriter* pWriter, TABLEID id) { ...@@ -550,15 +549,13 @@ static int32_t tsdbSnapWriteDataImpl(STsdbSnapWriter* pWriter, TABLEID id) {
TSDBKEY keyFirst = tBlockDataFirstKey(pBlockData); TSDBKEY keyFirst = tBlockDataFirstKey(pBlockData);
TSDBKEY keyLast = tBlockDataLastKey(pBlockData); TSDBKEY keyLast = tBlockDataLastKey(pBlockData);
if (pWriter->pDataFReader == NULL) { // TABLE ====================================
// no old data
// end last table write if need // end last table write if should
if (pWriter->pBlockIdxW) { if (pWriter->pBlockIdxW) {
int32_t c = tTABLEIDCmprFn(pWriter->pBlockIdxW, &id); int32_t c = tTABLEIDCmprFn(pWriter->pBlockIdxW, &id);
if (c < 0) { if (c < 0) {
// end last table data write // end
code = tsdbSnapWriteTableDataEnd(pWriter); code = tsdbSnapWriteTableDataEnd(pWriter);
if (code) goto _err; if (code) goto _err;
...@@ -569,108 +566,154 @@ static int32_t tsdbSnapWriteDataImpl(STsdbSnapWriter* pWriter, TABLEID id) { ...@@ -569,108 +566,154 @@ static int32_t tsdbSnapWriteDataImpl(STsdbSnapWriter* pWriter, TABLEID id) {
} }
} }
// start a new table data if need // start new table data write if need
if (pWriter->pBlockIdxW == NULL) { if (pWriter->pBlockIdxW == NULL) {
// write table data ahead
code = tsdbSnapWriteTableDataAhead(pWriter, id);
if (code) goto _err;
// reader
if (pWriter->iBlockIdx < taosArrayGetSize(pWriter->aBlockIdx)) {
ASSERT(pWriter->pDataFReader);
pWriter->pBlockIdx = (SBlockIdx*)taosArrayGet(pWriter->aBlockIdx, pWriter->iBlock);
int32_t c = tTABLEIDCmprFn(pWriter->pBlockIdx, &id);
if (c) {
ASSERT(c > 0);
pWriter->pBlockIdx = NULL;
} else {
pWriter->iBlockIdx++;
}
} else {
pWriter->pBlockIdx = NULL;
}
if (pWriter->pBlockIdx) {
code = tsdbReadBlock(pWriter->pDataFReader, pWriter->pBlockIdx, &pWriter->mBlock, NULL);
if (code) goto _err;
} else {
tMapDataReset(&pWriter->mBlock);
}
pWriter->iBlock = 0;
pWriter->pBlockData = NULL;
pWriter->iRow = 0;
// writer
pWriter->pBlockIdxW = &pWriter->blockIdxW; pWriter->pBlockIdxW = &pWriter->blockIdxW;
pWriter->pBlockIdxW->suid = id.suid; pWriter->pBlockIdxW->suid = id.suid;
pWriter->pBlockIdxW->uid = id.uid; pWriter->pBlockIdxW->uid = id.uid;
tBlockReset(&pWriter->blockW); tBlockReset(&pWriter->blockW);
tBlockDataReset(&pWriter->bDataW); tBlockDataReset(&pWriter->bDataW);
tMapDataReset(&pWriter->mBlockW); tMapDataReset(&pWriter->mBlockW);
} }
// set block schema ASSERT(pWriter->pBlockIdxW && pWriter->pBlockIdxW->suid == id.suid && pWriter->pBlockIdxW->uid == id.uid);
code = tBlockDataCorrectSchema(&pWriter->bDataW, pBlockData); ASSERT(pWriter->pBlockIdx == NULL || (pWriter->pBlockIdx->suid == id.suid && pWriter->pBlockIdx->uid == id.uid));
if (code) goto _err;
// add rows // BLOCK ====================================
for (int32_t iRow = 0; iRow < pBlockData->nRow; iRow++) { int32_t iRow = 0;
TSDBROW row = tsdbRowFromBlockData(pBlockData, iRow); TSDBROW* pRow = &tsdbRowFromBlockData(pBlockData, iRow);
while (true) {
if (pRow == NULL) break;
code = tBlockDataAppendRow(&pWriter->bDataW, &row, NULL); if (pWriter->pBlockData) {
if (code) goto _err; ASSERT(pWriter->iRow < pWriter->pBlockData->nRow);
if (pWriter->bDataW.nRow >= pWriter->maxRow * 4 / 5) { int32_t c = tsdbRowCmprFn(pRow, &tsdbRowFromBlockData(pWriter->pBlockData, pWriter->iRow));
pWriter->blockW.last = 0;
code = tsdbWriteBlockData(pWriter->pDataFWriter, &pWriter->bDataW, NULL, NULL, pWriter->pBlockIdxW, ASSERT(c);
&pWriter->blockW, pWriter->cmprAlg);
if (c < 0) {
code = tBlockDataAppendRow(&pWriter->bDataW, pRow, NULL);
if (code) goto _err; if (code) goto _err;
code = tMapDataPutItem(&pWriter->mBlockW, &pWriter->blockW, tPutBlock); iRow++;
if (iRow < pWriter->pBlockData->nRow) {
pRow = &tsdbRowFromBlockData(pBlockData, iRow);
} else {
pRow = NULL;
}
} else if (c > 0) {
code = tBlockDataAppendRow(&pWriter->bDataW, &tsdbRowFromBlockData(pWriter->pBlockData, pWriter->iRow), NULL);
if (code) goto _err; if (code) goto _err;
// reset pWriter->iRow++;
tBlockReset(&pWriter->blockW); if (pWriter->iRow >= pWriter->pBlockData->nRow) {
tBlockDataClearData(&pWriter->bDataW); pWriter->pBlockData = NULL;
} }
} }
} else { } else {
// has old data SBlock block;
if (pWriter->iBlock < pWriter->mBlock.nItem) {
tMapDataGetItemByIdx(&pWriter->mBlock, pWriter->iBlock, &block, tGetBlock);
int32_t c;
c = tsdbKeyCmprFn(&block.maxKey, &TSDBROW_KEY(pRow));
ASSERT(c);
// TABLE ==================================================
// end last table data if id not same (todo)
if (pWriter->pBlockIdxW) {
int32_t c = tTABLEIDCmprFn(pWriter->pBlockIdxW, &id);
if (c < 0) { if (c < 0) {
} else if (c > 0) { code = tMapDataPutItem(&pWriter->mBlockW, &block, tPutBlock);
ASSERT(0); if (code) goto _err;
}
pWriter->iBlock++;
continue;
} }
// start new table data if need (todo) c = tsdbKeyCmprFn(&block.minKey, &TSDBROW_KEY(pRow));
if (pWriter->pBlockIdxW == NULL) {
// commit table data ahead ASSERT(c);
code = tsdbSnapWriteTableDataAhead(pWriter, id);
if (c > 0) {
code = tBlockDataAppendRow(&pWriter->bDataW, pRow, NULL);
if (code) goto _err; if (code) goto _err;
// reader iRow++;
if (pWriter->iBlockIdx < taosArrayGetSize(pWriter->aBlockIdx)) { if (iRow < pWriter->pBlockData->nRow) {
pWriter->pBlockIdx = (SBlockIdx*)taosArrayGet(pWriter->aBlockIdx, pWriter->iBlockIdx); pRow = &tsdbRowFromBlockData(pBlockData, iRow);
int32_t c = tTABLEIDCmprFn(pWriter->pBlockIdx, &id);
if (c) {
pWriter->pBlockIdx = NULL;
}
} else { } else {
pWriter->pBlockIdx = NULL; pRow = NULL;
} }
if (pWriter->pBlockIdx) { goto _check_write;
code = tsdbReadBlock(pWriter->pDataFReader, pWriter->pBlockIdx, &pWriter->mBlockW, NULL);
if (code) goto _err;
pWriter->iBlock = 0;
} }
// writer pWriter->pBlockData = &pWriter->bDataR;
pWriter->pBlockIdxW = &pWriter->blockIdxW; code = tsdbReadBlockData(pWriter->pDataFReader, pWriter->pBlockIdx, &block, pWriter->pBlockData, NULL, NULL);
pWriter->pBlockIdxW->suid = id.suid; if (code) goto _err;
pWriter->pBlockIdxW->uid = id.uid;
tBlockReset(&pWriter->blockW); pWriter->iRow = 0;
tBlockDataReset(&pWriter->bDataW);
tMapDataReset(&pWriter->mBlockW);
} }
// BLOCK ================================================== code = tBlockDataAppendRow(&pWriter->bDataW, pRow, NULL);
// write block ahead if (code) goto _err;
while (true) {
if (pWriter->iBlock >= pWriter->mBlock.nItem) break;
SBlock block; iRow++;
tMapDataGetItemByIdx(&pWriter->mBlock, pWriter->iBlock, &block, tGetBlock); if (iRow < pWriter->pBlockData->nRow) {
pRow = &tsdbRowFromBlockData(pBlockData, iRow);
} else {
pRow = NULL;
}
}
if (tsdbKeyCmprFn(&block.maxKey, &keyFirst) >= 0) break; _check_write:
if (pWriter->bDataW.nRow < pWriter->maxRow * 4 / 5) continue;
pWriter->iBlock++; _write_block:
code = tsdbWriteBlockData(pWriter->pDataFWriter, &pWriter->bDataW, NULL, NULL, pWriter->pBlockIdx, &pWriter->blockW,
pWriter->cmprAlg);
if (code) goto _err;
code = tMapDataPutItem(&pWriter->mBlockW, &block, tPutBlock); code = tMapDataPutItem(&pWriter->mBlockW, &pWriter->blockW, tPutBlock);
if (code) goto _err; if (code) goto _err;
}
tBlockReset(&pWriter->blockW);
tBlockDataClearData(&pWriter->bDataW);
} }
_exit:
return code; return code;
_err: _err:
...@@ -720,7 +763,6 @@ static int32_t tsdbSnapWriteData(STsdbSnapWriter* pWriter, uint8_t* pData, uint3 ...@@ -720,7 +763,6 @@ static int32_t tsdbSnapWriteData(STsdbSnapWriter* pWriter, uint8_t* pData, uint3
pWriter->pBlockIdx = NULL; pWriter->pBlockIdx = NULL;
tMapDataReset(&pWriter->mBlock); tMapDataReset(&pWriter->mBlock);
pWriter->iBlock = 0; pWriter->iBlock = 0;
pWriter->pBlock = NULL;
tBlockDataReset(&pWriter->bDataR); tBlockDataReset(&pWriter->bDataR);
pWriter->iRow = 0; pWriter->iRow = 0;
......
...@@ -36,15 +36,15 @@ int32_t tMapDataPutItem(SMapData *pMapData, void *pItem, int32_t (*tPutItemFn)(u ...@@ -36,15 +36,15 @@ int32_t tMapDataPutItem(SMapData *pMapData, void *pItem, int32_t (*tPutItemFn)(u
// alloc // alloc
code = tRealloc((uint8_t **)&pMapData->aOffset, sizeof(int32_t) * pMapData->nItem); code = tRealloc((uint8_t **)&pMapData->aOffset, sizeof(int32_t) * pMapData->nItem);
if (code) goto _err; if (code) goto _exit;
code = tRealloc(&pMapData->pData, pMapData->nData); code = tRealloc(&pMapData->pData, pMapData->nData);
if (code) goto _err; if (code) goto _exit;
// put // put
pMapData->aOffset[nItem] = offset; pMapData->aOffset[nItem] = offset;
tPutItemFn(pMapData->pData + offset, pItem); tPutItemFn(pMapData->pData + offset, pItem);
_err: _exit:
return code; return code;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册