From 497cca88869c9ee2e8b7dc1e8d16e4e11443b3da Mon Sep 17 00:00:00 2001 From: luozihao <1165977584@qq.com> Date: Tue, 16 Nov 2021 12:00:37 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E9=80=BB=E8=BE=91=E8=A7=A3?= =?UTF-8?q?=E7=A0=81=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/gausskernel/process/postmaster/pgarch.cpp | 2 +- src/gausskernel/process/postmaster/startup.cpp | 8 ++++++++ src/gausskernel/storage/replication/slot.cpp | 2 +- src/gausskernel/storage/replication/slotfuncs.cpp | 3 +-- 4 files changed, 11 insertions(+), 4 deletions(-) diff --git a/src/gausskernel/process/postmaster/pgarch.cpp b/src/gausskernel/process/postmaster/pgarch.cpp index 7d613488..e0360ce3 100644 --- a/src/gausskernel/process/postmaster/pgarch.cpp +++ b/src/gausskernel/process/postmaster/pgarch.cpp @@ -1157,7 +1157,7 @@ static void initLastTaskLsn() t_thrd.arch.last_arch_time = TIME_GET_MILLISEC(tv); volatile ReplicationSlot* obs_archive_slot = getObsReplicationSlot(); if (obs_archive_slot != NULL && !IsServerModeStandby()) { - XLogRecPtr targetLsn = getRestartLsnFromSlot(); + targetLsn = getRestartLsnFromSlot(); if (targetLsn != InvalidXLogRecPtr) { t_thrd.arch.pitr_task_last_lsn = targetLsn; advanceObsSlot(t_thrd.arch.pitr_task_last_lsn); diff --git a/src/gausskernel/process/postmaster/startup.cpp b/src/gausskernel/process/postmaster/startup.cpp index d9d1c6a5..e4989782 100644 --- a/src/gausskernel/process/postmaster/startup.cpp +++ b/src/gausskernel/process/postmaster/startup.cpp @@ -260,6 +260,14 @@ void StartupProcessMain(void) StartupXLOG(); } + /* + * If the archiver is still alive, we need to restart the archiver in startup. + */ + if (g_instance.pid_cxt.PgArchPID != 0 && getObsReplicationSlot() != NULL) { + gs_signal_send(g_instance.pid_cxt.PgArchPID, SIGTERM); + gs_signal_send(g_instance.pid_cxt.PgArchPID, SIGUSR2); + } + /* * Exit normally. Exit code 0 tells postmaster that we completed recovery * successfully. diff --git a/src/gausskernel/storage/replication/slot.cpp b/src/gausskernel/storage/replication/slot.cpp index 917e7481..408e00b7 100644 --- a/src/gausskernel/storage/replication/slot.cpp +++ b/src/gausskernel/storage/replication/slot.cpp @@ -1943,7 +1943,7 @@ void advanceObsSlot(XLogRecPtr restart_pos) gettimeofday(&tv, NULL); 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) { + if (diff > t_thrd.arch.advance_slot_wait_interval && t_thrd.xlog_cxt.server_mode == PRIMARY_MODE) { flushSlot(current); } } else { diff --git a/src/gausskernel/storage/replication/slotfuncs.cpp b/src/gausskernel/storage/replication/slotfuncs.cpp index ebe9fc0d..3a8e6e00 100644 --- a/src/gausskernel/storage/replication/slotfuncs.cpp +++ b/src/gausskernel/storage/replication/slotfuncs.cpp @@ -856,8 +856,7 @@ void redo_slot_advance(const ReplicationSlotPersistentData *slotInfo) * for logical replication slot, the Slot->data.database is VALID. */ #ifndef ENABLE_MULTIPLE_NODES - if (IsReplicationSlotActive(NameStr(slotInfo->name)) && t_thrd.slot_cxt.MyReplicationSlot != NULL && - t_thrd.slot_cxt.MyReplicationSlot->data.database != InvalidOid) { + if (IsReplicationSlotActive(NameStr(slotInfo->name)) && slotInfo->database != InvalidOid) { return; } #endif