!4171 【bugfix】修复主节点按需回放时,重启备节点,主节点卡在PM_WAIT_BACKEND
Merge pull request !4171 from 周聪/bugfix_cannot_create_process
This commit is contained in:
@ -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);
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -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()
|
||||
{
|
||||
|
||||
@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user