!4171 【bugfix】修复主节点按需回放时,重启备节点,主节点卡在PM_WAIT_BACKEND

Merge pull request !4171 from 周聪/bugfix_cannot_create_process
This commit is contained in:
opengauss_bot
2023-09-21 02:05:10 +00:00
committed by Gitee
4 changed files with 28 additions and 5 deletions

View File

@ -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(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)));
proc_exit(1);
}
}

View File

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

View File

@ -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()
{

View File

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