This commit is contained in:
Hongze Cheng 2022-01-10 12:40:15 +00:00
parent 358b5641aa
commit dca02a8566
7 changed files with 127 additions and 22 deletions

View File

@ -8,4 +8,5 @@ target_include_directories(
target_link_libraries( target_link_libraries(
tkv tkv
PUBLIC os PUBLIC os
PUBLIC util
) )

View File

@ -0,0 +1,39 @@
/*
* Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
*
* 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 <http://www.gnu.org/licenses/>.
*/
#ifndef _TD_TKV_BUF_POOL_H_
#define _TD_TKV_BUF_POOL_H_
#include "tkvPage.h"
#ifdef __cplusplus
extern "C" {
#endif
typedef struct STkvBufPool STkvBufPool;
int tbpOpen(STkvBufPool **ppTkvBufPool);
int tbpClose(STkvBufPool *pTkvBufPool);
STkvPage *tbpNewPage(STkvBufPool *pTkvBufPool);
int tbpDelPage(STkvBufPool *pTkvBufPool);
STkvPage *tbpFetchPage(STkvBufPool *pTkvBufPool, pgid_t pgid);
int tbpUnpinPage(STkvBufPool *pTkvBufPool, pgid_t pgid);
void tbpFlushPages(STkvBufPool *pTkvBufPool);
#ifdef __cplusplus
}
#endif
#endif /*_TD_TKV_BUF_POOL_H_*/

View File

@ -26,6 +26,9 @@ extern "C" {
typedef int32_t pgid_t; typedef int32_t pgid_t;
#define TKV_IVLD_PGID ((pgid_t)-1) #define TKV_IVLD_PGID ((pgid_t)-1)
// framd_id_t
typedef int32_t frame_id_t;
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif

View File

@ -24,14 +24,14 @@ extern "C" {
#include "tkvDef.h" #include "tkvDef.h"
typedef struct SDiskMgr SDiskMgr; typedef struct STkvDiskMgr STkvDiskMgr;
int tdmOpen(SDiskMgr **ppDiskMgr, const char *fname, uint16_t pgsize); int tdmOpen(STkvDiskMgr **ppDiskMgr, const char *fname, uint16_t pgsize);
int tdmClose(SDiskMgr *pDiskMgr); int tdmClose(STkvDiskMgr *pDiskMgr);
int tdmReadPage(SDiskMgr *pDiskMgr, pgid_t pgid, void *pData); int tdmReadPage(STkvDiskMgr *pDiskMgr, pgid_t pgid, void *pData);
int tdmWritePage(SDiskMgr *pDiskMgr, pgid_t pgid, const void *pData); int tdmWritePage(STkvDiskMgr *pDiskMgr, pgid_t pgid, const void *pData);
int tdmFlush(SDiskMgr *pDiskMgr); int tdmFlush(STkvDiskMgr *pDiskMgr);
pgid_t tdmAllocPage(SDiskMgr *pDiskMgr); pgid_t tdmAllocPage(STkvDiskMgr *pDiskMgr);
#ifdef __cplusplus #ifdef __cplusplus
} }

View File

@ -17,22 +17,30 @@
#define _TD_TKV_PAGE_H_ #define _TD_TKV_PAGE_H_
#include "os.h" #include "os.h"
#include "tkvDef.h"
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
#endif #endif
typedef struct STkvPage {
pgid_t pgid;
int32_t pinCount;
bool idDirty;
char* pData;
} STkvPage;
typedef struct { typedef struct {
uint16_t dbver; uint16_t dbver;
uint16_t pgsize; uint16_t pgsize;
uint32_t cksm; uint32_t cksm;
} SPgHdr; } STkvPgHdr;
typedef struct { // typedef struct {
SPgHdr chdr; // SPgHdr chdr;
uint16_t used; // number of used slots // uint16_t used; // number of used slots
uint16_t loffset; // the offset of the starting location of the last slot used // uint16_t loffset; // the offset of the starting location of the last slot used
} SSlottedPgHdr; // } SSlottedPgHdr;
#ifdef __cplusplus #ifdef __cplusplus
} }

View File

@ -13,9 +13,9 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
#include "tDiskMgr.h" #include "tkvDiskMgr.h"
struct SDiskMgr { struct STkvDiskMgr {
char * fname; char * fname;
uint16_t pgsize; uint16_t pgsize;
FileFd fd; FileFd fd;
@ -24,8 +24,8 @@ struct SDiskMgr {
#define PAGE_OFFSET(PGID, PGSIZE) ((PGID) * (PGSIZE)) #define PAGE_OFFSET(PGID, PGSIZE) ((PGID) * (PGSIZE))
int tdmOpen(SDiskMgr **ppDiskMgr, const char *fname, uint16_t pgsize) { int tdmOpen(STkvDiskMgr **ppDiskMgr, const char *fname, uint16_t pgsize) {
SDiskMgr *pDiskMgr; STkvDiskMgr *pDiskMgr;
pDiskMgr = malloc(sizeof(*pDiskMgr)); pDiskMgr = malloc(sizeof(*pDiskMgr));
if (pDiskMgr == NULL) { if (pDiskMgr == NULL) {
@ -50,25 +50,25 @@ int tdmOpen(SDiskMgr **ppDiskMgr, const char *fname, uint16_t pgsize) {
return 0; return 0;
} }
int tdmClose(SDiskMgr *pDiskMgr) { int tdmClose(STkvDiskMgr *pDiskMgr) {
close(pDiskMgr->fd); close(pDiskMgr->fd);
free(pDiskMgr->fname); free(pDiskMgr->fname);
free(pDiskMgr); free(pDiskMgr);
return 0; return 0;
} }
int tdmReadPage(SDiskMgr *pDiskMgr, pgid_t pgid, void *pData) { int tdmReadPage(STkvDiskMgr *pDiskMgr, pgid_t pgid, void *pData) {
taosLSeekFile(pDiskMgr->fd, PAGE_OFFSET(pgid, pDiskMgr->pgsize), SEEK_SET); taosLSeekFile(pDiskMgr->fd, PAGE_OFFSET(pgid, pDiskMgr->pgsize), SEEK_SET);
taosReadFile(pDiskMgr->fd, pData, pDiskMgr->pgsize); taosReadFile(pDiskMgr->fd, pData, pDiskMgr->pgsize);
return 0; return 0;
} }
int tdmWritePage(SDiskMgr *pDiskMgr, pgid_t pgid, const void *pData) { int tdmWritePage(STkvDiskMgr *pDiskMgr, pgid_t pgid, const void *pData) {
taosLSeekFile(pDiskMgr->fd, PAGE_OFFSET(pgid, pDiskMgr->pgsize), SEEK_SET); taosLSeekFile(pDiskMgr->fd, PAGE_OFFSET(pgid, pDiskMgr->pgsize), SEEK_SET);
taosWriteFile(pDiskMgr->fd, pData, pDiskMgr->pgsize); taosWriteFile(pDiskMgr->fd, pData, pDiskMgr->pgsize);
return 0; return 0;
} }
int tdmFlush(SDiskMgr *pDiskMgr) { return taosFsyncFile(pDiskMgr->fd); } int tdmFlush(STkvDiskMgr *pDiskMgr) { return taosFsyncFile(pDiskMgr->fd); }
int32_t tdmAllocPage(SDiskMgr *pDiskMgr) { return pDiskMgr->npgid++; } int32_t tdmAllocPage(STkvDiskMgr *pDiskMgr) { return pDiskMgr->npgid++; }

View File

@ -0,0 +1,54 @@
/*
* Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
*
* 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 <http://www.gnu.org/licenses/>.
*/
#include "thash.h"
#include "tlist.h"
#include "tkvBufPool.h"
#include "tkvDiskMgr.h"
#include "tkvPage.h"
struct SFrameIdWrapper {
TD_SLIST_NODE(SFrameIdWrapper);
frame_id_t id;
};
struct STkvBufPool {
STkvPage* pages;
STkvDiskMgr* pDiskMgr;
SHashObj* pgTb; // page_id_t --> frame_id_t
TD_SLIST(SFrameIdWrapper) freeList;
pthread_mutex_t mutex;
};
typedef struct STkvLRUReplacer {
} STkvLRUReplacer;
typedef struct STkvLFUReplacer {
} STkvLFUReplacer;
typedef struct STkvCLKReplacer {
} STkvCLKReplacer;
typedef enum { TKV_LRU_REPLACER = 0, TKV_LFU_REPLACER, TVK_CLK_REPLACER } tkv_replacer_t;
typedef struct STkvReplacer {
tkv_replacer_t type;
union {
STkvLRUReplacer lruRep;
STkvLFUReplacer lfuRep;
STkvCLKReplacer clkRep;
};
} STkvReplacer;