Skip to content

Commit 43a87d3

Browse files
committed
Add RecoveryStopsHook for extensions to handle custom WAL records
1 parent a421a58 commit 43a87d3

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
@@ -2567,8 +2567,28 @@ recoveryStopsBefore(XLogReaderState *record)
25672567
return true;
25682568
}
25692569

2570+
/* Check RecoveryStopsHook for custom records */
2571+
if (RmgrIdIsCustom(XLogRecGetRmid(record)) && (RecoveryStopsBeforeHook != NULL))
2572+
{
2573+
stopsHere = RecoveryStopsBeforeHook(record, &recordXid, &recordXtime);
2574+
2575+
if (stopsHere)
2576+
{
2577+
recoveryStopAfter = false;
2578+
recoveryStopXid = recordXid;
2579+
recoveryStopLSN = InvalidXLogRecPtr;
2580+
recoveryStopTime = recordXtime;
2581+
recoveryStopName[0] = '\0';
2582+
2583+
ereport(LOG,
2584+
(errmsg("recovery stopping by hook before transaction %u, time %s",
2585+
recoveryStopXid,
2586+
timestamptz_to_str(recoveryStopTime))));
2587+
return true;
2588+
}
2589+
}
25702590
/* Otherwise we only consider stopping before COMMIT or ABORT records. */
2571-
if (XLogRecGetRmid(record) != RM_XACT_ID)
2591+
else if (XLogRecGetRmid(record) != RM_XACT_ID)
25722592
return false;
25732593

25742594
xact_info = XLogRecGetInfo(record) & XLOG_XACT_OPMASK;
@@ -4506,6 +4526,8 @@ GetXLogReplayRecPtr(TimeLineID *replayTLI)
45064526

45074527
GetReplayXlogPtrHookType GetReplayXlogPtrHook = NULL;
45084528

4529+
RecoveryStopsBeforeHookType RecoveryStopsBeforeHook = NULL;
4530+
45094531
/*
45104532
* Get effective latest redo apply position.
45114533
*

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)