Skip to content

Commit 932d7bd

Browse files
committed
Add RecoveryStopsHook for extensions to handle custom WAL records
1 parent 65f77f4 commit 932d7bd

File tree

2 files changed

+33
-1
lines changed

2 files changed

+33
-1
lines changed

src/backend/access/transam/xlogrecovery.c

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2617,8 +2617,28 @@ recoveryStopsBefore(XLogReaderState *record)
26172617
return true;
26182618
}
26192619

2620+
/* Check RecoveryStopsHook for custom records */
2621+
if (RmgrIdIsCustom(XLogRecGetRmid(record)) && (RecoveryStopsBeforeHook != NULL))
2622+
{
2623+
stopsHere = RecoveryStopsBeforeHook(record, &recordXid, &recordXtime);
2624+
2625+
if (stopsHere)
2626+
{
2627+
recoveryStopAfter = false;
2628+
recoveryStopXid = recordXid;
2629+
recoveryStopLSN = InvalidXLogRecPtr;
2630+
recoveryStopTime = recordXtime;
2631+
recoveryStopName[0] = '\0';
2632+
2633+
ereport(LOG,
2634+
(errmsg("recovery stopping by hook before transaction %u, time %s",
2635+
recoveryStopXid,
2636+
timestamptz_to_str(recoveryStopTime))));
2637+
return true;
2638+
}
2639+
}
26202640
/* Otherwise we only consider stopping before COMMIT or ABORT records. */
2621-
if (XLogRecGetRmid(record) != RM_XACT_ID)
2641+
else if (XLogRecGetRmid(record) != RM_XACT_ID)
26222642
return false;
26232643

26242644
xact_info = XLogRecGetInfo(record) & XLOG_XACT_OPMASK;
@@ -4556,6 +4576,8 @@ GetXLogReplayRecPtr(TimeLineID *replayTLI)
45564576

45574577
GetReplayXlogPtrHookType GetReplayXlogPtrHook = NULL;
45584578

4579+
RecoveryStopsBeforeHookType RecoveryStopsBeforeHook = NULL;
4580+
45594581
/*
45604582
* Get effective latest redo apply position.
45614583
*

src/include/access/xlogrecovery.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,10 @@ typedef enum RecoveryPauseState
5050

5151
typedef XLogRecPtr (*GetReplayXlogPtrHookType) (void);
5252

53+
typedef bool (*RecoveryStopsBeforeHookType) (XLogReaderState *record,
54+
TransactionId *recordXid,
55+
TimestampTz *recordXtime);
56+
5357
/* User-settable GUC parameters */
5458
extern PGDLLIMPORT bool recoveryTargetInclusive;
5559
extern PGDLLIMPORT int recoveryTargetAction;
@@ -81,6 +85,12 @@ extern PGDLLIMPORT bool StandbyMode;
8185
/* Hook for extensions to tune replay xlog pointer */
8286
extern PGDLLIMPORT GetReplayXlogPtrHookType GetReplayXlogPtrHook;
8387

88+
/*
89+
* Hook for extensions to be able to decides to stop applying the WAL files
90+
* based on custom WAL records.
91+
*/
92+
extern PGDLLIMPORT RecoveryStopsBeforeHookType RecoveryStopsBeforeHook;
93+
8494
extern Size XLogRecoveryShmemSize(void);
8595
extern void XLogRecoveryShmemInit(void);
8696

0 commit comments

Comments
 (0)