!3047 【共享存储】解决部分场景下备机未能跳过回放的问题

Merge pull request !3047 from 陈栋/bugfix
This commit is contained in:
opengauss-bot
2023-03-07 14:19:34 +00:00
committed by Gitee
5 changed files with 5 additions and 10 deletions

View File

@ -1249,12 +1249,10 @@ static int CBRecoveryStandby(void *db_handle, int inst_id)
Assert(inst_id == g_instance.attr.attr_storage.dms_attr.instance_id);
ereport(LOG, (errmsg("[SS reform] Recovery as standby")));
g_instance.dms_cxt.SSRecoveryInfo.skip_redo_replay = true;
if (!SSRecoveryNodes()) {
ereport(WARNING, (errmodule(MOD_DMS), errmsg("Recovery failed in startup first")));
return GS_ERROR;
}
g_instance.dms_cxt.SSRecoveryInfo.skip_redo_replay = false;
return GS_SUCCESS;
}
@ -1263,7 +1261,6 @@ static int CBRecoveryPrimary(void *db_handle, int inst_id)
{
Assert(g_instance.dms_cxt.SSReformerControl.primaryInstId == inst_id ||
g_instance.dms_cxt.SSReformerControl.primaryInstId == -1);
g_instance.dms_cxt.SSRecoveryInfo.skip_redo_replay = false;
g_instance.dms_cxt.SSRecoveryInfo.in_flushcopy = false;
ereport(LOG, (errmsg("[SS reform] Recovery as primary, will replay xlog from inst:%d",
g_instance.dms_cxt.SSReformerControl.primaryInstId)));

View File

@ -99,7 +99,7 @@ bool SSRecoveryNodes()
return result;
}
bool SSRecoveryApplyDelay(const XLogReaderState *record)
bool SSRecoveryApplyDelay()
{
if (!ENABLE_REFORM) {
return false;

View File

@ -183,7 +183,6 @@ static void knl_g_dms_init(knl_g_dms_context *dms_cxt)
dms_cxt->SSRecoveryInfo.recovery_pause_flag = true;
dms_cxt->SSRecoveryInfo.failover_triggered = false;
dms_cxt->SSRecoveryInfo.new_primary_reset_walbuf_flag = false;
dms_cxt->SSRecoveryInfo.skip_redo_replay = false;
dms_cxt->SSRecoveryInfo.ready_to_startup = false;
dms_cxt->SSRecoveryInfo.startup_reform = true;
dms_cxt->SSRecoveryInfo.restart_failover_flag = false;

View File

@ -9914,7 +9914,8 @@ void StartupXLOG(void)
}
}
if (SSSKIP_REDO_REPLAY && t_thrd.xlog_cxt.InRecovery == true) {
if (SS_STANDBY_MODE && t_thrd.xlog_cxt.InRecovery == true) {
SSRecoveryApplyDelay();
/* do not need replay anything in SS standby mode */
ereport(LOG, (errmsg("[SS] Skip redo replay in standby mode")));
t_thrd.xlog_cxt.InRecovery = false;
@ -10326,7 +10327,7 @@ void StartupXLOG(void)
CountRedoTime(t_thrd.xlog_cxt.timeCost[TIME_COST_STEP_2]);
#endif
if (ENABLE_DMS && !SS_PERFORMING_SWITCHOVER && SSRecoveryApplyDelay(xlogreader)) {
if (ENABLE_DMS && !SS_PERFORMING_SWITCHOVER && SSRecoveryApplyDelay()) {
if (xlogctl->recoveryPause) {
recoveryPausesHere();
}

View File

@ -30,7 +30,6 @@
#define RECOVERY_WAIT_TIME 10000
#define SSFAILOVER_TRIGGER (ENABLE_DMS && g_instance.dms_cxt.SSRecoveryInfo.failover_triggered == true)
#define SSSKIP_REDO_REPLAY (ENABLE_DMS && g_instance.dms_cxt.SSRecoveryInfo.skip_redo_replay == true)
#define SS_BEFORE_RECOVERY (ENABLE_DMS && g_instance.dms_cxt.SSReformInfo.in_reform == true \
&& g_instance.dms_cxt.SSRecoveryInfo.recovery_pause_flag == true)
#define SS_IN_FAILOVER (ENABLE_DMS && g_instance.dms_cxt.SSRecoveryInfo.in_failover == true)
@ -50,7 +49,6 @@ typedef struct ss_recovery_info {
bool recovery_pause_flag;
volatile bool failover_triggered;
char recovery_xlogDir[MAXPGPATH];
bool skip_redo_replay;
LWLock* update_seg_lock;
bool new_primary_reset_walbuf_flag;
bool ready_to_startup; // when DB start (except failover), the flag will set true
@ -68,7 +66,7 @@ extern int SSGetPrimaryInstId();
extern void SSSavePrimaryInstId(int id);
extern void SSReadControlFile(int id, bool updateDmsCtx = false);
extern void SSWriteReformerControlPages(void);
extern bool SSRecoveryApplyDelay(const XLogReaderState *record);
extern bool SSRecoveryApplyDelay();
extern void SShandle_promote_signal();
extern void SSTriggerFailover();
extern void ss_failover_dw_init();