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) {
|
static int tdbBtreeBalanceNonRoot(SBTree *pBt, SPage *pParent, int idx, TXN *pTxn) {
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
int nOlds;
|
int nOlds, pageIdx;
|
||||||
SPage *pOlds[3] = {0};
|
SPage *pOlds[3] = {0};
|
||||||
SCell *pDivCell[3] = {0};
|
SCell *pDivCell[3] = {0};
|
||||||
int szDivCell[3];
|
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 (pageIdx = 0; pageIdx < nOlds; ++pageIdx) {
|
||||||
for (int i = 0; i < nNews; i++) {
|
tdbPagerReturnPage(pBt->pPager, pOlds[pageIdx], pTxn);
|
||||||
if (i < nOlds) {
|
}
|
||||||
tdbPagerReturnPage(pBt->pPager, pOlds[i], pTxn);
|
for (; pageIdx < nNews; ++pageIdx) {
|
||||||
} else {
|
tdbPagerReturnPage(pBt->pPager, pNews[pageIdx], pTxn);
|
||||||
tdbPagerReturnPage(pBt->pPager, pNews[i], pTxn);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
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,
|
// printf("thread %" PRId64 " fetch page %d pgno %d pPage %p nRef %d\n", taosGetSelfPthreadId(), pPage->id,
|
||||||
// TDB_PAGE_PGNO(pPage), pPage, nRef);
|
// TDB_PAGE_PGNO(pPage), pPage, nRef);
|
||||||
|
|
||||||
|
tdbDebug("pcache/fetch page %p/%d/%d/%d", pPage, TDB_PAGE_PGNO(pPage), pPage->id, nRef);
|
||||||
return pPage;
|
return pPage;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -166,6 +166,7 @@ int tdbPagerWrite(SPager *pPager, SPage *pPage) {
|
||||||
|
|
||||||
// ref page one more time so the page will not be release
|
// ref page one more time so the page will not be release
|
||||||
tdbRefPage(pPage);
|
tdbRefPage(pPage);
|
||||||
|
tdbDebug("pcache/mdirty page %p/%d/%d", pPage, TDB_PAGE_PGNO(pPage), pPage->id);
|
||||||
|
|
||||||
// Set page as dirty
|
// Set page as dirty
|
||||||
pPage->isDirty = 1;
|
pPage->isDirty = 1;
|
||||||
|
|
|
@ -280,13 +280,13 @@ struct SPage {
|
||||||
|
|
||||||
static inline i32 tdbRefPage(SPage *pPage) {
|
static inline i32 tdbRefPage(SPage *pPage) {
|
||||||
i32 nRef = atomic_add_fetch_32(&((pPage)->nRef), 1);
|
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;
|
return nRef;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline i32 tdbUnrefPage(SPage *pPage) {
|
static inline i32 tdbUnrefPage(SPage *pPage) {
|
||||||
i32 nRef = atomic_sub_fetch_32(&((pPage)->nRef), 1);
|
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;
|
return nRef;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue