diff --git a/libfuse/lib/fuse.c b/libfuse/lib/fuse.c index 73c9aa09..04691c30 100644 --- a/libfuse/lib/fuse.c +++ b/libfuse/lib/fuse.c @@ -3730,6 +3730,11 @@ metrics_log_nodes_info(struct fuse *f_, FILE *file_) { char buf[1024]; + uint64_t time_now; + uint64_t sizeof_node; + + time_now = time(NULL); + sizeof_node = sizeof(struct node); lfmp_lock(&f_->node_fmp); snprintf(buf,sizeof(buf), @@ -3745,10 +3750,12 @@ metrics_log_nodes_info(struct fuse *f_, "node memory pool usage ratio: %f\n" "node memory pool avail objs: %"PRIu64"\n" "node memory pool total allocated memory: %"PRIu64"\n" + "msgbuf allocation count: %"PRIu64"\n" + "msgbuf total allocated memory: %"PRIu64"\n" "\n" , - (uint64_t)time(NULL), - (uint64_t)sizeof(struct node), + (uint64_t)time_now, + (uint64_t)sizeof_node, (uint64_t)f_->id_table.size, (uint64_t)f_->id_table.use, (uint64_t)(f_->id_table.size * sizeof(struct node*)), @@ -3758,7 +3765,9 @@ metrics_log_nodes_info(struct fuse *f_, (uint64_t)fmp_slab_count(&f_->node_fmp.fmp), fmp_slab_usage_ratio(&f_->node_fmp.fmp), (uint64_t)fmp_avail_objs(&f_->node_fmp.fmp), - (uint64_t)fmp_total_allocated_memory(&f_->node_fmp.fmp) + (uint64_t)fmp_total_allocated_memory(&f_->node_fmp.fmp), + (uint64_t)msgbuf_alloc_count(), + (uint64_t)msgbuf_alloc_count() * msgbuf_get_bufsize() ); lfmp_unlock(&f_->node_fmp); @@ -3818,7 +3827,10 @@ fuse_maintenance_loop(void *fuse_) // Trigger a followup gc if this gc succeeds if(!f->conf.nogc && gc) - gc = lfmp_gc(&f->node_fmp); + { + gc = lfmp_gc(&f->node_fmp); + msgbuf_gc(); + } if(g_LOG_METRICS) metrics_log_nodes_info_to_tmp_dir(f); diff --git a/libfuse/lib/fuse_msgbuf.cpp b/libfuse/lib/fuse_msgbuf.cpp index fd167612..dd857876 100644 --- a/libfuse/lib/fuse_msgbuf.cpp +++ b/libfuse/lib/fuse_msgbuf.cpp @@ -78,13 +78,11 @@ page_aligned_malloc(const uint64_t size_) fuse_msgbuf_t* msgbuf_alloc() { + std::lock_guard lck(g_MUTEX); fuse_msgbuf_t *msgbuf; - g_MUTEX.lock(); if(g_MSGBUF_STACK.empty()) { - g_MUTEX.unlock(); - msgbuf = (fuse_msgbuf_t*)malloc(sizeof(fuse_msgbuf_t)); if(msgbuf == NULL) return NULL; @@ -102,7 +100,6 @@ msgbuf_alloc() { msgbuf = g_MSGBUF_STACK.top(); g_MSGBUF_STACK.pop(); - g_MUTEX.unlock(); } return msgbuf; @@ -122,3 +119,28 @@ msgbuf_free(fuse_msgbuf_t *msgbuf_) g_MSGBUF_STACK.push(msgbuf_); } + +uint64_t +msgbuf_alloc_count() +{ + std::lock_guard lck(g_MUTEX); + + return g_MSGBUF_STACK.size(); +} + +void +msgbuf_gc() +{ + std::lock_guard lck(g_MUTEX); + + while(!g_MSGBUF_STACK.empty()) + { + fuse_msgbuf_t *msgbuf; + + msgbuf = g_MSGBUF_STACK.top(); + g_MSGBUF_STACK.pop(); + + free(msgbuf->mem); + free(msgbuf); + } +} diff --git a/libfuse/lib/fuse_msgbuf.hpp b/libfuse/lib/fuse_msgbuf.hpp index 8ff0f77f..348b2698 100644 --- a/libfuse/lib/fuse_msgbuf.hpp +++ b/libfuse/lib/fuse_msgbuf.hpp @@ -27,7 +27,10 @@ void msgbuf_set_bufsize(const uint32_t size); uint32_t msgbuf_get_bufsize(); fuse_msgbuf_t* msgbuf_alloc(); -fuse_msgbuf_t* msgbuf_alloc_memonly(); void msgbuf_free(fuse_msgbuf_t *msgbuf); +void msgbuf_gc(); + +uint64_t msgbuf_alloc_count(); + EXTERN_C_END