提交 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,127 +549,171 @@ static int32_t tsdbSnapWriteDataImpl(STsdbSnapWriter* pWriter, TABLEID id) { ...@@ -550,127 +549,171 @@ 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) {
// end
code = tsdbSnapWriteTableDataEnd(pWriter);
if (code) goto _err;
if (c < 0) { // reset
// end last table data write pWriter->pBlockIdxW = NULL;
code = tsdbSnapWriteTableDataEnd(pWriter); } else if (c > 0) {
if (code) goto _err; ASSERT(0);
}
}
// reset // start new table data write if need
pWriter->pBlockIdxW = NULL; if (pWriter->pBlockIdxW == NULL) {
} else if (c > 0) { // write table data ahead
ASSERT(0); 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;
} }
// start a new table data if need if (pWriter->pBlockIdx) {
if (pWriter->pBlockIdxW == NULL) { code = tsdbReadBlock(pWriter->pDataFReader, pWriter->pBlockIdx, &pWriter->mBlock, NULL);
pWriter->pBlockIdxW = &pWriter->blockIdxW; if (code) goto _err;
pWriter->pBlockIdxW->suid = id.suid; } else {
pWriter->pBlockIdxW->uid = id.uid; tMapDataReset(&pWriter->mBlock);
}
pWriter->iBlock = 0;
pWriter->pBlockData = NULL;
pWriter->iRow = 0;
tBlockReset(&pWriter->blockW); // writer
pWriter->pBlockIdxW = &pWriter->blockIdxW;
pWriter->pBlockIdxW->suid = id.suid;
pWriter->pBlockIdxW->uid = id.uid;
tBlockDataReset(&pWriter->bDataW); tBlockReset(&pWriter->blockW);
tBlockDataReset(&pWriter->bDataW);
tMapDataReset(&pWriter->mBlockW);
}
tMapDataReset(&pWriter->mBlockW); ASSERT(pWriter->pBlockIdxW && pWriter->pBlockIdxW->suid == id.suid && pWriter->pBlockIdxW->uid == id.uid);
} ASSERT(pWriter->pBlockIdx == NULL || (pWriter->pBlockIdx->suid == id.suid && pWriter->pBlockIdx->uid == id.uid));
// set block schema // BLOCK ====================================
code = tBlockDataCorrectSchema(&pWriter->bDataW, pBlockData); int32_t iRow = 0;
if (code) goto _err; TSDBROW* pRow = &tsdbRowFromBlockData(pBlockData, iRow);
while (true) {
if (pRow == NULL) break;
// add rows if (pWriter->pBlockData) {
for (int32_t iRow = 0; iRow < pBlockData->nRow; iRow++) { ASSERT(pWriter->iRow < pWriter->pBlockData->nRow);
TSDBROW row = tsdbRowFromBlockData(pBlockData, iRow);
code = tBlockDataAppendRow(&pWriter->bDataW, &row, NULL); int32_t c = tsdbRowCmprFn(pRow, &tsdbRowFromBlockData(pWriter->pBlockData, pWriter->iRow));
if (code) goto _err;
ASSERT(c);
if (pWriter->bDataW.nRow >= pWriter->maxRow * 4 / 5) { if (c < 0) {
pWriter->blockW.last = 0; code = tBlockDataAppendRow(&pWriter->bDataW, pRow, NULL);
code = tsdbWriteBlockData(pWriter->pDataFWriter, &pWriter->bDataW, NULL, NULL, pWriter->pBlockIdxW,
&pWriter->blockW, pWriter->cmprAlg);
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 { SBlock block;
// has old data
// TABLE ================================================== if (pWriter->iBlock < pWriter->mBlock.nItem) {
// end last table data if id not same (todo) tMapDataGetItemByIdx(&pWriter->mBlock, pWriter->iBlock, &block, tGetBlock);
if (pWriter->pBlockIdxW) { int32_t c;
int32_t c = tTABLEIDCmprFn(pWriter->pBlockIdxW, &id);
if (c < 0) {
} else if (c > 0) {
ASSERT(0);
}
}
// start new table data if need (todo) c = tsdbKeyCmprFn(&block.maxKey, &TSDBROW_KEY(pRow));
if (pWriter->pBlockIdxW == NULL) {
// commit table data ahead ASSERT(c);
code = tsdbSnapWriteTableDataAhead(pWriter, id);
if (code) goto _err;
// reader if (c < 0) {
if (pWriter->iBlockIdx < taosArrayGetSize(pWriter->aBlockIdx)) { code = tMapDataPutItem(&pWriter->mBlockW, &block, tPutBlock);
pWriter->pBlockIdx = (SBlockIdx*)taosArrayGet(pWriter->aBlockIdx, pWriter->iBlockIdx); if (code) goto _err;
int32_t c = tTABLEIDCmprFn(pWriter->pBlockIdx, &id);
if (c) { pWriter->iBlock++;
pWriter->pBlockIdx = NULL; continue;
} }
} else {
pWriter->pBlockIdx = NULL;
}
if (pWriter->pBlockIdx) { c = tsdbKeyCmprFn(&block.minKey, &TSDBROW_KEY(pRow));
code = tsdbReadBlock(pWriter->pDataFReader, pWriter->pBlockIdx, &pWriter->mBlockW, NULL);
ASSERT(c);
if (c > 0) {
code = tBlockDataAppendRow(&pWriter->bDataW, pRow, NULL);
if (code) goto _err;
iRow++;
if (iRow < pWriter->pBlockData->nRow) {
pRow = &tsdbRowFromBlockData(pBlockData, iRow);
} else {
pRow = NULL;
}
goto _check_write;
}
pWriter->pBlockData = &pWriter->bDataR;
code = tsdbReadBlockData(pWriter->pDataFReader, pWriter->pBlockIdx, &block, pWriter->pBlockData, NULL, NULL);
if (code) goto _err; if (code) goto _err;
pWriter->iBlock = 0; pWriter->iRow = 0;
} }
// writer code = tBlockDataAppendRow(&pWriter->bDataW, pRow, NULL);
pWriter->pBlockIdxW = &pWriter->blockIdxW; if (code) goto _err;
pWriter->pBlockIdxW->suid = id.suid;
pWriter->pBlockIdxW->uid = id.uid;
tBlockReset(&pWriter->blockW); iRow++;
tBlockDataReset(&pWriter->bDataW); if (iRow < pWriter->pBlockData->nRow) {
tMapDataReset(&pWriter->mBlockW); pRow = &tsdbRowFromBlockData(pBlockData, iRow);
} else {
pRow = NULL;
}
} }
// BLOCK ================================================== _check_write:
// write block ahead if (pWriter->bDataW.nRow < pWriter->maxRow * 4 / 5) continue;
while (true) {
if (pWriter->iBlock >= pWriter->mBlock.nItem) break;
SBlock block; _write_block:
tMapDataGetItemByIdx(&pWriter->mBlock, pWriter->iBlock, &block, tGetBlock); code = tsdbWriteBlockData(pWriter->pDataFWriter, &pWriter->bDataW, NULL, NULL, pWriter->pBlockIdx, &pWriter->blockW,
pWriter->cmprAlg);
if (tsdbKeyCmprFn(&block.maxKey, &keyFirst) >= 0) break; if (code) goto _err;
pWriter->iBlock++; code = tMapDataPutItem(&pWriter->mBlockW, &pWriter->blockW, tPutBlock);
if (code) goto _err;
code = tMapDataPutItem(&pWriter->mBlockW, &block, tPutBlock); tBlockReset(&pWriter->blockW);
if (code) goto _err; 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.
先完成此消息的编辑!
想要评论请 注册