Merge pull request #27850 from taosdata/fix/TD-31955-3.0
fix(query)[TD-31955]. Fix memory leak in exceptional scenarios
This commit is contained in:
commit
ea20e3c2c3
|
@ -410,7 +410,7 @@ _error:
|
||||||
return TSDB_CODE_OUT_OF_MEMORY;
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
}
|
}
|
||||||
|
|
||||||
static char* doExtractPage(SDiskbasedBuf* pBuf, bool* newPage) {
|
static char* doExtractPage(SDiskbasedBuf* pBuf) {
|
||||||
char* availablePage = NULL;
|
char* availablePage = NULL;
|
||||||
if (NO_IN_MEM_AVAILABLE_PAGES(pBuf)) {
|
if (NO_IN_MEM_AVAILABLE_PAGES(pBuf)) {
|
||||||
availablePage = evictBufPage(pBuf);
|
availablePage = evictBufPage(pBuf);
|
||||||
|
@ -424,7 +424,6 @@ static char* doExtractPage(SDiskbasedBuf* pBuf, bool* newPage) {
|
||||||
if (availablePage == NULL) {
|
if (availablePage == NULL) {
|
||||||
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
}
|
}
|
||||||
*newPage = true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return availablePage;
|
return availablePage;
|
||||||
|
@ -433,8 +432,7 @@ static char* doExtractPage(SDiskbasedBuf* pBuf, bool* newPage) {
|
||||||
void* getNewBufPage(SDiskbasedBuf* pBuf, int32_t* pageId) {
|
void* getNewBufPage(SDiskbasedBuf* pBuf, int32_t* pageId) {
|
||||||
pBuf->statis.getPages += 1;
|
pBuf->statis.getPages += 1;
|
||||||
|
|
||||||
bool newPage = false;
|
char* availablePage = doExtractPage(pBuf);
|
||||||
char* availablePage = doExtractPage(pBuf, &newPage);
|
|
||||||
if (availablePage == NULL) {
|
if (availablePage == NULL) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -450,9 +448,7 @@ void* getNewBufPage(SDiskbasedBuf* pBuf, int32_t* pageId) {
|
||||||
code = lruListPushFront(pBuf->lruList, pi);
|
code = lruListPushFront(pBuf->lruList, pi);
|
||||||
if (TSDB_CODE_SUCCESS != code) {
|
if (TSDB_CODE_SUCCESS != code) {
|
||||||
taosMemoryFree(pi);
|
taosMemoryFree(pi);
|
||||||
if (newPage) {
|
taosMemoryFree(availablePage);
|
||||||
taosMemoryFree(availablePage);
|
|
||||||
}
|
|
||||||
terrno = code;
|
terrno = code;
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -463,9 +459,7 @@ void* getNewBufPage(SDiskbasedBuf* pBuf, int32_t* pageId) {
|
||||||
// register page id info
|
// register page id info
|
||||||
pi = registerNewPageInfo(pBuf, *pageId);
|
pi = registerNewPageInfo(pBuf, *pageId);
|
||||||
if (pi == NULL) {
|
if (pi == NULL) {
|
||||||
if (newPage) {
|
taosMemoryFree(availablePage);
|
||||||
taosMemoryFree(availablePage);
|
|
||||||
}
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -479,7 +473,7 @@ void* getNewBufPage(SDiskbasedBuf* pBuf, int32_t* pageId) {
|
||||||
if (TSDB_CODE_SUCCESS == code) {
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
pBuf->totalBufSize += pBuf->pageSize;
|
pBuf->totalBufSize += pBuf->pageSize;
|
||||||
} else {
|
} else {
|
||||||
if (newPage) taosMemoryFree(availablePage);
|
taosMemoryFree(availablePage);
|
||||||
(void)taosArrayPop(pBuf->pIdList);
|
(void)taosArrayPop(pBuf->pIdList);
|
||||||
(void)tSimpleHashRemove(pBuf->all, pageId, sizeof(int32_t));
|
(void)tSimpleHashRemove(pBuf->all, pageId, sizeof(int32_t));
|
||||||
taosMemoryFree(pi);
|
taosMemoryFree(pi);
|
||||||
|
@ -537,8 +531,7 @@ void* getBufPage(SDiskbasedBuf* pBuf, int32_t id) {
|
||||||
return (void*)(GET_PAYLOAD_DATA(*pi));
|
return (void*)(GET_PAYLOAD_DATA(*pi));
|
||||||
} else { // not in memory
|
} else { // not in memory
|
||||||
|
|
||||||
bool newPage = false;
|
(*pi)->pData = doExtractPage(pBuf);
|
||||||
(*pi)->pData = doExtractPage(pBuf, &newPage);
|
|
||||||
|
|
||||||
// failed to evict buffer page, return with error code.
|
// failed to evict buffer page, return with error code.
|
||||||
if ((*pi)->pData == NULL) {
|
if ((*pi)->pData == NULL) {
|
||||||
|
@ -550,7 +543,7 @@ void* getBufPage(SDiskbasedBuf* pBuf, int32_t id) {
|
||||||
|
|
||||||
int32_t code = lruListPushFront(pBuf->lruList, *pi);
|
int32_t code = lruListPushFront(pBuf->lruList, *pi);
|
||||||
if (TSDB_CODE_SUCCESS != code) {
|
if (TSDB_CODE_SUCCESS != code) {
|
||||||
if (newPage) taosMemoryFree((*pi)->pData);
|
taosMemoryFree((*pi)->pData);
|
||||||
terrno = code;
|
terrno = code;
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -560,9 +553,7 @@ void* getBufPage(SDiskbasedBuf* pBuf, int32_t id) {
|
||||||
if (HAS_DATA_IN_DISK(*pi)) {
|
if (HAS_DATA_IN_DISK(*pi)) {
|
||||||
int32_t code = loadPageFromDisk(pBuf, *pi);
|
int32_t code = loadPageFromDisk(pBuf, *pi);
|
||||||
if (code != 0) {
|
if (code != 0) {
|
||||||
if (newPage) {
|
taosMemoryFree((*pi)->pData);
|
||||||
taosMemoryFree((*pi)->pData);
|
|
||||||
}
|
|
||||||
|
|
||||||
terrno = code;
|
terrno = code;
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
Loading…
Reference in New Issue