diff --git a/src/gausskernel/storage/access/transam/xlog.cpp b/src/gausskernel/storage/access/transam/xlog.cpp index 422428c34..d68ae1240 100644 --- a/src/gausskernel/storage/access/transam/xlog.cpp +++ b/src/gausskernel/storage/access/transam/xlog.cpp @@ -2477,9 +2477,20 @@ static bool XLogArchiveCheckDone(const char *xlog) static bool HasBeenArchivedOnHaMode(const char* xlog) { + /* + * Generally, the validity of the xlog transferred from the upper layer has been verified. + * Therefore, if the length of the xlog name transferred is greater than the standard length + * of the xlog name (24 characters), the transferred file is a .backup file. + * Therefore, if the xlog name contains more than 24 characters, return true. + */ + if (strlen(xlog) > 24) { + return true; + } + load_server_mode(); int mode = t_thrd.xlog_cxt.server_mode; XLogRecPtr minium_lsn = PG_UINT64_MAX; + for (int i = 0; mode == PRIMARY_MODE && i < g_instance.attr.attr_storage.max_wal_senders; i++) { /* use volatile pointer to prevent code rearrangement */ volatile WalSnd* walsnd = &t_thrd.walsender_cxt.WalSndCtl->walsnds[i]; diff --git a/src/gausskernel/storage/replication/walsender.cpp b/src/gausskernel/storage/replication/walsender.cpp index 8392f9010..f184ed514 100644 --- a/src/gausskernel/storage/replication/walsender.cpp +++ b/src/gausskernel/storage/replication/walsender.cpp @@ -3203,12 +3203,13 @@ static int WalSndLoop(WalSndSendDataCallback send_data) XLogRecPtr replayPtr; bool amSync = false; bool got_recptr = false; + int standby_nums = list_length(SyncRepGetSyncStandbys(&amSync)); got_recptr = SyncRepGetSyncRecPtr(&receivePtr, &writePtr, &flushPtr, &replayPtr, &amSync, false); if (got_recptr) { ArchiveXlogOnStandby(flushPtr); - } else if (t_thrd.syncrep_cxt.SyncRepConfig == NULL || - (t_thrd.walsender_cxt.WalSndCtl->most_available_sync && - list_length(SyncRepGetSyncStandbys(&amSync)) == 0)) { + } else if (t_thrd.syncrep_cxt.SyncRepConfig == NULL || + u_sess->attr.attr_storage.guc_synchronous_commit <= SYNCHRONOUS_COMMIT_LOCAL_FLUSH || + (t_thrd.walsender_cxt.WalSndCtl->most_available_sync && standby_nums == 0)) { /* * This step is used to deal with the situation that synchronous standbys are not set. */