From e1a8b451176edea6ca339f0e27ceaf6a47afcf8b Mon Sep 17 00:00:00 2001 From: congzhou2603 Date: Tue, 19 Sep 2023 10:43:51 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E3=80=90bugfix=E3=80=91=20=E4=BF=AE?= =?UTF-8?q?=E5=A4=8Dpostmaster=E7=BA=BF=E7=A8=8B=E5=8D=A1=E5=9C=A8PM=5FWAI?= =?UTF-8?q?T=5FBACKEND?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../process/postmaster/postmaster.cpp | 22 +++++++++++++++++++ src/include/ddes/dms/ss_reform_common.h | 2 ++ 2 files changed, 24 insertions(+) diff --git a/src/gausskernel/process/postmaster/postmaster.cpp b/src/gausskernel/process/postmaster/postmaster.cpp index d8b0ff25ee..706a785dc0 100644 --- a/src/gausskernel/process/postmaster/postmaster.cpp +++ b/src/gausskernel/process/postmaster/postmaster.cpp @@ -486,6 +486,7 @@ static bool CheckSignalByFile(const char *filename, void *infoPtr, size_t infoSi int GaussDbThreadMain(knl_thread_arg* arg); const char* GetThreadName(knl_thread_role role); +void SSOndemandProcExitIfStayWaitBackends(); #ifdef EXEC_BACKEND @@ -3976,6 +3977,10 @@ static int ServerLoop(void) result = BackendStartup(port, isConnectHaPort); } + if (SS_CLUSTER_ONDEMAND_RECOVERY && SS_IN_REFORM && + result != STATUS_OK && pmState == PM_WAIT_BACKENDS) { + SSOndemandProcExitIfStayWaitBackends(); + } if (result != STATUS_OK) { if (port->is_logic_conn) { gs_close_gsocket(&port->gs_sock); @@ -15086,3 +15091,20 @@ void SSRestartFailoverPromote() pmState = PM_WAIT_BACKENDS; SShandle_promote_signal(); } + +void SSOndemandProcExitIfStayWaitBackends() +{ + int failTimes = 0; + while (failTimes < WAIT_PMSTATE_UPDATE_TRIES && pmState == PM_WAIT_BACKENDS) { + PostmasterStateMachine(); + pg_usleep(REFORM_WAIT_LONG); + failTimes++; + } + if (pmState == PM_WAIT_BACKENDS) { + ereport(PANIC, (errmsg("Proc exit because pmState stay %s for %d times, " + "when reform failed and in ondemand recovery, " + "to avoid pmState being stuck in PM_WAIT_BACKENDS.", + GetPMState(pmState), WAIT_PMSTATE_UPDATE_TRIES))); + proc_exit(1); + } +} \ No newline at end of file diff --git a/src/include/ddes/dms/ss_reform_common.h b/src/include/ddes/dms/ss_reform_common.h index 227d762e8b..a11429d1dc 100644 --- a/src/include/ddes/dms/ss_reform_common.h +++ b/src/include/ddes/dms/ss_reform_common.h @@ -31,6 +31,8 @@ #define REFORM_WAIT_LONG 100000 /* 0.1 sec */ #define WAIT_REFORM_CTRL_REFRESH_TRIES 1000 +#define WAIT_PMSTATE_UPDATE_TRIES 100 + #define REFORM_CTRL_VERSION 1 typedef struct SSBroadcastCancelTrx { -- Gitee From f6f95e9995f37e77a1c56ebc1f01ba5c0091eed0 Mon Sep 17 00:00:00 2001 From: congzhou2603 Date: Wed, 20 Sep 2023 16:09:11 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E3=80=90bugfix=E3=80=91=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E6=8C=89=E9=9C=80=E5=9B=9E=E6=94=BE=E8=B5=B0=E5=88=B0=E6=9E=81?= =?UTF-8?q?=E8=87=B4RTO=E5=A4=87=E6=9C=BA=E5=8F=AF=E8=AF=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/gausskernel/process/postmaster/postmaster.cpp | 4 ++-- src/gausskernel/storage/buffer/bufmgr.cpp | 7 +++---- src/include/access/multi_redo_api.h | 2 +- 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/src/gausskernel/process/postmaster/postmaster.cpp b/src/gausskernel/process/postmaster/postmaster.cpp index 706a785dc0..2a4e68afb3 100644 --- a/src/gausskernel/process/postmaster/postmaster.cpp +++ b/src/gausskernel/process/postmaster/postmaster.cpp @@ -3979,7 +3979,7 @@ static int ServerLoop(void) if (SS_CLUSTER_ONDEMAND_RECOVERY && SS_IN_REFORM && result != STATUS_OK && pmState == PM_WAIT_BACKENDS) { - SSOndemandProcExitIfStayWaitBackends(); + SSOndemandProcExitIfStayWaitBackends(); } if (result != STATUS_OK) { if (port->is_logic_conn) { @@ -15101,7 +15101,7 @@ void SSOndemandProcExitIfStayWaitBackends() failTimes++; } if (pmState == PM_WAIT_BACKENDS) { - ereport(PANIC, (errmsg("Proc exit because pmState stay %s for %d times, " + ereport(WARNING, (errmsg("Proc exit because pmState stay %s for %d times, " "when reform failed and in ondemand recovery, " "to avoid pmState being stuck in PM_WAIT_BACKENDS.", GetPMState(pmState), WAIT_PMSTATE_UPDATE_TRIES))); diff --git a/src/gausskernel/storage/buffer/bufmgr.cpp b/src/gausskernel/storage/buffer/bufmgr.cpp index e807eb956e..65601d55a1 100644 --- a/src/gausskernel/storage/buffer/bufmgr.cpp +++ b/src/gausskernel/storage/buffer/bufmgr.cpp @@ -1714,11 +1714,10 @@ Buffer buffer_read_extended_internal(Relation reln, ForkNumber fork_num, BlockNu Buffer ReadBufferExtended(Relation reln, ForkNumber fork_num, BlockNumber block_num, ReadBufferMode mode, BufferAccessStrategy strategy) { - if (IsDefaultExtremeRtoMode() && - (!RecoveryInProgress() || !IsExtremeRtoRunning() || !is_exrto_standby_read_worker())) { - return buffer_read_extended_internal(reln, fork_num, block_num, mode, strategy); - } else { + if (IsDefaultExtremeRtoMode() && RecoveryInProgress() && IsExtremeRtoRunning() && is_exrto_standby_read_worker()) { return standby_read_buf(reln, fork_num, block_num, mode, strategy); + } else { + return buffer_read_extended_internal(reln, fork_num, block_num, mode, strategy); } } diff --git a/src/include/access/multi_redo_api.h b/src/include/access/multi_redo_api.h index 0c1bd1f770..4ec8cee786 100644 --- a/src/include/access/multi_redo_api.h +++ b/src/include/access/multi_redo_api.h @@ -68,7 +68,7 @@ static const uint32 BIG_RECORD_LENGTH = XLOG_BLCKSZ * 16; #define IS_EXRTO_READ (IsExtremeRedo() && g_instance.attr.attr_storage.EnableHotStandby && IsDefaultExtremeRtoMode()) #define IS_EXRTO_STANDBY_READ (IS_EXRTO_READ && pm_state_is_hot_standby()) -#define IS_EXRTO_RECOVERY_IN_PROGRESS (RecoveryInProgress() && IsExtremeRedo()) +#define IS_EXRTO_RECOVERY_IN_PROGRESS (RecoveryInProgress() && IsExtremeRedo() && IsDefaultExtremeRtoMode()) inline bool is_exrto_standby_read_worker() { -- Gitee