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

more work

上级 2a6be2bc
...@@ -738,98 +738,135 @@ _err: ...@@ -738,98 +738,135 @@ _err:
return code; return code;
} }
int32_t tsdbReadColData(SDataFReader *pReader, SBlockIdx *pBlockIdx, SBlock *pBlock, int16_t *aColId, int32_t nCol, static int32_t tsdbReadColDataImpl(SDataFReader *pReader, SBlockIdx *pBlockIdx, SBlock *pBlock, int32_t iSubBlock,
SBlockData *pBlockData, uint8_t **ppBuf1, uint8_t **ppBuf2) { int16_t *aColId, int32_t nCol, SBlockData *pBlockData, uint8_t **ppBuf1,
int32_t code = 0; uint8_t **ppBuf2) {
TdFilePtr pFD = pBlock->last ? pReader->pLastFD : pReader->pDataFD; TdFilePtr pFD = pBlock->last ? pReader->pLastFD : pReader->pDataFD;
uint8_t *pBuf1 = NULL; SSubBlock *pSubBlock = &pBlock->aSubBlock[iSubBlock];
uint8_t *pBuf2 = NULL; int32_t code = 0;
int64_t offset;
ASSERT(nCol == 0 || aColId[0] != PRIMARYKEY_TIMESTAMP_COL_ID); int64_t size;
int64_t n;
if (!ppBuf1) ppBuf1 = &pBuf1; tBlockDataReset(pBlockData);
if (!ppBuf2) ppBuf2 = &pBuf2; pBlockData->nRow = pSubBlock->nRow;
for (int32_t iSubBlock = 0; iSubBlock < pBlock->nSubBlock; iSubBlock++) { // TSDBKEY
SSubBlock *pSubBlock = &pBlock->aSubBlock[iSubBlock]; offset = pSubBlock->offset + sizeof(SBlockDataHdr);
int64_t offset; size = pSubBlock->vsize + pSubBlock->ksize + sizeof(TSCKSUM);
int64_t size; code = tsdbRealloc(ppBuf1, size);
int64_t n; if (code) goto _err;
tBlockDataReset(pBlockData); n = taosLSeekFile(pFD, offset, SEEK_SET);
pBlockData->nRow = pSubBlock->nRow; if (n < 0) {
code = TAOS_SYSTEM_ERROR(errno);
goto _err;
}
// TSDBKEY n = taosReadFile(pFD, *ppBuf1, size);
offset = pSubBlock->offset + sizeof(SBlockDataHdr); if (n < 0) {
size = pSubBlock->vsize + pSubBlock->ksize + sizeof(TSCKSUM); code = TAOS_SYSTEM_ERROR(errno);
code = tsdbRealloc(ppBuf1, size); goto _err;
if (code) goto _err; } else if (n < size) {
code = TSDB_CODE_FILE_CORRUPTED;
goto _err;
}
n = taosLSeekFile(pFD, offset, SEEK_SET); code = tsdbRecoverBlockDataKey(pBlockData, pSubBlock, *ppBuf1, ppBuf2);
if (n < 0) { if (code) goto _err;
code = TAOS_SYSTEM_ERROR(errno);
goto _err;
}
n = taosReadFile(pFD, *ppBuf1, size); // OTHER
if (n < 0) { SBlockCol blockCol;
code = TAOS_SYSTEM_ERROR(errno); SBlockCol *pBlockCol = &blockCol;
goto _err; SColData *pColData;
} else if (n < size) { for (int32_t iCol = 0; iCol < nCol; iCol++) {
code = TSDB_CODE_FILE_CORRUPTED; int16_t cid = aColId[iCol];
goto _err;
}
code = tsdbRecoverBlockDataKey(pBlockData, pSubBlock, *ppBuf1, ppBuf2); if (tMapDataSearch(&pSubBlock->mBlockCol, &(SBlockCol){.cid = cid}, tGetBlockCol, tBlockColCmprFn, pBlockCol) ==
if (code) goto _err; 0) {
code = tBlockDataAddColData(pBlockData, taosArrayGetSize(pBlockData->aColDataP), &pColData);
if (code) goto _err;
// OTHER tColDataReset(pColData, pBlockCol->cid, pBlockCol->type);
SBlockCol blockCol; if (pBlockCol->flag == HAS_NULL) {
SBlockCol *pBlockCol = &blockCol; for (int32_t iRow = 0; iRow < pSubBlock->nRow; iRow++) {
SColData *pColData; code = tColDataAppendValue(pColData, &COL_VAL_NULL(pBlockCol->cid, pBlockCol->type));
for (int32_t iCol = 0; iCol < nCol; iCol++) { if (code) goto _err;
int16_t cid = aColId[iCol]; }
} else {
offset = pSubBlock->offset + sizeof(SBlockDataHdr) + pSubBlock->vsize + pSubBlock->ksize + pBlockCol->offset;
size = pBlockCol->bsize + pBlockCol->csize + sizeof(TSCKSUM);
if (tMapDataSearch(&pSubBlock->mBlockCol, &(SBlockCol){.cid = cid}, tGetBlockCol, tBlockColCmprFn, pBlockCol) == code = tsdbRealloc(ppBuf1, size);
0) {
code = tBlockDataAddColData(pBlockData, taosArrayGetSize(pBlockData->aColDataP), &pColData);
if (code) goto _err; if (code) goto _err;
tColDataReset(pColData, pBlockCol->cid, pBlockCol->type); // seek
if (pBlockCol->flag == HAS_NULL) { n = taosLSeekFile(pFD, offset, SEEK_SET);
for (int32_t iRow = 0; iRow < pSubBlock->nRow; iRow++) { if (n < 0) {
code = tColDataAppendValue(pColData, &COL_VAL_NULL(pBlockCol->cid, pBlockCol->type)); code = TAOS_SYSTEM_ERROR(errno);
if (code) goto _err; goto _err;
} }
} else {
offset = pSubBlock->offset + sizeof(SBlockDataHdr) + pSubBlock->vsize + pSubBlock->ksize + pBlockCol->offset;
size = pBlockCol->bsize + pBlockCol->csize + sizeof(TSCKSUM);
code = tsdbRealloc(ppBuf1, size);
if (code) goto _err;
// seek // read
n = taosLSeekFile(pFD, offset, SEEK_SET); n = taosReadFile(pFD, *ppBuf1, size);
if (n < 0) { if (n < 0) {
code = TAOS_SYSTEM_ERROR(errno); code = TAOS_SYSTEM_ERROR(errno);
goto _err; goto _err;
} } else if (n < size) {
code = TSDB_CODE_FILE_CORRUPTED;
// read goto _err;
n = taosReadFile(pFD, *ppBuf1, size);
if (n < 0) {
code = TAOS_SYSTEM_ERROR(errno);
goto _err;
} else if (n < size) {
code = TSDB_CODE_FILE_CORRUPTED;
goto _err;
}
code = tsdbRecoverColData(pBlockData, pSubBlock, pBlockCol, pColData, *ppBuf1, ppBuf2);
if (code) goto _err;
} }
code = tsdbRecoverColData(pBlockData, pSubBlock, pBlockCol, pColData, *ppBuf1, ppBuf2);
if (code) goto _err;
}
}
}
return code;
_err:
return code;
}
int32_t tsdbReadColData(SDataFReader *pReader, SBlockIdx *pBlockIdx, SBlock *pBlock, int16_t *aColId, int32_t nCol,
SBlockData *pBlockData, uint8_t **ppBuf1, uint8_t **ppBuf2) {
int32_t code = 0;
uint8_t *pBuf1 = NULL;
uint8_t *pBuf2 = NULL;
ASSERT(nCol == 0 || aColId[0] != PRIMARYKEY_TIMESTAMP_COL_ID);
if (!ppBuf1) ppBuf1 = &pBuf1;
if (!ppBuf2) ppBuf2 = &pBuf2;
code = tsdbReadColDataImpl(pReader, pBlockIdx, pBlock, 0, aColId, nCol, pBlockData, ppBuf1, ppBuf2);
if (code) goto _err;
if (pBlock->nSubBlock > 1) {
SBlockData *pBlockData1 = &(SBlockData){0};
SBlockData *pBlockData2 = &(SBlockData){0};
for (int32_t iSubBlock = 1; iSubBlock < pBlock->nSubBlock; iSubBlock++) {
code = tsdbReadColDataImpl(pReader, pBlockIdx, pBlock, iSubBlock, aColId, nCol, pBlockData1, ppBuf1, ppBuf2);
if (code) goto _err;
code = tBlockDataCopy(pBlockData, pBlockData2);
if (code) {
tBlockDataClear(pBlockData1);
tBlockDataClear(pBlockData2);
goto _err;
}
code = tBlockDataMerge(pBlockData1, pBlockData2, pBlockData);
if (code) {
tBlockDataClear(pBlockData1);
tBlockDataClear(pBlockData2);
goto _err;
} }
} }
tBlockDataClear(pBlockData1);
tBlockDataClear(pBlockData2);
} }
tsdbFree(pBuf1); tsdbFree(pBuf1);
...@@ -876,34 +913,6 @@ static int32_t tsdbReadSubBlockData(SDataFReader *pReader, SBlockIdx *pBlockIdx, ...@@ -876,34 +913,6 @@ static int32_t tsdbReadSubBlockData(SDataFReader *pReader, SBlockIdx *pBlockIdx,
goto _err; goto _err;
} }
// // check
// p = *ppBuf1;
// SBlockDataHdr *pHdr = (SBlockDataHdr *)p;
// ASSERT(pHdr->delimiter == TSDB_FILE_DLMT);
// ASSERT(pHdr->suid == pBlockIdx->suid);
// ASSERT(pHdr->uid == pBlockIdx->uid);
// p += sizeof(*pHdr);
// if (!taosCheckChecksumWhole(p, pSubBlock->vsize + pSubBlock->ksize + sizeof(TSCKSUM))) {
// code = TSDB_CODE_FILE_CORRUPTED;
// goto _err;
// }
// p += (pSubBlock->vsize + pSubBlock->ksize + sizeof(TSCKSUM));
// for (int32_t iBlockCol = 0; iBlockCol < pSubBlock->mBlockCol.nItem; iBlockCol++) {
// tMapDataGetItemByIdx(&pSubBlock->mBlockCol, iBlockCol, pBlockCol, tGetBlockCol);
// ASSERT(pBlockCol->flag && pBlockCol->flag != HAS_NONE);
// if (pBlockCol->flag == HAS_NULL) continue;
// if (!taosCheckChecksumWhole(p, pBlockCol->bsize + pBlockCol->csize + sizeof(TSCKSUM))) {
// code = TSDB_CODE_FILE_CORRUPTED;
// goto _err;
// }
// p = p + pBlockCol->bsize + pBlockCol->csize + sizeof(TSCKSUM);
// }
// recover // recover
pBlockData->nRow = pSubBlock->nRow; pBlockData->nRow = pSubBlock->nRow;
p = *ppBuf1 + sizeof(SBlockDataHdr); p = *ppBuf1 + sizeof(SBlockDataHdr);
...@@ -964,7 +973,7 @@ int32_t tsdbReadBlockData(SDataFReader *pReader, SBlockIdx *pBlockIdx, SBlock *p ...@@ -964,7 +973,7 @@ int32_t tsdbReadBlockData(SDataFReader *pReader, SBlockIdx *pBlockIdx, SBlock *p
SBlockData *pBlockData2 = &(SBlockData){0}; SBlockData *pBlockData2 = &(SBlockData){0};
for (iSubBlock = 1; iSubBlock < pBlock->nSubBlock; iSubBlock++) { for (iSubBlock = 1; iSubBlock < pBlock->nSubBlock; iSubBlock++) {
code = tsdbReadSubBlockData(pReader, pBlockIdx, pBlock, iSubBlock, pBlockData, ppBuf1, ppBuf2); code = tsdbReadSubBlockData(pReader, pBlockIdx, pBlock, iSubBlock, pBlockData1, ppBuf1, ppBuf2);
if (code) { if (code) {
tBlockDataClear(pBlockData1); tBlockDataClear(pBlockData1);
tBlockDataClear(pBlockData2); tBlockDataClear(pBlockData2);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册