From 9dd59b41e0614b51a5d19426afa7eeccb45b4ba4 Mon Sep 17 00:00:00 2001 From: Hongze Cheng Date: Mon, 8 Nov 2021 14:50:20 +0800 Subject: [PATCH] more --- include/server/vnode/impl/vnodeImpl.h | 1 + .../dnode/vnode/impl/inc/vnodeAllocatorPool.h | 35 +++++ source/dnode/vnode/impl/inc/vnodeDef.h | 14 +- .../dnode/vnode/impl/inc/vnodeMemAllocator.h | 55 -------- .../dnode/vnode/impl/src/vnodeAllocatorPool.c | 25 ++++ source/dnode/vnode/impl/src/vnodeMain.c | 7 + .../dnode/vnode/impl/src/vnodeMemAllocator.c | 124 ------------------ 7 files changed, 76 insertions(+), 185 deletions(-) create mode 100644 source/dnode/vnode/impl/inc/vnodeAllocatorPool.h delete mode 100644 source/dnode/vnode/impl/inc/vnodeMemAllocator.h create mode 100644 source/dnode/vnode/impl/src/vnodeAllocatorPool.c delete mode 100644 source/dnode/vnode/impl/src/vnodeMemAllocator.c diff --git a/include/server/vnode/impl/vnodeImpl.h b/include/server/vnode/impl/vnodeImpl.h index 0e8a47742c..1b09361bc9 100644 --- a/include/server/vnode/impl/vnodeImpl.h +++ b/include/server/vnode/impl/vnodeImpl.h @@ -28,6 +28,7 @@ extern "C" { #endif struct SVnodeOptions { + size_t wsize; STsdbOptions tsdbOptions; SMetaOptions metaOptions; // STqOptions tqOptions; // TODO diff --git a/source/dnode/vnode/impl/inc/vnodeAllocatorPool.h b/source/dnode/vnode/impl/inc/vnodeAllocatorPool.h new file mode 100644 index 0000000000..ece9122513 --- /dev/null +++ b/source/dnode/vnode/impl/inc/vnodeAllocatorPool.h @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2019 TAOS Data, Inc. + * + * 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 . + */ + +#ifndef _TD_VNODE_ALLOCATOR_POOL_H_ +#define _TD_VNODE_ALLOCATOR_POOL_H_ + +#include "vnode.h" + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct { +} SVAllocatorPool; + +int vnodeOpenAllocatorPool(SVnode *pVnode); +void vnodeCloseAllocatorPool(SVnode *pVnode); + +#ifdef __cplusplus +} +#endif + +#endif /*_TD_VNODE_ALLOCATOR_POOL_H_*/ \ No newline at end of file diff --git a/source/dnode/vnode/impl/inc/vnodeDef.h b/source/dnode/vnode/impl/inc/vnodeDef.h index e5ce92c210..649de7f5ff 100644 --- a/source/dnode/vnode/impl/inc/vnodeDef.h +++ b/source/dnode/vnode/impl/inc/vnodeDef.h @@ -17,6 +17,7 @@ #define _TD_VNODE_DEF_H_ #include "vnode.h" +#include "vnodeAllocatorPool.h" #include "vnodeOptions.h" #include "vnodeStateMgr.h" @@ -25,12 +26,13 @@ extern "C" { #endif struct SVnode { - char* path; - SVnodeOptions options; - SVState state; - SMeta* pMeta; - STsdb* pTsdb; - STQ* pTq; + char* path; + SVnodeOptions options; + SVState state; + SVAllocatorPool pool; + SMeta* pMeta; + STsdb* pTsdb; + STQ* pTq; }; #ifdef __cplusplus diff --git a/source/dnode/vnode/impl/inc/vnodeMemAllocator.h b/source/dnode/vnode/impl/inc/vnodeMemAllocator.h deleted file mode 100644 index 76aa2c6714..0000000000 --- a/source/dnode/vnode/impl/inc/vnodeMemAllocator.h +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright (c) 2019 TAOS Data, Inc. - * - * 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 . - */ - -#ifndef _TD_VNODE_MEM_ALLOCATOR_H_ -#define _TD_VNODE_MEM_ALLOCATOR_H_ - -#include "vnodeInt.h" - -#ifdef __cplusplus -extern "C" { -#endif - -typedef struct SVnodeMemAllocator SVnodeMemAllocator; - -SVnodeMemAllocator *VMACreate(size_t size /* base size */, size_t ssize /* step size */, - size_t threshold /* threshold size when full*/); -void VMADestroy(SVnodeMemAllocator *pvma); -void VMAReset(SVnodeMemAllocator *pvma); -void * VMAMalloc(SVnodeMemAllocator *pvma, size_t size); -void VMAFree(SVnodeMemAllocator *pvma, void *ptr); -bool VMAIsFull(SVnodeMemAllocator *pvma); - -// ------------------ FOR TEST ONLY ------------------ -typedef struct SVMANode { - struct SVMANode *prev; - size_t tsize; - size_t used; - char data[]; -} SVMANode; - -struct SVnodeMemAllocator { - bool full; // if allocator is full - size_t threshold; // threshold; - size_t ssize; // step size to allocate - SVMANode *inuse; // inuse node to allocate - SVMANode node; // basic node to use -}; - -#ifdef __cplusplus -} -#endif - -#endif /*_TD_VNODE_MEM_ALLOCATOR_H_*/ \ No newline at end of file diff --git a/source/dnode/vnode/impl/src/vnodeAllocatorPool.c b/source/dnode/vnode/impl/src/vnodeAllocatorPool.c new file mode 100644 index 0000000000..36f3e7face --- /dev/null +++ b/source/dnode/vnode/impl/src/vnodeAllocatorPool.c @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2019 TAOS Data, Inc. + * + * 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 . + */ + +#include "vnodeDef.h" + +int vnodeOpenAllocatorPool(SVnode *pVnode) { + // TODO + return 0; +} + +void vnodeCloseAllocatorPool(SVnode *pVnode) { + // TODO +} \ No newline at end of file diff --git a/source/dnode/vnode/impl/src/vnodeMain.c b/source/dnode/vnode/impl/src/vnodeMain.c index a0c1d38ea9..6c0fe9c974 100644 --- a/source/dnode/vnode/impl/src/vnodeMain.c +++ b/source/dnode/vnode/impl/src/vnodeMain.c @@ -87,6 +87,12 @@ static void vnodeFree(SVnode *pVnode) { static int vnodeOpenImpl(SVnode *pVnode) { char dir[TSDB_FILENAME_LEN]; + // Open allocator pool + if (vnodeOpenAllocatorPool(pVnode) < 0) { + // TODO: handle error + return -1; + } + // Open meta sprintf(dir, "%s/meta", pVnode->path); pVnode->pMeta = metaOpen(dir, &(pVnode->options.metaOptions)); @@ -111,6 +117,7 @@ static int vnodeOpenImpl(SVnode *pVnode) { static void vnodeCloseImpl(SVnode *pVnode) { if (pVnode) { + vnodeCloseAllocatorPool(pVnode); // TODO: Close TQ tsdbClose(pVnode->pTsdb); metaClose(pVnode->pMeta); diff --git a/source/dnode/vnode/impl/src/vnodeMemAllocator.c b/source/dnode/vnode/impl/src/vnodeMemAllocator.c deleted file mode 100644 index 29909df491..0000000000 --- a/source/dnode/vnode/impl/src/vnodeMemAllocator.c +++ /dev/null @@ -1,124 +0,0 @@ -/* - * Copyright (c) 2019 TAOS Data, Inc. - * - * 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 . - */ - -#include "vnodeMemAllocator.h" - -#define VMA_IS_FULL(pvma) \ - (((pvma)->inuse != &((pvma)->node)) || ((pvma)->inuse->tsize - (pvma)->inuse->used < (pvma)->threshold)) - -static SVMANode *VMANodeNew(size_t size); -static void VMANodeFree(SVMANode *node); - -SVnodeMemAllocator *VMACreate(size_t size, size_t ssize, size_t threshold) { - SVnodeMemAllocator *pvma = NULL; - - if (size < threshold) { - return NULL; - } - - pvma = (SVnodeMemAllocator *)malloc(sizeof(*pvma) + size); - if (pvma) { - pvma->full = false; - pvma->threshold = threshold; - pvma->ssize = ssize; - pvma->inuse = &(pvma->node); - - pvma->inuse->prev = NULL; - pvma->inuse->tsize = size; - pvma->inuse->used = 0; - } - - return pvma; -} - -void VMADestroy(SVnodeMemAllocator *pvma) { - if (pvma) { - VMAReset(pvma); - free(pvma); - } -} - -void VMAReset(SVnodeMemAllocator *pvma) { - while (pvma->inuse != &(pvma->node)) { - SVMANode *node = pvma->inuse; - pvma->inuse = node->prev; - VMANodeFree(node); - } - - pvma->inuse->used = 0; - pvma->full = false; -} - -void *VMAMalloc(SVnodeMemAllocator *pvma, size_t size) { - void * ptr = NULL; - size_t tsize = size + sizeof(size_t); - - if (pvma->inuse->tsize - pvma->inuse->used < tsize) { - SVMANode *pNode = VMANodeNew(MAX(pvma->ssize, tsize)); - if (pNode == NULL) { - return NULL; - } - - pNode->prev = pvma->inuse; - pvma->inuse = pNode; - } - - ptr = pvma->inuse->data + pvma->inuse->used; - pvma->inuse->used += tsize; - *(size_t *)ptr = size; - ptr = POINTER_SHIFT(ptr, sizeof(size_t)); - - pvma->full = VMA_IS_FULL(pvma); - - return ptr; -} - -void VMAFree(SVnodeMemAllocator *pvma, void *ptr) { - if (ptr) { - size_t size = *(size_t *)POINTER_SHIFT(ptr, -sizeof(size_t)); - if (POINTER_SHIFT(ptr, size) == pvma->inuse->data + pvma->inuse->used) { - pvma->inuse->used -= (size + sizeof(size_t)); - - if ((pvma->inuse->used == 0) && (pvma->inuse != &(pvma->node))) { - SVMANode *node = pvma->inuse; - pvma->inuse = node->prev; - VMANodeFree(node); - } - - pvma->full = VMA_IS_FULL(pvma); - } - } -} - -bool VMAIsFull(SVnodeMemAllocator *pvma) { return pvma->full; } - -static SVMANode *VMANodeNew(size_t size) { - SVMANode *node = NULL; - - node = (SVMANode *)malloc(sizeof(*node) + size); - if (node) { - node->prev = NULL; - node->tsize = size; - node->used = 0; - } - - return node; -} - -static void VMANodeFree(SVMANode *node) { - if (node) { - free(node); - } -} \ No newline at end of file