From d52064490de18a52bdf8510d0ae2c9e1beeed335 Mon Sep 17 00:00:00 2001 From: luozihao <1165977584@qq.com> Date: Mon, 15 Nov 2021 17:41:43 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8Dcatchup=E6=97=B6=E4=B8=A2?= =?UTF-8?q?=E5=A4=B1=E6=9C=AA=E5=BD=92=E6=A1=A3xlog=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/gausskernel/process/postmaster/pgarch.cpp | 15 +++++++++++---- src/gausskernel/storage/replication/slot.cpp | 5 ++--- src/gausskernel/storage/replication/syncrep.cpp | 3 ++- 3 files changed, 15 insertions(+), 8 deletions(-) diff --git a/src/gausskernel/process/postmaster/pgarch.cpp b/src/gausskernel/process/postmaster/pgarch.cpp index b13c37cc7..f81491e47 100644 --- a/src/gausskernel/process/postmaster/pgarch.cpp +++ b/src/gausskernel/process/postmaster/pgarch.cpp @@ -152,12 +152,11 @@ ThreadId pgarch_start(void) /* * Do nothing if no archiver needed */ - if (!XLogArchivingActive() && !(getObsReplicationSlot())) + ReplicationSlot* slot = getObsReplicationSlot(); + if (!XLogArchivingActive() && slot == NULL) return 0; load_server_mode(); - if (getObsReplicationSlot() != NULL && - t_thrd.xlog_cxt.server_mode != PRIMARY_MODE && - t_thrd.xlog_cxt.server_mode != STANDBY_MODE) { + if (slot != NULL && t_thrd.xlog_cxt.server_mode != PRIMARY_MODE && t_thrd.xlog_cxt.server_mode != STANDBY_MODE) { return 0; } /* @@ -227,9 +226,17 @@ NON_EXEC_STATIC void PgArchiverMain() */ init_ps_display("archiver process", "", "", ""); setObsArchLatch(&t_thrd.arch.mainloop_latch); + ReplicationSlot* slot = getObsReplicationSlot(); + if (slot != NULL) { + load_server_mode(); + if (t_thrd.xlog_cxt.server_mode == PRIMARY_MODE) { + ReplicationSlotAcquire(NameStr(slot->data.name), slot->data.isDummyStandby); + } + } initLastTaskLsn(); initArchiveCxt(); pgarch_MainLoop(); + ReplicationSlotRelease(); gs_thread_exit(0); } diff --git a/src/gausskernel/storage/replication/slot.cpp b/src/gausskernel/storage/replication/slot.cpp index e147a0ae8..dfdfc2c6d 100644 --- a/src/gausskernel/storage/replication/slot.cpp +++ b/src/gausskernel/storage/replication/slot.cpp @@ -834,8 +834,8 @@ void ReplicationSlotsComputeRequiredLSN(ReplicationSlotState *repl_slt_state) in_use = true; restart_lsn = vslot->data.restart_lsn; - /* ignore restart lsn of slot not active. backup slot is always considered. */ - if (!s->active && s->data.database == InvalidOid && GET_SLOT_PERSISTENCY(vslot->data) != RS_BACKUP) { + /* ignore restart lsn of slot not active. backup slot and archive slot are always considered. */ + if (s->archive_obs == NULL && !s->active && s->data.database == InvalidOid && GET_SLOT_PERSISTENCY(vslot->data) != RS_BACKUP) { goto lock_release; } @@ -1944,7 +1944,6 @@ void advanceObsSlot(XLogRecPtr restart_pos) long current = TIME_GET_MILLISEC(tv); long diff = current - t_thrd.arch.last_advance_slot_time; if (diff > t_thrd.arch.advance_slot_wait_interval) { - t_thrd.slot_cxt.MyReplicationSlot = slot; flushSlot(current); } } else { diff --git a/src/gausskernel/storage/replication/syncrep.cpp b/src/gausskernel/storage/replication/syncrep.cpp index a51e561de..59668166f 100644 --- a/src/gausskernel/storage/replication/syncrep.cpp +++ b/src/gausskernel/storage/replication/syncrep.cpp @@ -634,7 +634,8 @@ bool SyncRepGetSyncRecPtr(XLogRecPtr *receivePtr, XLogRecPtr *writePtr, XLogRecP */ if ((!(*am_sync) && check_am_sync) || t_thrd.syncrep_cxt.SyncRepConfig == NULL || (!t_thrd.walsender_cxt.WalSndCtl->most_available_sync && - list_length(sync_standbys) < t_thrd.syncrep_cxt.SyncRepConfig->num_sync)) { + list_length(sync_standbys) < t_thrd.syncrep_cxt.SyncRepConfig->num_sync) || + (t_thrd.walsender_cxt.WalSndCtl->most_available_sync && list_length((sync_standbys)) == 0)) { list_free(sync_standbys); return false; }