more tkv
This commit is contained in:
parent
358b5641aa
commit
dca02a8566
|
@ -8,4 +8,5 @@ target_include_directories(
|
||||||
target_link_libraries(
|
target_link_libraries(
|
||||||
tkv
|
tkv
|
||||||
PUBLIC os
|
PUBLIC os
|
||||||
|
PUBLIC util
|
||||||
)
|
)
|
|
@ -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_*/
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
}
|
}
|
|
@ -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
|
||||||
}
|
}
|
|
@ -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++; }
|
|
@ -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;
|
Loading…
Reference in New Issue