From 05647a44f32972514a6c1543ae6cb1bf1dae3735 Mon Sep 17 00:00:00 2001 From: dongning12 Date: Sat, 18 Mar 2023 11:41:44 +0800 Subject: [PATCH] add sleep time to avoid LWLock starvation for buffer content lock --- src/gausskernel/ddes/adapter/ss_dms_bufmgr.cpp | 9 +++++++++ src/gausskernel/storage/buffer/bufmgr.cpp | 8 ++++++-- src/include/ddes/dms/ss_dms_bufmgr.h | 1 + 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/gausskernel/ddes/adapter/ss_dms_bufmgr.cpp b/src/gausskernel/ddes/adapter/ss_dms_bufmgr.cpp index 792a6b533..14114aad8 100644 --- a/src/gausskernel/ddes/adapter/ss_dms_bufmgr.cpp +++ b/src/gausskernel/ddes/adapter/ss_dms_bufmgr.cpp @@ -884,3 +884,12 @@ void SSMarkBufferDirtyForERTO(RedoBufferInfo* bufferinfo) } } } + +const int ss_buf_retry_threshold = 5; +long SSGetBufSleepTime(int retry_times) +{ + if (retry_times < ss_buf_retry_threshold) { + return 5000L * retry_times; + } + return 1000L * 1000 * 60; +} diff --git a/src/gausskernel/storage/buffer/bufmgr.cpp b/src/gausskernel/storage/buffer/bufmgr.cpp index 53767c729..ab8a0d0ec 100644 --- a/src/gausskernel/storage/buffer/bufmgr.cpp +++ b/src/gausskernel/storage/buffer/bufmgr.cpp @@ -5858,6 +5858,7 @@ void LockBuffer(Buffer buffer, int mode) { volatile BufferDesc *buf = NULL; bool need_update_lockid = false; + int dms_retry_times = 0; Assert(BufferIsValid(buffer)); if (BufferIsLocal(buffer)) { @@ -5912,7 +5913,8 @@ retry: LWLockRelease(buf->content_lock); - pg_usleep(5000L); + dms_retry_times++; + pg_usleep(SSGetBufSleepTime(dms_retry_times)); goto retry; } } @@ -5984,6 +5986,7 @@ bool TryLockBuffer(Buffer buffer, int mode, bool must_wait) bool ConditionalLockBuffer(Buffer buffer) { volatile BufferDesc *buf = NULL; + int dms_retry_times = 0; Assert(BufferIsValid(buffer)); if (BufferIsLocal(buffer)) { @@ -6015,7 +6018,8 @@ retry: } LWLockRelease(buf->content_lock); - pg_usleep(5000L); + dms_retry_times++; + pg_usleep(SSGetBufSleepTime(dms_retry_times)); goto retry; } } diff --git a/src/include/ddes/dms/ss_dms_bufmgr.h b/src/include/ddes/dms/ss_dms_bufmgr.h index 3017bbf04..692d83c3a 100644 --- a/src/include/ddes/dms/ss_dms_bufmgr.h +++ b/src/include/ddes/dms/ss_dms_bufmgr.h @@ -80,5 +80,6 @@ bool SSSegRead(SMgrRelation reln, ForkNumber forknum, char *buffer); bool DmsCheckBufAccessible(); bool SSHelpFlushBufferIfNeed(BufferDesc* buf_desc); void SSMarkBufferDirtyForERTO(RedoBufferInfo* bufferinfo); +long SSGetBufSleepTime(int retry_times); #endif