From 46a7ac813e1ffe75bfe268e3b3d6c878f8bb007f Mon Sep 17 00:00:00 2001 From: TotaJ Date: Sat, 5 Dec 2020 15:35:45 +0800 Subject: [PATCH 1/2] Fix memset_s failed when shared_buffer size execced 409GB. --- src/gausskernel/storage/buffer/buf_init.cpp | 22 +++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/src/gausskernel/storage/buffer/buf_init.cpp b/src/gausskernel/storage/buffer/buf_init.cpp index 7caffbe52..908d0c902 100755 --- a/src/gausskernel/storage/buffer/buf_init.cpp +++ b/src/gausskernel/storage/buffer/buf_init.cpp @@ -27,6 +27,23 @@ const int PAGE_QUEUE_SLOT_MULTI_NBUFFERS = 5; +static inline void MemsetLongBuffer(char *buffer, Size len) +{ + int rc; + while (len > 0) { + if (len < SECUREC_MEM_MAX_LEN) { + rc = memset_s(buffer, len, 0, len); + securec_check(rc, "", ""); + len = 0; + } else { + rc = memset_s(buffer, SECUREC_MEM_MAX_LEN, 0, SECUREC_MEM_MAX_LEN); + securec_check(rc, "", ""); + len -= SECUREC_MEM_MAX_LEN; + buffer += SECUREC_MEM_MAX_LEN; + } + } +} + /* * Data Structures: * buffers live in a freelist and a lookup data structure. @@ -95,7 +112,6 @@ void InitBufferPool(void) "Checkpoint BufferIds", g_instance.attr.attr_storage.NBuffers * sizeof(CkptSortItem), &found_buf_ckpt); if (g_instance.attr.attr_storage.enableIncrementalCheckpoint && g_instance.ckpt_cxt_ctl->dirty_page_queue == NULL) { - errno_t rc; g_instance.ckpt_cxt_ctl->dirty_page_queue_size = g_instance.attr.attr_storage.NBuffers * PAGE_QUEUE_SLOT_MULTI_NBUFFERS; MemoryContext oldcontext = MemoryContextSwitchTo(g_instance.increCheckPoint_context); @@ -106,9 +122,7 @@ void InitBufferPool(void) ereport(ERROR, (errmodule(MOD_INCRE_CKPT), errmsg("Memory allocation failed.\n"))); } - rc = memset_s(g_instance.ckpt_cxt_ctl->dirty_page_queue, queue_mem_size, 0, queue_mem_size); - securec_check(rc, "", ""); - + MemsetLongBuffer((char*)g_instance.ckpt_cxt_ctl->dirty_page_queue, queue_mem_size); (void)MemoryContextSwitchTo(oldcontext); } From 8aa7913b71221011ece6ed2c354fbe1a7fb0f114 Mon Sep 17 00:00:00 2001 From: TotaJ Date: Wed, 9 Dec 2020 09:11:25 +0800 Subject: [PATCH 2/2] =?UTF-8?q?review=E6=84=8F=E8=A7=81=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/gausskernel/storage/buffer/buf_init.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/gausskernel/storage/buffer/buf_init.cpp b/src/gausskernel/storage/buffer/buf_init.cpp index 908d0c902..83c850a77 100755 --- a/src/gausskernel/storage/buffer/buf_init.cpp +++ b/src/gausskernel/storage/buffer/buf_init.cpp @@ -27,14 +27,14 @@ const int PAGE_QUEUE_SLOT_MULTI_NBUFFERS = 5; -static inline void MemsetLongBuffer(char *buffer, Size len) +static inline void MemsetPageQueue(char *buffer, Size len) { int rc; while (len > 0) { if (len < SECUREC_MEM_MAX_LEN) { rc = memset_s(buffer, len, 0, len); securec_check(rc, "", ""); - len = 0; + return; } else { rc = memset_s(buffer, SECUREC_MEM_MAX_LEN, 0, SECUREC_MEM_MAX_LEN); securec_check(rc, "", ""); @@ -122,7 +122,7 @@ void InitBufferPool(void) ereport(ERROR, (errmodule(MOD_INCRE_CKPT), errmsg("Memory allocation failed.\n"))); } - MemsetLongBuffer((char*)g_instance.ckpt_cxt_ctl->dirty_page_queue, queue_mem_size); + MemsetPageQueue((char*)g_instance.ckpt_cxt_ctl->dirty_page_queue, queue_mem_size); (void)MemoryContextSwitchTo(oldcontext); }