diff --git a/src/gausskernel/process/postmaster/walwriter.cpp b/src/gausskernel/process/postmaster/walwriter.cpp index d3d78be75..0f9b6b729 100644 --- a/src/gausskernel/process/postmaster/walwriter.cpp +++ b/src/gausskernel/process/postmaster/walwriter.cpp @@ -299,7 +299,7 @@ void WalWriterMain(void) (void)pthread_mutex_lock(&g_instance.wal_cxt.criticalEntryMutex); g_instance.wal_cxt.isWalWriterSleeping = true; while (pCriticalEntry->status == WAL_NOT_COPIED && !t_thrd.walwriter_cxt.shutdown_requested) { - (void)clock_gettime(CLOCK_REALTIME, &time_to_wait); + (void)clock_gettime(CLOCK_MONOTONIC, &time_to_wait); time_to_wait.tv_nsec += g_sleep_timeout_ms * NANOSECONDS_PER_MILLISECOND; if (time_to_wait.tv_nsec >= NANOSECONDS_PER_SECOND) { time_to_wait.tv_nsec -= NANOSECONDS_PER_SECOND; diff --git a/src/gausskernel/process/threadpool/knl_instance.cpp b/src/gausskernel/process/threadpool/knl_instance.cpp index c1ab94b2a..409bc9bde 100644 --- a/src/gausskernel/process/threadpool/knl_instance.cpp +++ b/src/gausskernel/process/threadpool/knl_instance.cpp @@ -102,6 +102,20 @@ static void knl_g_ckpt_init(knl_g_ckpt_context* ckpt_cxt) static void knl_g_wal_init(knl_g_wal_context *const wal_cxt) { + int ret = 0; + ret = pthread_condattr_init(&wal_cxt->criticalEntryAtt); + if (ret != 0) { + elog(FATAL, "Fail to init conattr for walwrite"); + } + ret = pthread_condattr_setclock(&wal_cxt->criticalEntryAtt, CLOCK_MONOTONIC); + if (ret != 0) { + elog(FATAL, "Fail to setclock walwrite"); + } + ret = pthread_cond_init(&wal_cxt->criticalEntryCV, &wal_cxt->criticalEntryAtt); + if (ret != 0) { + elog(FATAL, "Fail to init cond for walwrite"); + } + wal_cxt->walInsertStatusTable = NULL; wal_cxt->walFlushWaitLock = NULL; wal_cxt->walBufferInitWaitLock = NULL; @@ -114,7 +128,6 @@ static void knl_g_wal_init(knl_g_wal_context *const wal_cxt) wal_cxt->XLogFlusherCPU = 0; wal_cxt->isWalWriterSleeping = false; wal_cxt->criticalEntryMutex = PTHREAD_MUTEX_INITIALIZER; - wal_cxt->criticalEntryCV = (pthread_cond_t)PTHREAD_COND_INITIALIZER; wal_cxt->globalEndPosSegNo = InvalidXLogSegPtr; wal_cxt->walWaitFlushCount = 0; wal_cxt->lastWalStatusEntryFlushed = -1; diff --git a/src/include/knl/knl_instance.h b/src/include/knl/knl_instance.h index 185f1b117..991879186 100644 --- a/src/include/knl/knl_instance.h +++ b/src/include/knl/knl_instance.h @@ -698,6 +698,7 @@ typedef struct knl_g_wal_context { volatile bool isWalWriterSleeping; pthread_mutex_t criticalEntryMutex; pthread_cond_t criticalEntryCV; + pthread_condattr_t criticalEntryAtt; volatile uint32 walWaitFlushCount; /* only for xlog statistics use */ volatile XLogSegNo globalEndPosSegNo; /* Global variable for init xlog segment files. */ int lastWalStatusEntryFlushed;