From df35435416440929f585336e7f0a6c6639e7cd9f Mon Sep 17 00:00:00 2001 From: Hongze Cheng Date: Tue, 14 Dec 2021 14:32:07 +0800 Subject: [PATCH] add buffer recycle --- source/dnode/vnode/impl/inc/vnodeBufferPool.h | 2 ++ source/dnode/vnode/impl/inc/vnodeCommit.h | 1 + source/dnode/vnode/impl/src/vnodeBufferPool.c | 21 ++++++++++++++ source/dnode/vnode/impl/src/vnodeCommit.c | 29 +++++++------------ source/dnode/vnode/impl/src/vnodeMgr.c | 13 +++++++++ 5 files changed, 48 insertions(+), 18 deletions(-) diff --git a/source/dnode/vnode/impl/inc/vnodeBufferPool.h b/source/dnode/vnode/impl/inc/vnodeBufferPool.h index bfc4de9e12..d96671d2bd 100644 --- a/source/dnode/vnode/impl/inc/vnodeBufferPool.h +++ b/source/dnode/vnode/impl/inc/vnodeBufferPool.h @@ -27,6 +27,8 @@ typedef struct SVBufPool SVBufPool; int vnodeOpenBufPool(SVnode *pVnode); void vnodeCloseBufPool(SVnode *pVnode); +int vnodeBufPoolSwitch(SVnode *pVnode); +int vnodeBufPoolRecycle(SVnode *pVnode); void *vnodeMalloc(SVnode *pVnode, uint64_t size); bool vnodeBufPoolIsFull(SVnode *pVnode); diff --git a/source/dnode/vnode/impl/inc/vnodeCommit.h b/source/dnode/vnode/impl/inc/vnodeCommit.h index a60e8feac2..031089ba14 100644 --- a/source/dnode/vnode/impl/inc/vnodeCommit.h +++ b/source/dnode/vnode/impl/inc/vnodeCommit.h @@ -24,6 +24,7 @@ extern "C" { #define vnodeShouldCommit vnodeBufPoolIsFull int vnodeAsyncCommit(SVnode *pVnode); +int vnodeCommit(void *arg); #ifdef __cplusplus } diff --git a/source/dnode/vnode/impl/src/vnodeBufferPool.c b/source/dnode/vnode/impl/src/vnodeBufferPool.c index 1db15c3990..2affcbb95d 100644 --- a/source/dnode/vnode/impl/src/vnodeBufferPool.c +++ b/source/dnode/vnode/impl/src/vnodeBufferPool.c @@ -79,6 +79,27 @@ void vnodeCloseBufPool(SVnode *pVnode) { } } +int vnodeBufPoolSwitch(SVnode *pVnode) { + SVMemAllocator *pvma = pVnode->pBufPool->inuse; + + pVnode->pBufPool->inuse = NULL; + + tDListAppend(&(pVnode->pBufPool->incycle), pvma); + return 0; +} + +int vnodeBufPoolRecycle(SVnode *pVnode) { + SVBufPool * pBufPool = pVnode->pBufPool; + SVMemAllocator *pvma = TD_DLIST_HEAD(&(pBufPool->incycle)); + ASSERT(pvma != NULL); + + tDListPop(&(pBufPool->incycle), pvma); + vmaReset(pvma); + tDListAppend(&(pBufPool->free), pvma); + + return 0; +} + void *vnodeMalloc(SVnode *pVnode, uint64_t size) { SVBufPool *pBufPool = pVnode->pBufPool; diff --git a/source/dnode/vnode/impl/src/vnodeCommit.c b/source/dnode/vnode/impl/src/vnodeCommit.c index cac7999f59..a728de0ebb 100644 --- a/source/dnode/vnode/impl/src/vnodeCommit.c +++ b/source/dnode/vnode/impl/src/vnodeCommit.c @@ -19,28 +19,21 @@ static int vnodeStartCommit(SVnode *pVnode); static int vnodeEndCommit(SVnode *pVnode); int vnodeAsyncCommit(SVnode *pVnode) { -#if 0 - if (vnodeStartCommit(pVnode) < 0) { - // TODO - } + vnodeBufPoolSwitch(pVnode); + SVnodeTask *pTask = (SVnodeTask *)malloc(sizeof(*pTask)); - if (tqCommit(pVnode->pTQ) < 0) { - // TODO - } + pTask->execute = vnodeCommit; // TODO + pTask->arg = pVnode; // TODO - if (metaCommit(pVnode->pMeta) < 0) { - // TODO - } + vnodeScheduleTask(pTask); + return 0; +} - if (tsdbCommit(pVnode->pTsdb) < 0) { - // TODO - } +int vnodeCommit(void *arg) { + SVnode *pVnode = (SVnode *)arg; - if (vnodeEndCommit(pVnode) < 0) { - // TODO - } - -#endif + vnodeBufPoolRecycle(pVnode); + // TODO return 0; } diff --git a/source/dnode/vnode/impl/src/vnodeMgr.c b/source/dnode/vnode/impl/src/vnodeMgr.c index b5bd913c52..964cbe77da 100644 --- a/source/dnode/vnode/impl/src/vnodeMgr.c +++ b/source/dnode/vnode/impl/src/vnodeMgr.c @@ -74,6 +74,19 @@ void vnodeClear() { pthread_mutex_destroy(&(vnodeMgr.mutex)); } +int vnodeScheduleTask(SVnodeTask* pTask) { + pthread_mutex_lock(&(vnodeMgr.mutex)); + + tDListAppend(&(vnodeMgr.queue), pTask); + + pthread_cond_signal(&(vnodeMgr.hasTask)); + + pthread_mutex_unlock(&(vnodeMgr.mutex)); + + return 0; +} + +/* ------------------------ STATIC METHODS ------------------------ */ static void* loop(void* arg) { SVnodeTask* pTask; for (;;) {