more TDB
This commit is contained in:
parent
9dea86249c
commit
f9e699bea5
|
@ -73,12 +73,12 @@ int tdbEnvClose(TENV *pEnv) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int tdbBegin(TENV *pEnv) {
|
int tdbBegin(TENV *pEnv, TXN *pTxn) {
|
||||||
SPager *pPager;
|
SPager *pPager;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
for (pPager = pEnv->pgrList; pPager; pPager = pPager->pNext) {
|
for (pPager = pEnv->pgrList; pPager; pPager = pPager->pNext) {
|
||||||
ret = tdbPagerBegin(pPager);
|
ret = tdbPagerBegin(pPager, pTxn);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
ASSERT(0);
|
ASSERT(0);
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -88,12 +88,12 @@ int tdbBegin(TENV *pEnv) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int tdbCommit(TENV *pEnv) {
|
int tdbCommit(TENV *pEnv, TXN *pTxn) {
|
||||||
SPager *pPager;
|
SPager *pPager;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
for (pPager = pEnv->pgrList; pPager; pPager = pPager->pNext) {
|
for (pPager = pEnv->pgrList; pPager; pPager = pPager->pNext) {
|
||||||
ret = tdbPagerCommit(pPager);
|
ret = tdbPagerCommit(pPager, pTxn);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
ASSERT(0);
|
ASSERT(0);
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -103,7 +103,7 @@ int tdbCommit(TENV *pEnv) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int tdbRollback(TENV *pEnv) {
|
int tdbRollback(TENV *pEnv, TXN *pTxn) {
|
||||||
ASSERT(0);
|
ASSERT(0);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -36,7 +36,7 @@ struct SPCache {
|
||||||
#define PAGE_IS_PINNED(pPage) ((pPage)->pLruNext == NULL)
|
#define PAGE_IS_PINNED(pPage) ((pPage)->pLruNext == NULL)
|
||||||
|
|
||||||
static int tdbPCacheOpenImpl(SPCache *pCache);
|
static int tdbPCacheOpenImpl(SPCache *pCache);
|
||||||
static SPage *tdbPCacheFetchImpl(SPCache *pCache, const SPgid *pPgid);
|
static SPage *tdbPCacheFetchImpl(SPCache *pCache, const SPgid *pPgid, TXN *pTxn);
|
||||||
static void tdbPCachePinPage(SPCache *pCache, SPage *pPage);
|
static void tdbPCachePinPage(SPCache *pCache, SPage *pPage);
|
||||||
static void tdbPCacheRemovePageFromHash(SPCache *pCache, SPage *pPage);
|
static void tdbPCacheRemovePageFromHash(SPCache *pCache, SPage *pPage);
|
||||||
static void tdbPCacheAddPageToHash(SPCache *pCache, SPage *pPage);
|
static void tdbPCacheAddPageToHash(SPCache *pCache, SPage *pPage);
|
||||||
|
@ -78,12 +78,12 @@ int tdbPCacheClose(SPCache *pCache) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
SPage *tdbPCacheFetch(SPCache *pCache, const SPgid *pPgid) {
|
SPage *tdbPCacheFetch(SPCache *pCache, const SPgid *pPgid, TXN *pTxn) {
|
||||||
SPage *pPage;
|
SPage *pPage;
|
||||||
|
|
||||||
tdbPCacheLock(pCache);
|
tdbPCacheLock(pCache);
|
||||||
|
|
||||||
pPage = tdbPCacheFetchImpl(pCache, pPgid);
|
pPage = tdbPCacheFetchImpl(pCache, pPgid, pTxn);
|
||||||
if (pPage) {
|
if (pPage) {
|
||||||
TDB_REF_PAGE(pPage);
|
TDB_REF_PAGE(pPage);
|
||||||
}
|
}
|
||||||
|
@ -106,7 +106,8 @@ void tdbPCacheRelease(SPCache *pCache, SPage *pPage) {
|
||||||
|
|
||||||
int tdbPCacheGetPageSize(SPCache *pCache) { return pCache->pageSize; }
|
int tdbPCacheGetPageSize(SPCache *pCache) { return pCache->pageSize; }
|
||||||
|
|
||||||
static SPage *tdbPCacheFetchImpl(SPCache *pCache, const SPgid *pPgid) {
|
static SPage *tdbPCacheFetchImpl(SPCache *pCache, const SPgid *pPgid, TXN *pTxn) {
|
||||||
|
int ret;
|
||||||
SPage *pPage;
|
SPage *pPage;
|
||||||
|
|
||||||
// 1. Search the hash table
|
// 1. Search the hash table
|
||||||
|
@ -117,9 +118,11 @@ static SPage *tdbPCacheFetchImpl(SPCache *pCache, const SPgid *pPgid) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pPage) {
|
if (pPage) {
|
||||||
|
// TODO: the page need to be copied and
|
||||||
|
// replaced the page in hash table
|
||||||
tdbPCachePinPage(pCache, pPage);
|
tdbPCachePinPage(pCache, pPage);
|
||||||
|
return pPage;
|
||||||
}
|
}
|
||||||
return pPage;
|
|
||||||
|
|
||||||
// 2. Try to allocate a new page from the free list
|
// 2. Try to allocate a new page from the free list
|
||||||
if (pCache->pFree) {
|
if (pCache->pFree) {
|
||||||
|
@ -136,7 +139,20 @@ static SPage *tdbPCacheFetchImpl(SPCache *pCache, const SPgid *pPgid) {
|
||||||
tdbPCachePinPage(pCache, pPage);
|
tdbPCachePinPage(pCache, pPage);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 4. Try a stress allocation (TODO)
|
// 4. Try a create new page
|
||||||
|
if (pTxn && pTxn->xMalloc) {
|
||||||
|
ret = tdbPageCreate(pCache->pageSize, &pPage, pTxn->xMalloc, pTxn->xArg);
|
||||||
|
if (ret < 0) {
|
||||||
|
// TODO
|
||||||
|
ASSERT(0);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
// init the page fields
|
||||||
|
pPage->isAnchor = 0;
|
||||||
|
pPage->isLocal = 0;
|
||||||
|
TDB_INIT_PAGE_REF(pPage);
|
||||||
|
}
|
||||||
|
|
||||||
// 5. Page here are just created from a free list
|
// 5. Page here are just created from a free list
|
||||||
// or by recycling or allocated streesly,
|
// or by recycling or allocated streesly,
|
||||||
|
@ -145,6 +161,8 @@ static SPage *tdbPCacheFetchImpl(SPCache *pCache, const SPgid *pPgid) {
|
||||||
memcpy(&(pPage->pgid), pPgid, sizeof(*pPgid));
|
memcpy(&(pPage->pgid), pPgid, sizeof(*pPgid));
|
||||||
pPage->pLruNext = NULL;
|
pPage->pLruNext = NULL;
|
||||||
pPage->pPager = NULL;
|
pPage->pPager = NULL;
|
||||||
|
|
||||||
|
// TODO: allocated page may not add to hash
|
||||||
tdbPCacheAddPageToHash(pCache, pPage);
|
tdbPCacheAddPageToHash(pCache, pPage);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -171,17 +189,21 @@ static void tdbPCacheUnpinPage(SPCache *pCache, SPage *pPage) {
|
||||||
nRef = TDB_GET_PAGE_REF(pPage);
|
nRef = TDB_GET_PAGE_REF(pPage);
|
||||||
ASSERT(nRef >= 0);
|
ASSERT(nRef >= 0);
|
||||||
if (nRef == 0) {
|
if (nRef == 0) {
|
||||||
// Add the page to LRU list
|
if (1) {
|
||||||
ASSERT(pPage->pLruNext == NULL);
|
// Add the page to LRU list
|
||||||
|
ASSERT(pPage->pLruNext == NULL);
|
||||||
|
|
||||||
pPage->pLruPrev = &(pCache->lru);
|
pPage->pLruPrev = &(pCache->lru);
|
||||||
pPage->pLruNext = pCache->lru.pLruNext;
|
pPage->pLruNext = pCache->lru.pLruNext;
|
||||||
pCache->lru.pLruNext->pLruPrev = pPage;
|
pCache->lru.pLruNext->pLruPrev = pPage;
|
||||||
pCache->lru.pLruNext = pPage;
|
pCache->lru.pLruNext = pPage;
|
||||||
|
|
||||||
|
pCache->nRecyclable++;
|
||||||
|
} else {
|
||||||
|
// TODO: may need to free the page
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pCache->nRecyclable++;
|
|
||||||
|
|
||||||
tdbPCacheUnlock(pCache);
|
tdbPCacheUnlock(pCache);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -229,13 +251,14 @@ static int tdbPCacheOpenImpl(SPCache *pCache) {
|
||||||
|
|
||||||
// pPage->pgid = 0;
|
// pPage->pgid = 0;
|
||||||
pPage->isAnchor = 0;
|
pPage->isAnchor = 0;
|
||||||
pPage->isLocalPage = 1;
|
pPage->isLocal = 1;
|
||||||
TDB_INIT_PAGE_REF(pPage);
|
TDB_INIT_PAGE_REF(pPage);
|
||||||
pPage->pHashNext = NULL;
|
pPage->pHashNext = NULL;
|
||||||
pPage->pLruNext = NULL;
|
pPage->pLruNext = NULL;
|
||||||
pPage->pLruPrev = NULL;
|
pPage->pLruPrev = NULL;
|
||||||
pPage->pDirtyNext = NULL;
|
pPage->pDirtyNext = NULL;
|
||||||
|
|
||||||
|
// add page to free list
|
||||||
pPage->pFreeNext = pCache->pFree;
|
pPage->pFreeNext = pCache->pFree;
|
||||||
pCache->pFree = pPage;
|
pCache->pFree = pPage;
|
||||||
pCache->nFree++;
|
pCache->nFree++;
|
||||||
|
|
|
@ -157,7 +157,7 @@ int tdbPagerWrite(SPager *pPager, SPage *pPage) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int tdbPagerBegin(SPager *pPager) {
|
int tdbPagerBegin(SPager *pPager, TXN *pTxn) {
|
||||||
if (pPager->inTran) {
|
if (pPager->inTran) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -175,7 +175,7 @@ int tdbPagerBegin(SPager *pPager) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int tdbPagerCommit(SPager *pPager) {
|
int tdbPagerCommit(SPager *pPager, TXN *pTxn) {
|
||||||
SPage *pPage;
|
SPage *pPage;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
@ -227,7 +227,7 @@ int tdbPagerFetchPage(SPager *pPager, SPgno pgno, SPage **ppPage, int (*initPage
|
||||||
// Fetch a page container from the page cache
|
// Fetch a page container from the page cache
|
||||||
memcpy(&pgid, pPager->fid, TDB_FILE_ID_LEN);
|
memcpy(&pgid, pPager->fid, TDB_FILE_ID_LEN);
|
||||||
pgid.pgno = pgno;
|
pgid.pgno = pgno;
|
||||||
pPage = tdbPCacheFetch(pPager->pCache, &pgid);
|
pPage = tdbPCacheFetch(pPager->pCache, &pgid, NULL);
|
||||||
if (pPage == NULL) {
|
if (pPage == NULL) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -263,7 +263,7 @@ int tdbPagerNewPage(SPager *pPager, SPgno *ppgno, SPage **ppPage, int (*initPage
|
||||||
// Fetch a page container from the page cache
|
// Fetch a page container from the page cache
|
||||||
memcpy(&pgid, pPager->fid, TDB_FILE_ID_LEN);
|
memcpy(&pgid, pPager->fid, TDB_FILE_ID_LEN);
|
||||||
pgid.pgno = *ppgno;
|
pgid.pgno = *ppgno;
|
||||||
pPage = tdbPCacheFetch(pPager->pCache, &pgid);
|
pPage = tdbPCacheFetch(pPager->pCache, &pgid, NULL);
|
||||||
if (pPage == NULL) {
|
if (pPage == NULL) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -33,9 +33,9 @@ typedef struct STEnv {
|
||||||
|
|
||||||
int tdbEnvOpen(const char *rootDir, int pageSize, int cacheSize, TENV **ppEnv);
|
int tdbEnvOpen(const char *rootDir, int pageSize, int cacheSize, TENV **ppEnv);
|
||||||
int tdbEnvClose(TENV *pEnv);
|
int tdbEnvClose(TENV *pEnv);
|
||||||
int tdbBegin(TENV *pEnv);
|
int tdbBegin(TENV *pEnv, TXN *pTxn);
|
||||||
int tdbCommit(TENV *pEnv);
|
int tdbCommit(TENV *pEnv, TXN *pTxn);
|
||||||
int tdbRollback(TENV *pEnv);
|
int tdbRollback(TENV *pEnv, TXN *pTxn);
|
||||||
|
|
||||||
void tdbEnvAddPager(TENV *pEnv, SPager *pPager);
|
void tdbEnvAddPager(TENV *pEnv, SPager *pPager);
|
||||||
void tdbEnvRemovePager(TENV *pEnv, SPager *pPager);
|
void tdbEnvRemovePager(TENV *pEnv, SPager *pPager);
|
||||||
|
|
|
@ -111,6 +111,13 @@ typedef struct SPager SPager;
|
||||||
typedef struct SPCache SPCache;
|
typedef struct SPCache SPCache;
|
||||||
typedef struct SPage SPage;
|
typedef struct SPage SPage;
|
||||||
|
|
||||||
|
typedef struct STxn {
|
||||||
|
u64 txnId;
|
||||||
|
void *(*xMalloc)(void *, size_t);
|
||||||
|
void (*xFree)(void *, void *);
|
||||||
|
void *xArg;
|
||||||
|
} TXN;
|
||||||
|
|
||||||
#include "tdbOs.h"
|
#include "tdbOs.h"
|
||||||
|
|
||||||
#include "tdbUtil.h"
|
#include "tdbUtil.h"
|
||||||
|
|
|
@ -22,7 +22,7 @@ extern "C" {
|
||||||
|
|
||||||
#define TDB_PCACHE_PAGE \
|
#define TDB_PCACHE_PAGE \
|
||||||
u8 isAnchor; \
|
u8 isAnchor; \
|
||||||
u8 isLocalPage; \
|
u8 isLocal; \
|
||||||
u8 isDirty; \
|
u8 isDirty; \
|
||||||
i32 nRef; \
|
i32 nRef; \
|
||||||
SPage *pCacheNext; \
|
SPage *pCacheNext; \
|
||||||
|
@ -48,7 +48,7 @@ extern "C" {
|
||||||
|
|
||||||
int tdbPCacheOpen(int pageSize, int cacheSize, SPCache **ppCache);
|
int tdbPCacheOpen(int pageSize, int cacheSize, SPCache **ppCache);
|
||||||
int tdbPCacheClose(SPCache *pCache);
|
int tdbPCacheClose(SPCache *pCache);
|
||||||
SPage *tdbPCacheFetch(SPCache *pCache, const SPgid *pPgid);
|
SPage *tdbPCacheFetch(SPCache *pCache, const SPgid *pPgid, TXN *pTxn);
|
||||||
void tdbPCacheRelease(SPCache *pCache, SPage *pPage);
|
void tdbPCacheRelease(SPCache *pCache, SPage *pPage);
|
||||||
int tdbPCacheGetPageSize(SPCache *pCache);
|
int tdbPCacheGetPageSize(SPCache *pCache);
|
||||||
|
|
||||||
|
|
|
@ -40,8 +40,8 @@ int tdbPagerOpen(SPCache *pCache, const char *fileName, SPager **ppPager);
|
||||||
int tdbPagerClose(SPager *pPager);
|
int tdbPagerClose(SPager *pPager);
|
||||||
int tdbPagerOpenDB(SPager *pPager, SPgno *ppgno, bool toCreate);
|
int tdbPagerOpenDB(SPager *pPager, SPgno *ppgno, bool toCreate);
|
||||||
int tdbPagerWrite(SPager *pPager, SPage *pPage);
|
int tdbPagerWrite(SPager *pPager, SPage *pPage);
|
||||||
int tdbPagerBegin(SPager *pPager);
|
int tdbPagerBegin(SPager *pPager, TXN *pTxn);
|
||||||
int tdbPagerCommit(SPager *pPager);
|
int tdbPagerCommit(SPager *pPager, TXN *pTxn);
|
||||||
int tdbPagerFetchPage(SPager *pPager, SPgno pgno, SPage **ppPage, int (*initPage)(SPage *, void *), void *arg);
|
int tdbPagerFetchPage(SPager *pPager, SPgno pgno, SPage **ppPage, int (*initPage)(SPage *, void *), void *arg);
|
||||||
int tdbPagerNewPage(SPager *pPager, SPgno *ppgno, SPage **ppPage, int (*initPage)(SPage *, void *), void *arg);
|
int tdbPagerNewPage(SPager *pPager, SPgno *ppgno, SPage **ppPage, int (*initPage)(SPage *, void *), void *arg);
|
||||||
void tdbPagerReturnPage(SPager *pPager, SPage *pPage);
|
void tdbPagerReturnPage(SPager *pPager, SPage *pPage);
|
||||||
|
|
|
@ -20,15 +20,6 @@
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
typedef struct STxn TXN;
|
|
||||||
|
|
||||||
struct STxn {
|
|
||||||
u64 txnId;
|
|
||||||
void *(*xMalloc)(void *, int);
|
|
||||||
void (*xFree)(void *, void *);
|
|
||||||
void *xArg;
|
|
||||||
};
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -135,7 +135,7 @@ TEST(tdb_test, simple_test) {
|
||||||
|
|
||||||
{ // Insert some data
|
{ // Insert some data
|
||||||
for (int i = 1; i <= nData;) {
|
for (int i = 1; i <= nData;) {
|
||||||
tdbBegin(pEnv);
|
tdbBegin(pEnv, NULL);
|
||||||
|
|
||||||
for (int k = 0; k < 2000; k++) {
|
for (int k = 0; k < 2000; k++) {
|
||||||
sprintf(key, "key%d", i);
|
sprintf(key, "key%d", i);
|
||||||
|
@ -145,12 +145,10 @@ TEST(tdb_test, simple_test) {
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
|
|
||||||
tdbCommit(pEnv);
|
tdbCommit(pEnv, NULL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
tdbCommit(pEnv);
|
|
||||||
|
|
||||||
{ // Query the data
|
{ // Query the data
|
||||||
void *pVal = NULL;
|
void *pVal = NULL;
|
||||||
int vLen;
|
int vLen;
|
||||||
|
|
Loading…
Reference in New Issue