1
0
mirror of https://github.com/postgres/postgres.git synced 2025-11-22 12:22:45 +03:00

Add 'no_error' argument to pg_wal_replay_wait()

This argument allow skipping throwing an error.  Instead, the result status
can be obtained using pg_wal_replay_wait_status() function.

Catversion is bumped.

Reported-by: Michael Paquier
Discussion: https://postgr.es/m/ZtUF17gF0pNpwZDI%40paquier.xyz
Reviewed-by: Pavel Borisov
This commit is contained in:
Alexander Korotkov
2024-10-24 14:40:23 +03:00
parent 73da6b8d1b
commit e546989a26
7 changed files with 118 additions and 14 deletions

View File

@@ -751,15 +751,18 @@ pg_promote(PG_FUNCTION_ARGS)
PG_RETURN_BOOL(false);
}
static WaitLSNResult lastWaitLSNResult = WAIT_LSN_RESULT_SUCCESS;
/*
* Waits until recovery replays the target LSN with optional timeout.
* Waits until recovery replays the target LSN with optional timeout. Unless
* 'no_error' provided throws an error on failure
*/
Datum
pg_wal_replay_wait(PG_FUNCTION_ARGS)
{
XLogRecPtr target_lsn = PG_GETARG_LSN(0);
int64 timeout = PG_GETARG_INT64(1);
WaitLSNResult result;
bool no_error = PG_GETARG_BOOL(2);
if (timeout < 0)
ereport(ERROR,
@@ -800,13 +803,16 @@ pg_wal_replay_wait(PG_FUNCTION_ARGS)
*/
Assert(MyProc->xmin == InvalidTransactionId);
result = WaitForLSNReplay(target_lsn, timeout);
lastWaitLSNResult = WaitForLSNReplay(target_lsn, timeout);
if (no_error)
PG_RETURN_VOID();
/*
* Process the result of WaitForLSNReplay(). Throw appropriate error if
* needed.
*/
switch (result)
switch (lastWaitLSNResult)
{
case WAIT_LSN_RESULT_SUCCESS:
/* Nothing to do on success */
@@ -832,3 +838,27 @@ pg_wal_replay_wait(PG_FUNCTION_ARGS)
PG_RETURN_VOID();
}
Datum
pg_wal_replay_wait_status(PG_FUNCTION_ARGS)
{
const char *result_string = "";
/* Process the result of WaitForLSNReplay(). */
switch (lastWaitLSNResult)
{
case WAIT_LSN_RESULT_SUCCESS:
result_string = "success";
break;
case WAIT_LSN_RESULT_TIMEOUT:
result_string = "timeout";
break;
case WAIT_LSN_RESULT_NOT_IN_RECOVERY:
result_string = "not in recovery";
break;
}
PG_RETURN_TEXT_P(cstring_to_text(result_string));
}

View File

@@ -2,7 +2,8 @@
*
* xlogwait.c
* Implements waiting for the given replay LSN, which is used in
* CALL pg_wal_replay_wait(target_lsn pg_lsn, timeout float8).
* CALL pg_wal_replay_wait(target_lsn pg_lsn,
* timeout float8, no_error bool).
*
* Copyright (c) 2024, PostgreSQL Global Development Group
*

View File

@@ -414,7 +414,9 @@ CREATE OR REPLACE FUNCTION
json_populate_recordset(base anyelement, from_json json, use_json_as_text boolean DEFAULT false)
RETURNS SETOF anyelement LANGUAGE internal STABLE ROWS 100 AS 'json_populate_recordset' PARALLEL SAFE;
CREATE OR REPLACE PROCEDURE pg_wal_replay_wait(target_lsn pg_lsn, timeout int8 DEFAULT 0)
CREATE OR REPLACE PROCEDURE pg_wal_replay_wait(target_lsn pg_lsn,
timeout int8 DEFAULT 0,
no_error bool DEFAULT false)
LANGUAGE internal AS 'pg_wal_replay_wait';
CREATE OR REPLACE FUNCTION pg_logical_slot_get_changes(