set condattr for criticalEntryCV instead of PTHREAD_MUTEX_INITIALIZER

This commit is contained in:
movead
2021-04-15 17:14:09 +08:00
parent ac5d66d7a2
commit dacfaa48f4
3 changed files with 16 additions and 2 deletions

View File

@ -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;

View File

@ -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;

View File

@ -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;