From 8c17e7da85d9fb5245b6d7d71741d16a3381ebfd Mon Sep 17 00:00:00 2001 From: muyulinzhong Date: Tue, 23 Jan 2024 16:25:06 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D:=E6=89=A9=E8=8A=82=E7=82=B9?= =?UTF-8?q?=EF=BC=8C=E4=BF=AE=E6=94=B9postgre.conf=E5=90=8E=EF=BC=8Creload?= =?UTF-8?q?=E6=93=8D=E4=BD=9C=E5=AF=BC=E8=87=B4=E5=A4=8D=E5=88=B6=E7=BA=BF?= =?UTF-8?q?=E7=A8=8B=20walsender=E9=87=8D=E5=90=AF=EF=BC=8C=E5=8F=AF?= =?UTF-8?q?=E8=83=BD=E5=BD=B1=E5=93=8D=E4=B8=9A=E5=8A=A1=EF=BC=8C=E9=9C=80?= =?UTF-8?q?=E8=A6=81=E4=BC=98=E5=8C=96=E3=80=90YC=E3=80=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../process/postmaster/postmaster.cpp | 34 ++++++++++++++++--- 1 file changed, 29 insertions(+), 5 deletions(-) diff --git a/src/gausskernel/process/postmaster/postmaster.cpp b/src/gausskernel/process/postmaster/postmaster.cpp index e8888515a..9f010e33b 100644 --- a/src/gausskernel/process/postmaster/postmaster.cpp +++ b/src/gausskernel/process/postmaster/postmaster.cpp @@ -302,6 +302,7 @@ static bool isNeedGetLCName = true; #define PM_POLL_TIMEOUT_SECOND 20 #define PM_POLL_TIMEOUT_MINUTE 58*SECS_PER_MINUTE*60*1000000L #define CHECK_TIMES 10 +#define InvalidPid ((ThreadId)(-1)) static char gaussdb_state_file[MAXPGPATH] = {0}; static char AddMemberFile[MAXPGPATH] = {0}; @@ -410,6 +411,7 @@ static int initPollfd(struct pollfd* ufds); static void report_fork_failure_to_client(Port* port, int errnum, const char* specialErrorInfo = NULL); void signal_child(ThreadId pid, int signal, int be_mode = -1); static bool SignalSomeChildren(int signal, int targets); +static bool SignalSpecialChildren(int signal, int target, ThreadId pid); static bool IsChannelAdapt(Port* port, ReplConnInfo* repl); static bool IsLocalPort(Port* port); @@ -8899,11 +8901,11 @@ void signal_child(ThreadId pid, int signal, int be_mode) } /* - * Send a signal to the targeted children (but NOT special children; - * dead_end children are never signaled, either). + * Send a signal to the special children; + * And we should not care about dead_end children. + * This function is also a sub entry for 'SignalSomeChildren'. */ -static bool SignalSomeChildren(int signal, int target) -{ +static bool SignalSpecialChildren(int signal, int target, ThreadId pid) { Dlelem* curr = NULL; bool signaled = false; @@ -8911,6 +8913,11 @@ static bool SignalSomeChildren(int signal, int target) Backend* bp = (Backend*)DLE_VAL(curr); int child = BACKEND_TYPE_ALL; + /* if we want to shut special pid */ + if (pid != InvalidPid && bp->pid != pid) { + continue; + } + /* * we want to know the type of this backend thread, so * in debug mode IF judgement is skipped. but in release @@ -8948,6 +8955,15 @@ static bool SignalSomeChildren(int signal, int target) return signaled; } +/* + * Send a signal to the targeted children (but NOT special children; + * dead_end children are never signaled, either). + */ +static bool SignalSomeChildren(int signal, int target) +{ + return SignalSpecialChildren(signal, target, InvalidPid); +} + bool SignalCancelAllBackEnd() { return SignalSomeChildren(SIGINT, BACKEND_TYPE_NORMAL); @@ -13307,6 +13323,15 @@ static void check_and_reset_ha_listen_port(void) if (t_thrd.postmaster_cxt.ReplConnChangeType[j] == OLD_REPL_CHANGE_IP_OR_PORT || t_thrd.postmaster_cxt.CrossClusterReplConnChanged[j]) { + /* now we should shut the WalSender which connection changed */ + for (int i = 0; i < g_instance.attr.attr_storage.max_wal_senders; i++) { + volatile WalSnd *walsnd = &t_thrd.walsender_cxt.WalSndCtl->walsnds[i]; + + if (walsnd->pid == 0 || walsnd->channel_get_replc != j) { + continue; + } + SignalSpecialChildren(SIGTERM, BACKEND_TYPE_WALSND, walsnd->pid); + } needToRestart = true; refreshListenSocket = true; } @@ -13335,7 +13360,6 @@ static void check_and_reset_ha_listen_port(void) if (needToRestart) { /* send SIGTERM to end process senders and receiver */ - (void)SignalSomeChildren(SIGTERM, BACKEND_TYPE_WALSND); (void)SignalSomeChildren(SIGTERM, BACKEND_TYPE_DATASND); if (g_instance.pid_cxt.WalRcvWriterPID != 0) signal_child(g_instance.pid_cxt.WalRcvWriterPID, SIGTERM);