Merge pull request #22166 from taosdata/fix/TD-24422

fix(tsdb/cache): reuse data file reader
This commit is contained in:
wade zhang 2023-07-25 10:28:59 +08:00 committed by GitHub
commit 7ea9cf1ddc
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 68 additions and 40 deletions

View File

@ -877,6 +877,7 @@ typedef struct SCacheRowsReader {
SSHashObj *pTableMap; SSHashObj *pTableMap;
SArray *pLDataIterArray; SArray *pLDataIterArray;
struct SDataFileReader *pFileReader; struct SDataFileReader *pFileReader;
STFileSet *pCurFileSet;
STsdbReadSnap *pReadSnap; STsdbReadSnap *pReadSnap;
char *idstr; char *idstr;
int64_t lastTs; int64_t lastTs;

View File

@ -1949,6 +1949,7 @@ static int32_t getNextRowFromFS(void *iter, TSDBROW **ppRow, bool *pIgnoreEarlie
STFileObj **pFileObj = state->pFileSet->farr; STFileObj **pFileObj = state->pFileSet->farr;
if (pFileObj[0] != NULL || pFileObj[3] != NULL) { if (pFileObj[0] != NULL || pFileObj[3] != NULL) {
if (state->pFileSet != state->pr->pCurFileSet) {
SDataFileReaderConfig conf = {.tsdb = state->pTsdb, .szPage = state->pTsdb->pVnode->config.szPage}; SDataFileReaderConfig conf = {.tsdb = state->pTsdb, .szPage = state->pTsdb->pVnode->config.szPage};
const char *filesName[4] = {0}; const char *filesName[4] = {0};
if (pFileObj[0] != NULL) { if (pFileObj[0] != NULL) {
@ -1978,6 +1979,9 @@ static int32_t getNextRowFromFS(void *iter, TSDBROW **ppRow, bool *pIgnoreEarlie
loadDataTomb(state->pr, state->pr->pFileReader); loadDataTomb(state->pr, state->pr->pFileReader);
state->pr->pCurFileSet = state->pFileSet;
}
if (!state->pIndexList) { if (!state->pIndexList) {
state->pIndexList = taosArrayInit(1, sizeof(SBrinBlk)); state->pIndexList = taosArrayInit(1, sizeof(SBrinBlk));
} else { } else {
@ -2053,7 +2057,9 @@ static int32_t getNextRowFromFS(void *iter, TSDBROW **ppRow, bool *pIgnoreEarlie
} }
if (!state->pLastRow) { if (!state->pLastRow) {
if (state->pLastIter) {
lastIterClose(&state->pLastIter); lastIterClose(&state->pLastIter);
}
clearLastFileSet(state); clearLastFileSet(state);
state->state = SFSNEXTROW_FILESET; state->state = SFSNEXTROW_FILESET;
@ -2154,7 +2160,9 @@ static int32_t getNextRowFromFS(void *iter, TSDBROW **ppRow, bool *pIgnoreEarlie
} }
if (!state->pLastRow) { if (!state->pLastRow) {
if (state->pLastIter) {
lastIterClose(&state->pLastIter); lastIterClose(&state->pLastIter);
}
*ppRow = &state->row; *ppRow = &state->row;
--state->iRow; --state->iRow;
@ -2214,19 +2222,6 @@ _err:
return code; return code;
} }
int32_t clearNextRowFromFS(void *iter) {
int32_t code = 0;
SFSNextRowIter *state = (SFSNextRowIter *)iter;
if (!state) {
return code;
}
clearLastFileSet(state);
return code;
}
typedef enum SMEMNEXTROWSTATES { typedef enum SMEMNEXTROWSTATES {
SMEMNEXTROW_ENTER, SMEMNEXTROW_ENTER,
SMEMNEXTROW_NEXT, SMEMNEXTROW_NEXT,
@ -2346,6 +2341,36 @@ typedef struct CacheNextRowIter {
STsdb *pTsdb; STsdb *pTsdb;
} CacheNextRowIter; } CacheNextRowIter;
int32_t clearNextRowFromFS(void *iter) {
int32_t code = 0;
SFSNextRowIter *state = (SFSNextRowIter *)iter;
if (!state) {
return code;
}
if (state->pLastIter) {
lastIterClose(&state->pLastIter);
}
if (state->pBlockData) {
tBlockDataDestroy(state->pBlockData);
state->pBlockData = NULL;
}
if (state->pTSRow) {
taosMemoryFree(state->pTSRow);
state->pTSRow = NULL;
}
if (state->pRowIter->pSkyline) {
taosArrayDestroy(state->pRowIter->pSkyline);
state->pRowIter->pSkyline = NULL;
}
return code;
}
static void clearLastFileSet(SFSNextRowIter *state) { static void clearLastFileSet(SFSNextRowIter *state) {
if (state->pLastIter) { if (state->pLastIter) {
lastIterClose(&state->pLastIter); lastIterClose(&state->pLastIter);
@ -2359,6 +2384,8 @@ static void clearLastFileSet(SFSNextRowIter *state) {
if (state->pr->pFileReader) { if (state->pr->pFileReader) {
tsdbDataFileReaderClose(&state->pr->pFileReader); tsdbDataFileReaderClose(&state->pr->pFileReader);
state->pr->pFileReader = NULL; state->pr->pFileReader = NULL;
state->pr->pCurFileSet = NULL;
} }
if (state->pTSRow) { if (state->pTSRow) {