more work
This commit is contained in:
parent
2e643995d8
commit
d68899e5e9
|
@ -21,15 +21,14 @@ extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// TYPES EXPOSED
|
// TYPES EXPOSED
|
||||||
typedef struct STsdb STsdb;
|
typedef struct STsdb STsdb;
|
||||||
typedef struct STsdbCfg STsdbCfg;
|
typedef struct STsdbCfg STsdbCfg;
|
||||||
typedef struct STsdbMemAllocator STsdbMemAllocator;
|
|
||||||
|
|
||||||
// STsdb
|
// STsdb
|
||||||
STsdb *tsdbOpen(const char *path, const STsdbCfg *);
|
STsdb *tsdbOpen(const char *path, const STsdbCfg *pTsdbCfg);
|
||||||
void tsdbClose(STsdb *);
|
void tsdbClose(STsdb *);
|
||||||
void tsdbRemove(const char *path);
|
void tsdbRemove(const char *path);
|
||||||
int tsdbInsertData(STsdb *pTsdb, void *pData, int len);
|
int tsdbInsertData(STsdb *pTsdb, SSubmitMsg *pMsg);
|
||||||
|
|
||||||
// STsdbCfg
|
// STsdbCfg
|
||||||
int tsdbOptionsInit(STsdbCfg *);
|
int tsdbOptionsInit(STsdbCfg *);
|
||||||
|
@ -41,7 +40,6 @@ struct STsdbCfg {
|
||||||
uint32_t keep0;
|
uint32_t keep0;
|
||||||
uint32_t keep1;
|
uint32_t keep1;
|
||||||
uint32_t keep2;
|
uint32_t keep2;
|
||||||
/* TODO */
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
|
|
@ -25,7 +25,9 @@ extern "C" {
|
||||||
#define TSDB__packed
|
#define TSDB__packed
|
||||||
|
|
||||||
#define TSKEY int64_t
|
#define TSKEY int64_t
|
||||||
#define TSKEY_INITIAL_VAL INT64_MIN
|
#define TSKEY_MIN INT64_MIN
|
||||||
|
#define TSKEY_MAX (INT64_MAX - 1)
|
||||||
|
#define TSKEY_INITIAL_VAL TSKEY_MIN
|
||||||
|
|
||||||
// Bytes for each type.
|
// Bytes for each type.
|
||||||
extern const int32_t TYPE_BYTES[15];
|
extern const int32_t TYPE_BYTES[15];
|
||||||
|
|
|
@ -19,5 +19,5 @@ target_link_libraries(
|
||||||
|
|
||||||
# test
|
# test
|
||||||
if(${BUILD_TEST})
|
if(${BUILD_TEST})
|
||||||
# add_subdirectory(test)
|
add_subdirectory(test)
|
||||||
endif(${BUILD_TEST})
|
endif(${BUILD_TEST})
|
|
@ -17,6 +17,8 @@
|
||||||
#define _TD_TSDB_DEF_H_
|
#define _TD_TSDB_DEF_H_
|
||||||
|
|
||||||
#include "mallocator.h"
|
#include "mallocator.h"
|
||||||
|
#include "taosmsg.h"
|
||||||
|
#include "thash.h"
|
||||||
|
|
||||||
#include "tsdb.h"
|
#include "tsdb.h"
|
||||||
#include "tsdbMemTable.h"
|
#include "tsdbMemTable.h"
|
||||||
|
@ -29,6 +31,8 @@ extern "C" {
|
||||||
struct STsdb {
|
struct STsdb {
|
||||||
char * path;
|
char * path;
|
||||||
STsdbCfg options;
|
STsdbCfg options;
|
||||||
|
STsdbMemTable * mem;
|
||||||
|
STsdbMemTable * imem;
|
||||||
SMemAllocatorFactory *pmaf;
|
SMemAllocatorFactory *pmaf;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -22,10 +22,11 @@
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
typedef struct SMemTable {
|
typedef struct STsdbMemTable STsdbMemTable;
|
||||||
/* TODO */
|
|
||||||
SMemAllocator *pma;
|
STsdbMemTable *tsdbNewMemTable(SMemAllocatorFactory *pMAF);
|
||||||
} SMemTable;
|
void tsdbFreeMemTable(SMemAllocatorFactory *pMAF, STsdbMemTable *pMemTable);
|
||||||
|
int tsdbInsertDataToMemTable(STsdbMemTable *pMemTable, SSubmitMsg *pMsg);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,21 @@
|
||||||
|
/*
|
||||||
|
* 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 "tsdbDef.h"
|
||||||
|
|
||||||
|
int tsdbCommit(STsdb *pTsdb) {
|
||||||
|
// TODO
|
||||||
|
return 0;
|
||||||
|
}
|
|
@ -11,4 +11,57 @@
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU Affero General Public License
|
* 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/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include "tsdbDef.h"
|
||||||
|
|
||||||
|
struct STsdbMemTable {
|
||||||
|
T_REF_DECLARE()
|
||||||
|
SRWLatch latch;
|
||||||
|
TSKEY keyMin;
|
||||||
|
TSKEY keyMax;
|
||||||
|
uint32_t nRow;
|
||||||
|
SHashObj * pHash;
|
||||||
|
SMemAllocator *pMA;
|
||||||
|
};
|
||||||
|
|
||||||
|
STsdbMemTable *tsdbNewMemTable(SMemAllocatorFactory *pMAF) {
|
||||||
|
STsdbMemTable *pMemTable;
|
||||||
|
SMemAllocator *pMA;
|
||||||
|
|
||||||
|
pMA = (*pMAF->create)(pMAF);
|
||||||
|
ASSERT(pMA != NULL);
|
||||||
|
|
||||||
|
pMemTable = (STsdbMemTable *)((*pMA->malloc)(pMA, sizeof(*pMemTable)));
|
||||||
|
if (pMemTable == NULL) {
|
||||||
|
(*pMAF->destroy)(pMAF, pMA);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
T_REF_INIT_VAL(pMemTable, 1);
|
||||||
|
taosInitRWLatch(&(pMemTable->latch));
|
||||||
|
pMemTable->keyMin = TSKEY_MAX;
|
||||||
|
pMemTable->keyMax = TSKEY_MIN;
|
||||||
|
pMemTable->nRow = 0;
|
||||||
|
pMemTable->pHash = NULL; /// TODO
|
||||||
|
pMemTable->pMA = pMA;
|
||||||
|
|
||||||
|
// TODO
|
||||||
|
return pMemTable;
|
||||||
|
}
|
||||||
|
|
||||||
|
void tsdbFreeMemTable(SMemAllocatorFactory *pMAF, STsdbMemTable *pMemTable) {
|
||||||
|
SMemAllocator *pMA = pMemTable->pMA;
|
||||||
|
|
||||||
|
if (pMA->free) {
|
||||||
|
// TODO
|
||||||
|
ASSERT(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
(*pMAF->destroy)(pMAF, pMA);
|
||||||
|
}
|
||||||
|
|
||||||
|
int tsdbInsertDataToMemTable(STsdbMemTable *pMemTable, SSubmitMsg *pMsg) {
|
||||||
|
// TODO
|
||||||
|
return 0;
|
||||||
|
}
|
|
@ -0,0 +1,25 @@
|
||||||
|
/*
|
||||||
|
* 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 "tsdbDef.h"
|
||||||
|
|
||||||
|
int tsdbInsertData(STsdb *pTsdb, SSubmitMsg *pMsg) {
|
||||||
|
// Check if mem is there. If not, create one.
|
||||||
|
pTsdb->mem = tsdbNewMemTable(pTsdb->pmaf);
|
||||||
|
if (pTsdb->mem == NULL) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
return tsdbInsertDataToMemTable(pTsdb->mem, pMsg);
|
||||||
|
}
|
|
@ -1,97 +0,0 @@
|
||||||
/*
|
|
||||||
* 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_TSDB_MEMTABLE_H_
|
|
||||||
#define _TD_TSDB_MEMTABLE_H_
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
int rowsInserted;
|
|
||||||
int rowsUpdated;
|
|
||||||
int rowsDeleteSucceed;
|
|
||||||
int rowsDeleteFailed;
|
|
||||||
int nOperations;
|
|
||||||
TSKEY keyFirst;
|
|
||||||
TSKEY keyLast;
|
|
||||||
} SMergeInfo;
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
STable * pTable;
|
|
||||||
SSkipListIterator *pIter;
|
|
||||||
} SCommitIter;
|
|
||||||
|
|
||||||
struct STableData {
|
|
||||||
uint64_t uid;
|
|
||||||
TSKEY keyFirst;
|
|
||||||
TSKEY keyLast;
|
|
||||||
int64_t numOfRows;
|
|
||||||
SSkipList* pData;
|
|
||||||
T_REF_DECLARE()
|
|
||||||
};
|
|
||||||
|
|
||||||
enum { TSDB_UPDATE_META, TSDB_DROP_META };
|
|
||||||
|
|
||||||
#ifdef WINDOWS
|
|
||||||
#pragma pack(push ,1)
|
|
||||||
typedef struct {
|
|
||||||
#else
|
|
||||||
typedef struct __attribute__((packed)){
|
|
||||||
#endif
|
|
||||||
char act;
|
|
||||||
uint64_t uid;
|
|
||||||
} SActObj;
|
|
||||||
#ifdef WINDOWS
|
|
||||||
#pragma pack(pop)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
int len;
|
|
||||||
char cont[];
|
|
||||||
} SActCont;
|
|
||||||
|
|
||||||
int tsdbRefMemTable(STsdbRepo* pRepo, SMemTable* pMemTable);
|
|
||||||
int tsdbUnRefMemTable(STsdbRepo* pRepo, SMemTable* pMemTable);
|
|
||||||
int tsdbTakeMemSnapshot(STsdbRepo* pRepo, SMemSnapshot* pSnapshot, SArray* pATable);
|
|
||||||
void tsdbUnTakeMemSnapShot(STsdbRepo* pRepo, SMemSnapshot* pSnapshot);
|
|
||||||
void* tsdbAllocBytes(STsdbRepo* pRepo, int bytes);
|
|
||||||
int tsdbAsyncCommit(STsdbRepo* pRepo);
|
|
||||||
int tsdbSyncCommitConfig(STsdbRepo* pRepo);
|
|
||||||
int tsdbLoadDataFromCache(STable* pTable, SSkipListIterator* pIter, TSKEY maxKey, int maxRowsToRead, SDataCols* pCols,
|
|
||||||
TKEY* filterKeys, int nFilterKeys, bool keepDup, SMergeInfo* pMergeInfo);
|
|
||||||
void* tsdbCommitData(STsdbRepo* pRepo);
|
|
||||||
|
|
||||||
static FORCE_INLINE SMemRow tsdbNextIterRow(SSkipListIterator* pIter) {
|
|
||||||
if (pIter == NULL) return NULL;
|
|
||||||
|
|
||||||
SSkipListNode* node = tSkipListIterGet(pIter);
|
|
||||||
if (node == NULL) return NULL;
|
|
||||||
|
|
||||||
return (SMemRow)SL_GET_NODE_DATA(node);
|
|
||||||
}
|
|
||||||
|
|
||||||
static FORCE_INLINE TSKEY tsdbNextIterKey(SSkipListIterator* pIter) {
|
|
||||||
SMemRow row = tsdbNextIterRow(pIter);
|
|
||||||
if (row == NULL) return TSDB_DATA_TIMESTAMP_NULL;
|
|
||||||
|
|
||||||
return memRowKey(row);
|
|
||||||
}
|
|
||||||
|
|
||||||
static FORCE_INLINE TKEY tsdbNextIterTKey(SSkipListIterator* pIter) {
|
|
||||||
SMemRow row = tsdbNextIterRow(pIter);
|
|
||||||
if (row == NULL) return TKEY_NULL;
|
|
||||||
|
|
||||||
return memRowTKey(row);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* _TD_TSDB_MEMTABLE_H_ */
|
|
|
@ -1,214 +0,0 @@
|
||||||
/*
|
|
||||||
* 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 "tsdbint.h"
|
|
||||||
#include "tsdbHealth.h"
|
|
||||||
|
|
||||||
#define POOL_IS_EMPTY(b) (listNEles((b)->bufBlockList) == 0)
|
|
||||||
|
|
||||||
// ---------------- INTERNAL FUNCTIONS ----------------
|
|
||||||
STsdbBufPool *tsdbNewBufPool() {
|
|
||||||
STsdbBufPool *pBufPool = (STsdbBufPool *)calloc(1, sizeof(*pBufPool));
|
|
||||||
if (pBufPool == NULL) {
|
|
||||||
terrno = TSDB_CODE_TDB_OUT_OF_MEMORY;
|
|
||||||
goto _err;
|
|
||||||
}
|
|
||||||
|
|
||||||
int code = pthread_cond_init(&(pBufPool->poolNotEmpty), NULL);
|
|
||||||
if (code != 0) {
|
|
||||||
terrno = TAOS_SYSTEM_ERROR(code);
|
|
||||||
goto _err;
|
|
||||||
}
|
|
||||||
|
|
||||||
pBufPool->bufBlockList = tdListNew(sizeof(STsdbBufBlock *));
|
|
||||||
if (pBufPool->bufBlockList == NULL) {
|
|
||||||
terrno = TSDB_CODE_TDB_OUT_OF_MEMORY;
|
|
||||||
goto _err;
|
|
||||||
}
|
|
||||||
|
|
||||||
return pBufPool;
|
|
||||||
|
|
||||||
_err:
|
|
||||||
tsdbFreeBufPool(pBufPool);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
void tsdbFreeBufPool(STsdbBufPool *pBufPool) {
|
|
||||||
if (pBufPool) {
|
|
||||||
if (pBufPool->bufBlockList) {
|
|
||||||
ASSERT(listNEles(pBufPool->bufBlockList) == 0);
|
|
||||||
tdListFree(pBufPool->bufBlockList);
|
|
||||||
}
|
|
||||||
|
|
||||||
pthread_cond_destroy(&pBufPool->poolNotEmpty);
|
|
||||||
|
|
||||||
free(pBufPool);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int tsdbOpenBufPool(STsdbRepo *pRepo) {
|
|
||||||
STsdbCfg * pCfg = &(pRepo->config);
|
|
||||||
STsdbBufPool *pPool = pRepo->pPool;
|
|
||||||
|
|
||||||
ASSERT(pPool != NULL);
|
|
||||||
pPool->bufBlockSize = pCfg->cacheBlockSize * 1024 * 1024; // MB
|
|
||||||
pPool->tBufBlocks = pCfg->totalBlocks;
|
|
||||||
pPool->nBufBlocks = 0;
|
|
||||||
pPool->nElasticBlocks = 0;
|
|
||||||
pPool->index = 0;
|
|
||||||
pPool->nRecycleBlocks = 0;
|
|
||||||
|
|
||||||
for (int i = 0; i < pCfg->totalBlocks; i++) {
|
|
||||||
STsdbBufBlock *pBufBlock = tsdbNewBufBlock(pPool->bufBlockSize);
|
|
||||||
if (pBufBlock == NULL) goto _err;
|
|
||||||
|
|
||||||
if (tdListAppend(pPool->bufBlockList, (void *)(&pBufBlock)) < 0) {
|
|
||||||
tsdbFreeBufBlock(pBufBlock);
|
|
||||||
terrno = TSDB_CODE_TDB_OUT_OF_MEMORY;
|
|
||||||
goto _err;
|
|
||||||
}
|
|
||||||
|
|
||||||
pPool->nBufBlocks++;
|
|
||||||
}
|
|
||||||
|
|
||||||
tsdbDebug("vgId:%d buffer pool is opened! bufBlockSize:%d tBufBlocks:%d nBufBlocks:%d", REPO_ID(pRepo),
|
|
||||||
pPool->bufBlockSize, pPool->tBufBlocks, pPool->nBufBlocks);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
_err:
|
|
||||||
tsdbCloseBufPool(pRepo);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
void tsdbCloseBufPool(STsdbRepo *pRepo) {
|
|
||||||
if (pRepo == NULL) return;
|
|
||||||
|
|
||||||
STsdbBufPool * pBufPool = pRepo->pPool;
|
|
||||||
STsdbBufBlock *pBufBlock = NULL;
|
|
||||||
|
|
||||||
if (pBufPool) {
|
|
||||||
SListNode *pNode = NULL;
|
|
||||||
while ((pNode = tdListPopHead(pBufPool->bufBlockList)) != NULL) {
|
|
||||||
tdListNodeGetData(pBufPool->bufBlockList, pNode, (void *)(&pBufBlock));
|
|
||||||
tsdbFreeBufBlock(pBufBlock);
|
|
||||||
free(pNode);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
tsdbDebug("vgId:%d, buffer pool is closed", REPO_ID(pRepo));
|
|
||||||
}
|
|
||||||
|
|
||||||
SListNode *tsdbAllocBufBlockFromPool(STsdbRepo *pRepo) {
|
|
||||||
ASSERT(pRepo != NULL && pRepo->pPool != NULL);
|
|
||||||
ASSERT(IS_REPO_LOCKED(pRepo));
|
|
||||||
|
|
||||||
STsdbBufPool *pBufPool = pRepo->pPool;
|
|
||||||
|
|
||||||
while (POOL_IS_EMPTY(pBufPool)) {
|
|
||||||
if(tsDeadLockKillQuery) {
|
|
||||||
// supply new Block
|
|
||||||
if(tsdbInsertNewBlock(pRepo) > 0) {
|
|
||||||
tsdbWarn("vgId:%d add new elastic block . elasticBlocks=%d cur free Blocks=%d", REPO_ID(pRepo), pBufPool->nElasticBlocks, pBufPool->bufBlockList->numOfEles);
|
|
||||||
break;
|
|
||||||
} else {
|
|
||||||
// no newBlock, kill query free
|
|
||||||
if(!tsdbUrgeQueryFree(pRepo))
|
|
||||||
tsdbWarn("vgId:%d Urge query free thread start failed.", REPO_ID(pRepo));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pRepo->repoLocked = false;
|
|
||||||
pthread_cond_wait(&(pBufPool->poolNotEmpty), &(pRepo->mutex));
|
|
||||||
pRepo->repoLocked = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
SListNode * pNode = tdListPopHead(pBufPool->bufBlockList);
|
|
||||||
ASSERT(pNode != NULL);
|
|
||||||
STsdbBufBlock *pBufBlock = NULL;
|
|
||||||
tdListNodeGetData(pBufPool->bufBlockList, pNode, (void *)(&pBufBlock));
|
|
||||||
|
|
||||||
pBufBlock->blockId = pBufPool->index++;
|
|
||||||
pBufBlock->offset = 0;
|
|
||||||
pBufBlock->remain = pBufPool->bufBlockSize;
|
|
||||||
|
|
||||||
tsdbDebug("vgId:%d, buffer block is allocated, blockId:%" PRId64, REPO_ID(pRepo), pBufBlock->blockId);
|
|
||||||
return pNode;
|
|
||||||
}
|
|
||||||
|
|
||||||
// ---------------- LOCAL FUNCTIONS ----------------
|
|
||||||
STsdbBufBlock *tsdbNewBufBlock(int bufBlockSize) {
|
|
||||||
STsdbBufBlock *pBufBlock = (STsdbBufBlock *)malloc(sizeof(*pBufBlock) + bufBlockSize);
|
|
||||||
if (pBufBlock == NULL) {
|
|
||||||
terrno = TSDB_CODE_TDB_OUT_OF_MEMORY;
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
pBufBlock->blockId = 0;
|
|
||||||
pBufBlock->offset = 0;
|
|
||||||
pBufBlock->remain = bufBlockSize;
|
|
||||||
|
|
||||||
return pBufBlock;
|
|
||||||
}
|
|
||||||
|
|
||||||
void tsdbFreeBufBlock(STsdbBufBlock *pBufBlock) { tfree(pBufBlock); }
|
|
||||||
|
|
||||||
int tsdbExpandPool(STsdbRepo* pRepo, int32_t oldTotalBlocks) {
|
|
||||||
if (oldTotalBlocks == pRepo->config.totalBlocks) {
|
|
||||||
return TSDB_CODE_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
int err = TSDB_CODE_SUCCESS;
|
|
||||||
|
|
||||||
if (tsdbLockRepo(pRepo) < 0) return terrno;
|
|
||||||
STsdbBufPool* pPool = pRepo->pPool;
|
|
||||||
|
|
||||||
if (pRepo->config.totalBlocks > oldTotalBlocks) {
|
|
||||||
for (int i = 0; i < pRepo->config.totalBlocks - oldTotalBlocks; i++) {
|
|
||||||
STsdbBufBlock *pBufBlock = tsdbNewBufBlock(pPool->bufBlockSize);
|
|
||||||
if (pBufBlock == NULL) goto err;
|
|
||||||
|
|
||||||
if (tdListAppend(pPool->bufBlockList, (void *)(&pBufBlock)) < 0) {
|
|
||||||
tsdbFreeBufBlock(pBufBlock);
|
|
||||||
terrno = TSDB_CODE_TDB_OUT_OF_MEMORY;
|
|
||||||
err = TSDB_CODE_TDB_OUT_OF_MEMORY;
|
|
||||||
goto err;
|
|
||||||
}
|
|
||||||
|
|
||||||
pPool->nBufBlocks++;
|
|
||||||
}
|
|
||||||
pthread_cond_signal(&pPool->poolNotEmpty);
|
|
||||||
} else {
|
|
||||||
pPool->nRecycleBlocks = oldTotalBlocks - pRepo->config.totalBlocks;
|
|
||||||
}
|
|
||||||
|
|
||||||
err:
|
|
||||||
tsdbUnlockRepo(pRepo);
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
|
|
||||||
void tsdbRecycleBufferBlock(STsdbBufPool* pPool, SListNode *pNode, bool bELastic) {
|
|
||||||
STsdbBufBlock *pBufBlock = NULL;
|
|
||||||
tdListNodeGetData(pPool->bufBlockList, pNode, (void *)(&pBufBlock));
|
|
||||||
tsdbFreeBufBlock(pBufBlock);
|
|
||||||
free(pNode);
|
|
||||||
if(bELastic)
|
|
||||||
{
|
|
||||||
pPool->nElasticBlocks--;
|
|
||||||
tsdbWarn("pPool=%p elastic block reduce one . nElasticBlocks=%d cur free Blocks=%d", pPool, pPool->nElasticBlocks, pPool->bufBlockList->numOfEles);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
pPool->nBufBlocks--;
|
|
||||||
}
|
|
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue