This commit is contained in:
Hongze Cheng 2022-01-21 09:13:22 +00:00
parent 4824ec7d7a
commit e9984c992d
2 changed files with 13 additions and 15 deletions

View File

@ -47,24 +47,24 @@ int tdbMPoolOpen(TDB_MPOOL **mpp, uint64_t cachesize, pgsize_t pgsize) {
TD_DLIST_INIT(&mp->freeList); TD_DLIST_INIT(&mp->freeList);
mp->pages = (pg_t **)calloc(mp->npages, sizeof(pg_t *)); mp->pages = (pg_t *)calloc(mp->npages, sizeof(pg_t));
if (mp->pages == NULL) { if (mp->pages == NULL) {
tdbError("failed to malloc memory pool pages"); tdbError("failed to malloc memory pool pages");
goto _err; goto _err;
} }
for (frame_id_t i = 0; i < mp->npages; i++) { for (frame_id_t i = 0; i < mp->npages; i++) {
mp->pages[i] = (pg_t *)calloc(1, MP_PAGE_SIZE(pgsize)); mp->pages[i].p = malloc(pgsize);
if (mp->pages[i] == NULL) { if (mp->pages[i].p == NULL) {
goto _err; goto _err;
} }
taosInitRWLatch(&mp->pages[i]->rwLatch); taosInitRWLatch(&mp->pages[i].rwLatch);
mp->pages[i]->frameid = i; mp->pages[i].frameid = i;
mp->pages[i]->pgid = TDB_IVLD_PGID; mp->pages[i].pgid = TDB_IVLD_PGID;
// add new page to the free list // add new page to the free list
TD_DLIST_APPEND_WITH_FIELD(&(mp->freeList), mp->pages[i], free); TD_DLIST_APPEND_WITH_FIELD(&(mp->freeList), &(mp->pages[i]), free);
} }
#define PGTAB_FACTOR 1.0 #define PGTAB_FACTOR 1.0
@ -90,7 +90,7 @@ int tdbMPoolClose(TDB_MPOOL *mp) {
tfree(mp->pgtab.hashtab); tfree(mp->pgtab.hashtab);
if (mp->pages) { if (mp->pages) {
for (int i = 0; i < mp->npages; i++) { for (int i = 0; i < mp->npages; i++) {
tfree(mp->pages[i]); tfree(mp->pages[i].p);
} }
free(mp->pages); free(mp->pages);
@ -182,7 +182,7 @@ int tdbMPoolFileGetPage(TDB_MPFILE *mpf, pgno_t pgno, void *addr) {
if (pagep) { if (pagep) {
// page is found // page is found
// todo: pin the page and return // todo: pin the page and return
*(void **)addr = pagep->data; *(void **)addr = pagep->p;
return 0; return 0;
} }
@ -191,7 +191,6 @@ int tdbMPoolFileGetPage(TDB_MPFILE *mpf, pgno_t pgno, void *addr) {
if (pagep) { if (pagep) {
// has free page // has free page
TD_DLIST_POP_WITH_FIELD(&(mp->freeList), pagep, free); TD_DLIST_POP_WITH_FIELD(&(mp->freeList), pagep, free);
// todo: load the page from file and pin the page
} else { } else {
// no free page available // no free page available
// pagep = tdbMpoolEvict(mp); // pagep = tdbMpoolEvict(mp);
@ -208,7 +207,7 @@ int tdbMPoolFileGetPage(TDB_MPFILE *mpf, pgno_t pgno, void *addr) {
// load page from the disk if a container page is available // load page from the disk if a container page is available
// TODO: load the page from the disk // TODO: load the page from the disk
if (tdbMPoolFileReadPage(mpf, pgno, pagep->data) < 0) { if (tdbMPoolFileReadPage(mpf, pgno, pagep->p) < 0) {
return -1; return -1;
} }

View File

@ -32,14 +32,13 @@ typedef struct pg_t {
frame_id_t frameid; frame_id_t frameid;
pgid_t pgid; pgid_t pgid;
uint8_t dirty; uint8_t dirty;
uint8_t rbit;
int32_t pinRef; int32_t pinRef;
pg_free_dlist_node_t free; pg_free_dlist_node_t free;
pg_hash_dlist_node_t hash; pg_hash_dlist_node_t hash;
uint8_t data[]; void * p;
} pg_t; } pg_t;
#define MP_PAGE_SIZE(pgsize) (sizeof(pg_t) + (pgsize))
typedef TD_DLIST(pg_t) pg_list_t; typedef TD_DLIST(pg_t) pg_list_t;
typedef struct { typedef struct {
SRWLatch latch; SRWLatch latch;
@ -49,7 +48,7 @@ struct TDB_MPOOL {
int64_t cachesize; int64_t cachesize;
pgsize_t pgsize; pgsize_t pgsize;
int32_t npages; int32_t npages;
pg_t ** pages; pg_t * pages;
pg_list_t freeList; pg_list_t freeList;
struct { struct {
int32_t nbucket; int32_t nbucket;