From 7be46e0e8c062ac43b4c7fdb9f1f84213ddbb171 Mon Sep 17 00:00:00 2001 From: luozihao <1165977584@qq.com> Date: Thu, 4 Nov 2021 17:04:40 +0800 Subject: [PATCH] =?UTF-8?q?=E8=BF=9B=E4=B8=80=E6=AD=A5=E5=AE=8C=E5=96=84?= =?UTF-8?q?=E5=AF=B9=E5=B0=86=E8=A6=81=E5=8F=91=E9=80=81=E7=9A=84lsn?= =?UTF-8?q?=E7=9A=84=E5=90=88=E6=B3=95=E6=80=A7=E6=A0=A1=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/gausskernel/process/postmaster/pgarch.cpp | 11 ++++++++++- src/gausskernel/storage/replication/syncrep.cpp | 8 ++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/src/gausskernel/process/postmaster/pgarch.cpp b/src/gausskernel/process/postmaster/pgarch.cpp index 28817f47b..5d2df3225 100644 --- a/src/gausskernel/process/postmaster/pgarch.cpp +++ b/src/gausskernel/process/postmaster/pgarch.cpp @@ -682,9 +682,10 @@ static void pgarch_ArchiverObsCopyLoop(XLogRecPtr flushPtr, doArchive fun) * setting for archive_command as soon as possible, even if there * is a backlog of files to be archived. */ + ReplicationSlot* slot = getObsReplicationSlot(); if (t_thrd.arch.got_SIGHUP) { ProcessConfigFile(PGC_SIGHUP); - if (getObsReplicationSlot() == NULL) { + if (slot == NULL) { return; } t_thrd.arch.got_SIGHUP = false; @@ -703,6 +704,14 @@ static void pgarch_ArchiverObsCopyLoop(XLogRecPtr flushPtr, doArchive fun) targetLsn = Min(targetLsn + size, flushPtr); } + if (targetLsn < slot->data.restart_lsn) { + ereport(ERROR, + (errmsg("transaction log file \"%X/%X\" is invalid," + "it should be larger than the restart_lsn \"%X/%X\" of slot.", + (uint32)(targetLsn >> 32), (uint32)(targetLsn), + (uint32)(slot->data.restart_lsn >> 32), (uint32)(slot->data.restart_lsn)))); + } + if (!XlogFileIsExisted(t_thrd.proc_cxt.DataDir, targetLsn, DEFAULT_TIMELINE_ID)) { ereport(WARNING, (errmsg("transaction log file \"%X/%X\" does not existed, it may be archived by the old primary.", diff --git a/src/gausskernel/storage/replication/syncrep.cpp b/src/gausskernel/storage/replication/syncrep.cpp index df4abcb0e..a51e561de 100644 --- a/src/gausskernel/storage/replication/syncrep.cpp +++ b/src/gausskernel/storage/replication/syncrep.cpp @@ -732,6 +732,10 @@ static void SyncRepGetOldestSyncRecPtr(XLogRecPtr* receivePtr, XLogRecPtr* write XLogRecPtr apply; SpinLockAcquire(&walsnd->mutex); + if (walsnd == NULL || walsnd->pid == 0) { + SpinLockRelease(&walsnd->mutex); + continue; + } receive = walsnd->receive; write = walsnd->write; flush = walsnd->flush; @@ -774,6 +778,10 @@ static void SyncRepGetNthLatestSyncRecPtr(XLogRecPtr* receivePtr, XLogRecPtr* wr WalSnd* walsnd = &t_thrd.walsender_cxt.WalSndCtl->walsnds[lfirst_int(cell)]; SpinLockAcquire(&walsnd->mutex); + if (walsnd == NULL || walsnd->pid == 0) { + SpinLockRelease(&walsnd->mutex); + continue; + } receive_array[i] = walsnd->receive; write_array[i] = walsnd->write; flush_array[i] = walsnd->flush;