From 3290af6a23b4772623e91e91e09a6b59269f15a5 Mon Sep 17 00:00:00 2001 From: luozihao <1165977584@qq.com> Date: Thu, 25 Nov 2021 09:50:12 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A7=A3=E5=86=B3=E5=BD=92=E6=A1=A3=E6=B5=81?= =?UTF-8?q?=E7=A8=8B=E4=BC=9A=E5=9B=A0=E4=B8=BA=E5=A4=87=E6=9C=BA=E4=B8=8D?= =?UTF-8?q?=E5=AD=98=E5=9C=A8=E5=AF=B9=E5=BA=94=E7=9A=84xlog=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E8=80=8C=E5=8D=A1=E4=BD=8F=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 +++++++++++++-- .../storage/replication/walreceiver.cpp | 2 +- src/gausskernel/storage/replication/walsender.cpp | 13 ++++++++++--- src/include/knl/knl_instance.h | 8 ++++++++ src/include/replication/walprotocol.h | 7 +++++++ 5 files changed, 39 insertions(+), 6 deletions(-) diff --git a/src/gausskernel/process/postmaster/pgarch.cpp b/src/gausskernel/process/postmaster/pgarch.cpp index 35426e162..bc1dc362a 100644 --- a/src/gausskernel/process/postmaster/pgarch.cpp +++ b/src/gausskernel/process/postmaster/pgarch.cpp @@ -1018,18 +1018,29 @@ static void pgarch_archiveDone(const char* xlog) */ static void pgarch_archiveRoachForPitrStandby() { + XLogRecPtr targetLsn = g_instance.archive_obs_cxt.archive_task.targetLsn; + if (!XlogFileIsExisted(t_thrd.proc_cxt.DataDir, targetLsn, DEFAULT_TIMELINE_ID)) { + g_instance.archive_obs_cxt.pitr_result_type = ARCH_SKIP; + g_instance.archive_obs_cxt.pitr_finish_result = true; + ereport(WARNING, + (errmsg("pgarch_archiveRoachForPitrStandby %X/%X is not exists, skip the process of archiving", + (uint32)(targetLsn >> 32), (uint32)(targetLsn)))); + return; + } ereport(LOG, (errmsg("pgarch_archiveRoachForPitrStandby %X/%X, term:%d, subterm:%d", - (uint32)(g_instance.archive_obs_cxt.archive_task.targetLsn >> 32), (uint32)(g_instance.archive_obs_cxt.archive_task.targetLsn), + (uint32)(targetLsn >> 32), (uint32)(targetLsn), g_instance.archive_obs_cxt.archive_task.term, g_instance.archive_obs_cxt.archive_task.sub_term))); if (obs_replication_archive(&g_instance.archive_obs_cxt.archive_task) == 0) { g_instance.archive_obs_cxt.pitr_finish_result = true; + g_instance.archive_obs_cxt.pitr_result_type = ARCH_SUCCESS; } else { ereport(WARNING, (errmsg("error when pgarch_archiveRoachForPitrStandby %X/%X, term:%d, subterm:%d", - (uint32)(g_instance.archive_obs_cxt.archive_task.targetLsn >> 32), (uint32)(g_instance.archive_obs_cxt.archive_task.targetLsn), + (uint32)(targetLsn >> 32), (uint32)(targetLsn), g_instance.archive_obs_cxt.archive_task.term, g_instance.archive_obs_cxt.archive_task.sub_term))); g_instance.archive_obs_cxt.pitr_finish_result = false; + g_instance.archive_obs_cxt.pitr_result_type = ARCH_FAILED; } } diff --git a/src/gausskernel/storage/replication/walreceiver.cpp b/src/gausskernel/storage/replication/walreceiver.cpp index d67d3d7b3..2af321135 100644 --- a/src/gausskernel/storage/replication/walreceiver.cpp +++ b/src/gausskernel/storage/replication/walreceiver.cpp @@ -1919,7 +1919,7 @@ static void WalRecvSendArchiveXlogResponse() errno_t errorno = EOK; reply.pitr_result = g_instance.archive_obs_cxt.pitr_finish_result; reply.targetLsn = g_instance.archive_obs_cxt.archive_task.targetLsn; - + reply.result_type = g_instance.archive_obs_cxt.pitr_result_type; buf[0] = 'a'; errorno = memcpy_s(&buf[1], sizeof(ArchiveXlogResponseMeeeage), diff --git a/src/gausskernel/storage/replication/walsender.cpp b/src/gausskernel/storage/replication/walsender.cpp index e550762f3..abfafc0dc 100644 --- a/src/gausskernel/storage/replication/walsender.cpp +++ b/src/gausskernel/storage/replication/walsender.cpp @@ -2538,9 +2538,16 @@ static void ProcessArchiveFeedbackMessage(void) ArchiveXlogResponseMeeeage reply; /* Decipher the reply message */ pq_copymsgbytes(t_thrd.walsender_cxt.reply_message, (char*)&reply, sizeof(ArchiveXlogResponseMeeeage)); - ereport(LOG, - (errmsg("ProcessArchiveFeedbackMessage %d %X/%X", reply.pitr_result, - (uint32)(reply.targetLsn >> 32), (uint32)(reply.targetLsn)))); + if (reply.pitr_result && reply.result_type == ARCH_SKIP) { + ereport(WARNING, + (errmsg("ProcessArchiveFeedbackMessage %X/%X is not exists in the standby, skip it", + (uint32)(reply.targetLsn >> 32), (uint32)(reply.targetLsn)))); + } else { + ereport(LOG, + (errmsg("ProcessArchiveFeedbackMessage %d %X/%X", reply.pitr_result, + (uint32)(reply.targetLsn >> 32), (uint32)(reply.targetLsn)))); + } + g_instance.archive_obs_cxt.pitr_finish_result = reply.pitr_result; g_instance.archive_obs_cxt.archive_task.targetLsn = reply.targetLsn; if (walsnd->arch_latch == NULL) { diff --git a/src/include/knl/knl_instance.h b/src/include/knl/knl_instance.h index d903c968f..4dc228ee2 100644 --- a/src/include/knl/knl_instance.h +++ b/src/include/knl/knl_instance.h @@ -740,6 +740,14 @@ typedef struct knl_g_archive_obs_context { volatile int sync_walsender_idx; volatile long last_arch_time; volatile XLogRecPtr pitr_task_last_lsn; + + /* + * walreceiver set the archiving result type + * 0 for archiving failed + * 1 for archiving success + * 2 is skipping the archiving becasuse of the xlog does not exists + */ + volatile unsigned int pitr_result_type; } knl_g_archive_obs_context; #ifdef ENABLE_MOT diff --git a/src/include/replication/walprotocol.h b/src/include/replication/walprotocol.h index a5dcc70f1..f5711e1cf 100644 --- a/src/include/replication/walprotocol.h +++ b/src/include/replication/walprotocol.h @@ -147,6 +147,7 @@ typedef struct ArchiveXlogMessage { typedef struct ArchiveXlogResponseMeeeage { bool pitr_result; XLogRecPtr targetLsn; + uint32 result_type; } ArchiveXlogResponseMeeeage; /* @@ -173,6 +174,12 @@ typedef enum { PITR_TASK_DONE } PITR_TASK_STATUS; +typedef enum { + ARCH_FAILED = 0, + ARCH_SUCCESS, + ARCH_SKIP +} PITR_RESULT_TYPE; + /* * switchover response message from primary (message type 'p'). This is wrapped within * a CopyData message at the FE/BE protocol level.