diff --git a/source/libs/tdb/src/db/tdbBtree.c b/source/libs/tdb/src/db/tdbBtree.c index fcabc5d6cdf8af6239b808f339ae21293e4b5a3a..e74745ac139c606a4f4e4fb4d2987c688fd5f537 100644 --- a/source/libs/tdb/src/db/tdbBtree.c +++ b/source/libs/tdb/src/db/tdbBtree.c @@ -450,12 +450,14 @@ static int tdbBtreeBalanceDeeper(SBTree *pBt, SPage *pRoot, SPage **ppChild) { return 0; } -static int tdbBtreeBalanceNonRoot(SBTree *pBt, SPage *pParent, bool isRoot) { -#if 0 - int i; +static int tdbBtreeBalanceNonRoot(SBTree *pBt, SPage *pParent, int idx, bool isRoot) { + int nOldPages; + SPage *pOldPages[3]; + int nNewPages; + SPage *pNewPages[5]; + + // Find three or less sibling pages - i = pParent->pPageHdr->nCells + pParent->nOverFlow; -#endif /* TODO */ return 0; } @@ -500,7 +502,7 @@ static int tdbBtreeBalance(SBtCursor *pCur) { // Generalized balance step pParent = pCur->pgStack[pCur->iPage - 1]; - ret = tdbBtreeBalanceNonRoot(pCur->pBt, pParent, (iPage == 1)); + ret = tdbBtreeBalanceNonRoot(pCur->pBt, pParent, pCur->idxStack[pCur->iPage - 1], (iPage == 1)); if (ret < 0) { return -1; } diff --git a/source/libs/tdb/src/db/tdbPCache.c b/source/libs/tdb/src/db/tdbPCache.c index b744f6b677ca30180f000e5bc327d82fc0059bdb..3c8c8d84cd8b3df3299d099b27638f37c8f87651 100644 --- a/source/libs/tdb/src/db/tdbPCache.c +++ b/source/libs/tdb/src/db/tdbPCache.c @@ -188,7 +188,7 @@ static void tdbPCacheUnpinPage(SPage *pPage) { tdbPCacheLock(pCache); - nRef = TDB_PAGE_REF(pPage); + nRef = TDB_GET_PAGE_REF(pPage); ASSERT(nRef >= 0); if (nRef == 0) { // Add the page to LRU list diff --git a/source/libs/tdb/src/db/tdbPage.c b/source/libs/tdb/src/db/tdbPage.c new file mode 100644 index 0000000000000000000000000000000000000000..2ce1e62c16c2292457c8b5c05774113df82ee1b1 --- /dev/null +++ b/source/libs/tdb/src/db/tdbPage.c @@ -0,0 +1,16 @@ +/* + * Copyright (c) 2019 TAOS Data, Inc. + * + * This program is free software: you can use, redistribute, and/or modify + * it under the terms of the GNU Affero General Public License, version 3 + * or later ("AGPL"), as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +#include "tdbInt.h" \ No newline at end of file diff --git a/source/libs/tdb/src/inc/tdbPage.h b/source/libs/tdb/src/inc/tdbPage.h index e5a78728455b590585c0fb66dfe8d3c01cef6a74..d8d609e4e0160a1781e25d6e2e9dc802221397cb 100644 --- a/source/libs/tdb/src/inc/tdbPage.h +++ b/source/libs/tdb/src/inc/tdbPage.h @@ -32,26 +32,27 @@ typedef struct SPage SPage; struct SPage { pthread_spinlock_t lock; // Fields below used by page cache - void * pData; + void *pData; SPgid pgid; u8 isAnchor; u8 isLocalPage; u8 isDirty; i32 nRef; SPCache *pCache; - SPage * pFreeNext; - SPage * pHashNext; - SPage * pLruNext; - SPage * pLruPrev; - SPage * pDirtyNext; - SPager * pPager; + SPage *pFreeNext; + SPage *pHashNext; + SPage *pLruNext; + SPage *pLruPrev; + SPage *pDirtyNext; + SPager *pPager; // Fields below used by pager and am SPageHdr *pPageHdr; - u16 * aCellIdx; + u16 *aCellIdx; int kLen; int vLen; int maxLocal; int minLocal; + int nOverflow; }; // For page lock @@ -76,16 +77,16 @@ struct SPage { ret; \ }) -// For page ref (TODO: Need atomic operation) +// For page ref #define TDB_INIT_PAGE_REF(pPage) ((pPage)->nRef = 0) #if 0 #define TDB_REF_PAGE(pPage) (++(pPage)->nRef) #define TDB_UNREF_PAGE(pPage) (--(pPage)->nRef) -#define TDB_PAGE_REF(pPage) ((pPage)->nRef) +#define TDB_GET_PAGE_REF(pPage) ((pPage)->nRef) #else #define TDB_REF_PAGE(pPage) atomic_add_fetch_32(&((pPage)->nRef), 1) #define TDB_UNREF_PAGE(pPage) atomic_sub_fetch_32(&((pPage)->nRef), 1) -#define TDB_PAGE_REF(pPage) atomic_load_32(&((pPage)->nRef)) +#define TDB_GET_PAGE_REF(pPage) atomic_load_32(&((pPage)->nRef)) #endif #ifdef __cplusplus