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:
@@ -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));
|
||||
}
|
||||
|
||||
@@ -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
|
||||
*
|
||||
|
||||
Reference in New Issue
Block a user