From 61bd40155c705e1e2f5dd0c2329caac56467ca71 Mon Sep 17 00:00:00 2001 From: chenxiaobin19 <1025221611@qq.com> Date: Wed, 8 Sep 2021 17:50:54 +0800 Subject: [PATCH] wake up other walsenders to release workers when walsender exits. --- src/gausskernel/storage/replication/walsender.cpp | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/gausskernel/storage/replication/walsender.cpp b/src/gausskernel/storage/replication/walsender.cpp index b5e2b7291..46728566f 100644 --- a/src/gausskernel/storage/replication/walsender.cpp +++ b/src/gausskernel/storage/replication/walsender.cpp @@ -3492,6 +3492,9 @@ static int WalSndLoop(WalSndSendDataCallback send_data) WaitLatchOrSocket(&t_thrd.walsender_cxt.MyWalSnd->latch, wakeEvents, u_sess->proc_cxt.MyProcPort->sock, sleeptime); + if (!AM_WAL_STANDBY_SENDER) { + SyncRepReleaseWaiters(); + } t_thrd.int_cxt.ImmediateInterruptOK = false; } @@ -3833,6 +3836,13 @@ static void WalSndKill(int code, Datum arg) t_thrd.walsender_cxt.sendFile = -1; } + /* + * Try to wake up walsenders which are in WaitLatchOrSocket of WalSndLoop. + * Or they would be woken up only by walwriter, which may cause that workers + * are not woken up in time. + */ + WalSndWakeup(); + t_thrd.walsender_cxt.wsXLogJustSendRegion->start_ptr = InvalidXLogRecPtr; t_thrd.walsender_cxt.wsXLogJustSendRegion->end_ptr = InvalidXLogRecPtr;