fix: release pages with drop case
This commit is contained in:
parent
ff5c1f1cc4
commit
95e591efed
|
@ -509,7 +509,7 @@ static int tdbBtreeBalanceDeeper(SBTree *pBt, SPage *pRoot, SPage **ppChild, TXN
|
|||
static int tdbBtreeBalanceNonRoot(SBTree *pBt, SPage *pParent, int idx, TXN *pTxn) {
|
||||
int ret;
|
||||
|
||||
int nOlds;
|
||||
int nOlds, pageIdx;
|
||||
SPage *pOlds[3] = {0};
|
||||
SCell *pDivCell[3] = {0};
|
||||
int szDivCell[3];
|
||||
|
@ -849,13 +849,11 @@ static int tdbBtreeBalanceNonRoot(SBTree *pBt, SPage *pParent, int idx, TXN *pTx
|
|||
}
|
||||
}
|
||||
|
||||
// TODO: here is not corrent for drop case
|
||||
for (int i = 0; i < nNews; i++) {
|
||||
if (i < nOlds) {
|
||||
tdbPagerReturnPage(pBt->pPager, pOlds[i], pTxn);
|
||||
} else {
|
||||
tdbPagerReturnPage(pBt->pPager, pNews[i], pTxn);
|
||||
for (pageIdx = 0; pageIdx < nOlds; ++pageIdx) {
|
||||
tdbPagerReturnPage(pBt->pPager, pOlds[pageIdx], pTxn);
|
||||
}
|
||||
for (; pageIdx < nNews; ++pageIdx) {
|
||||
tdbPagerReturnPage(pBt->pPager, pNews[pageIdx], pTxn);
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
|
|
@ -98,6 +98,7 @@ SPage *tdbPCacheFetch(SPCache *pCache, const SPgid *pPgid, TXN *pTxn) {
|
|||
// printf("thread %" PRId64 " fetch page %d pgno %d pPage %p nRef %d\n", taosGetSelfPthreadId(), pPage->id,
|
||||
// TDB_PAGE_PGNO(pPage), pPage, nRef);
|
||||
|
||||
tdbDebug("pcache/fetch page %p/%d/%d/%d", pPage, TDB_PAGE_PGNO(pPage), pPage->id, nRef);
|
||||
return pPage;
|
||||
}
|
||||
|
||||
|
|
|
@ -166,6 +166,7 @@ int tdbPagerWrite(SPager *pPager, SPage *pPage) {
|
|||
|
||||
// ref page one more time so the page will not be release
|
||||
tdbRefPage(pPage);
|
||||
tdbDebug("pcache/mdirty page %p/%d/%d", pPage, TDB_PAGE_PGNO(pPage), pPage->id);
|
||||
|
||||
// Set page as dirty
|
||||
pPage->isDirty = 1;
|
||||
|
|
|
@ -280,13 +280,13 @@ struct SPage {
|
|||
|
||||
static inline i32 tdbRefPage(SPage *pPage) {
|
||||
i32 nRef = atomic_add_fetch_32(&((pPage)->nRef), 1);
|
||||
tdbTrace("ref page %d, nRef %d", pPage->id, nRef);
|
||||
tdbTrace("ref page %p/%d, nRef %d", pPage, pPage->id, nRef);
|
||||
return nRef;
|
||||
}
|
||||
|
||||
static inline i32 tdbUnrefPage(SPage *pPage) {
|
||||
i32 nRef = atomic_sub_fetch_32(&((pPage)->nRef), 1);
|
||||
tdbTrace("unref page %d, nRef %d", pPage->id, nRef);
|
||||
tdbTrace("unref page %p/%d, nRef %d", pPage, pPage->id, nRef);
|
||||
return nRef;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue