fix(tdb/recycling): delay freedb's own page recycling until balance done
This commit is contained in:
parent
4fa61b9eae
commit
4cc3a55426
|
@ -720,15 +720,39 @@ int tdbPagerInsertFreePage(SPager *pPager, SPage *pPage, TXN *pTxn) {
|
||||||
int code = 0;
|
int code = 0;
|
||||||
SPgno pgno = TDB_PAGE_PGNO(pPage);
|
SPgno pgno = TDB_PAGE_PGNO(pPage);
|
||||||
|
|
||||||
|
if (pPager->frps) {
|
||||||
|
taosArrayPush(pPager->frps, &pgno);
|
||||||
|
pPage->pPager = NULL;
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
|
pPager->frps = taosArrayInit(8, sizeof(SPgno));
|
||||||
// memset(pPage->pData, 0, pPage->pageSize);
|
// memset(pPage->pData, 0, pPage->pageSize);
|
||||||
tdbTrace("tdb/insert-free-page: tbc recycle page: %d.", pgno);
|
tdbTrace("tdb/insert-free-page: tbc recycle page: %d.", pgno);
|
||||||
// printf("tdb/insert-free-page: tbc recycle page: %d.\n", pgno);
|
// printf("tdb/insert-free-page: tbc recycle page: %d.\n", pgno);
|
||||||
code = tdbTbInsert(pPager->pEnv->pFreeDb, &pgno, sizeof(pgno), NULL, 0, pTxn);
|
code = tdbTbInsert(pPager->pEnv->pFreeDb, &pgno, sizeof(pgno), NULL, 0, pTxn);
|
||||||
if (code < 0) {
|
if (code < 0) {
|
||||||
tdbError("tdb/insert-free-page: tb insert failed with ret: %d.", code);
|
tdbError("tdb/insert-free-page: tb insert failed with ret: %d.", code);
|
||||||
|
taosArrayDestroy(pPager->frps);
|
||||||
|
pPager->frps = NULL;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
while (TARRAY_SIZE(pPager->frps) > 0) {
|
||||||
|
pgno = *(SPgno *)taosArrayPop(pPager->frps);
|
||||||
|
|
||||||
|
code = tdbTbInsert(pPager->pEnv->pFreeDb, &pgno, sizeof(pgno), NULL, 0, pTxn);
|
||||||
|
if (code < 0) {
|
||||||
|
tdbError("tdb/insert-free-page: tb insert failed with ret: %d.", code);
|
||||||
|
taosArrayDestroy(pPager->frps);
|
||||||
|
pPager->frps = NULL;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
taosArrayDestroy(pPager->frps);
|
||||||
|
pPager->frps = NULL;
|
||||||
|
|
||||||
pPage->pPager = NULL;
|
pPage->pPager = NULL;
|
||||||
|
|
||||||
return code;
|
return code;
|
||||||
|
@ -739,7 +763,11 @@ static int tdbPagerRemoveFreePage(SPager *pPager, SPgno *pPgno, TXN *pTxn) {
|
||||||
TBC *pCur;
|
TBC *pCur;
|
||||||
|
|
||||||
if (!pPager->pEnv->pFreeDb) {
|
if (!pPager->pEnv->pFreeDb) {
|
||||||
return 0;
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pPager->frps) {
|
||||||
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
code = tdbTbcOpen(pPager->pEnv->pFreeDb, &pCur, pTxn);
|
code = tdbTbcOpen(pPager->pEnv->pFreeDb, &pCur, pTxn);
|
||||||
|
|
|
@ -408,6 +408,7 @@ struct SPager {
|
||||||
// u8 inTran;
|
// u8 inTran;
|
||||||
TXN *pActiveTxn;
|
TXN *pActiveTxn;
|
||||||
SArray *ofps;
|
SArray *ofps;
|
||||||
|
SArray *frps;
|
||||||
SPager *pNext; // used by TDB
|
SPager *pNext; // used by TDB
|
||||||
SPager *pHashNext; // used by TDB
|
SPager *pHashNext; // used by TDB
|
||||||
#ifdef USE_MAINDB
|
#ifdef USE_MAINDB
|
||||||
|
|
Loading…
Reference in New Issue