This is an automated email from the ASF dual-hosted git repository.

chenjinbao1989 pushed a commit to branch cbdb-postgres-merge
in repository https://gitbox.apache.org/repos/asf/cloudberry.git


The following commit(s) were added to refs/heads/cbdb-postgres-merge by this 
push:
     new 63e4f2c0ece Add some code back to Recoery
63e4f2c0ece is described below

commit 63e4f2c0ece6f27331fab4a19467c07fc3f88681
Author: Jinbao Chen <[email protected]>
AuthorDate: Wed Mar 25 11:58:17 2026 -0400

    Add some code back to Recoery
---
 src/backend/access/transam/xlogrecovery.c | 75 ++++++++++++++++++++++++++++++-
 1 file changed, 73 insertions(+), 2 deletions(-)

diff --git a/src/backend/access/transam/xlogrecovery.c 
b/src/backend/access/transam/xlogrecovery.c
index 69187a969fb..45c73287b33 100644
--- a/src/backend/access/transam/xlogrecovery.c
+++ b/src/backend/access/transam/xlogrecovery.c
@@ -383,6 +383,13 @@ static XLogRecPtr recoveryStopLSN;
 static char recoveryStopName[MAXFNAMELEN];
 static bool recoveryStopAfter;
 
+/*
+ * GPDB: Have we reached a specific continuous recovery target? We set this to
+ * true if WAL replay has found a restore point matching the GPDB-specific GUC
+ * gp_pause_on_restore_point_replay and a promotion has been requested.
+ */
+static bool reachedContinuousRecoveryTarget = false;
+
 /* prototypes for local functions */
 static void ApplyWalRecord(XLogReaderState *xlogreader, XLogRecord *record, 
TimeLineID *replayTLI);
 
@@ -1614,6 +1621,60 @@ ShutdownWalRecovery(void)
                DisownLatch(&XLogRecoveryCtl->recoveryWakeupLatch);
 }
 
+
+/*
+ * GPDB: Restore point records can act as a point of synchronization to ensure
+ * cluster-wide consistency during WAL replay. If a restore point is specified
+ * in the gp_pause_on_restore_point_replay GUC, WAL replay will be paused at
+ * that restore point until replay is explicitly resumed.
+ */
+static void
+pauseRecoveryOnRestorePoint(XLogReaderState *record)
+{
+       uint8           info;
+       uint8           rmid;
+
+       /*
+        * Ignore recovery target settings when not in archive recovery (meaning
+        * we are in crash recovery).
+        */
+       if (!ArchiveRecoveryRequested)
+               return;
+
+       info = XLogRecGetInfo(record) & ~XLR_INFO_MASK;
+       rmid = XLogRecGetRmid(record);
+
+       if (rmid == RM_XLOG_ID && info == XLOG_RESTORE_POINT)
+       {
+               xl_restore_point *recordRestorePointData;
+
+               recordRestorePointData = (xl_restore_point *) 
XLogRecGetData(record);
+
+               if (gp_pause_on_restore_point_replay)
+               {
+                       ereport(LOG,
+                                       (errmsg("setting recovery pause at 
restore point \"%s\", time %s",
+                                                       
recordRestorePointData->rp_name,
+                                                       
timestamptz_to_str(recordRestorePointData->rp_time))));
+
+                       SetRecoveryPause(true);
+                       recoveryPausesHere(false);
+
+                       /*
+                        * If we've unpaused and there is a promotion request, 
then we've
+                        * reached our continuous recovery target and need to 
immediately
+                        * promote. We piggyback on the existing recovery 
target logic to
+                        * do this. See recoveryStopsAfter().
+                        */
+                       if (CheckForStandbyTrigger())
+                       {
+                               reachedContinuousRecoveryTarget = true;
+                               recoveryTargetAction = 
RECOVERY_TARGET_ACTION_PROMOTE;
+                       }
+               }
+       }
+}
+
 /*
  * Perform WAL recovery.
  *
@@ -1782,7 +1843,16 @@ PerformWalRecovery(void)
                         * Apply the record
                         */
                        ApplyWalRecord(xlogreader, record, &replayTLI);
+                       
+                       if (gp_pause_on_restore_point_replay)
+                               pauseRecoveryOnRestorePoint(xlogreader);
 
+                       /* Exit the recovery loop if a promotion is triggered 
in pauseRecoveryOnRestorePoint() */
+                       if (reachedContinuousRecoveryTarget && 
recoveryTargetAction == RECOVERY_TARGET_ACTION_PROMOTE){
+                               reachedRecoveryTarget = true;
+                               break;
+                       }
+                       
                        /* Exit loop if we reached inclusive recovery target */
                        if (recoveryStopsAfter(xlogreader))
                        {
@@ -2734,14 +2804,15 @@ recoveryStopsAfter(XLogReaderState *record)
         * There can be many restore points that share the same name; we stop at
         * the first one.
         */
-       if (recoveryTarget == RECOVERY_TARGET_NAME &&
+       if ((reachedContinuousRecoveryTarget || recoveryTarget == 
RECOVERY_TARGET_NAME) &&
                rmid == RM_XLOG_ID && info == XLOG_RESTORE_POINT)
        {
                xl_restore_point *recordRestorePointData;
 
                recordRestorePointData = (xl_restore_point *) 
XLogRecGetData(record);
 
-               if (strcmp(recordRestorePointData->rp_name, recoveryTargetName) 
== 0)
+               if (reachedContinuousRecoveryTarget ||
+                       strcmp(recordRestorePointData->rp_name, 
recoveryTargetName) == 0)
                {
                        recoveryStopAfter = true;
                        recoveryStopXid = InvalidTransactionId;


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to