mirror of
https://git.postgresql.org/git/postgresql.git
synced 2025-03-07 19:47:50 +08:00
Check interrupts during logical decoding more frequently.
When reading large amounts of preexisting WAL during logical decoding using the SQL interface we possibly could fail to check interrupts in due time. Similarly the same could happen on systems with a very high WAL volume while creating a new logical replication slot, independent of the used interface. Previously these checks where only performed in xlogreader's read_page callbacks, while waiting for new WAL to be produced. That's not sufficient though, if there's never a need to wait. Walsender's send loop already contains a interrupt check. Backpatch to 9.4 where the logical decoding feature was introduced.
This commit is contained in:
parent
1c6821be31
commit
1cbc948010
@ -451,11 +451,6 @@ DecodingContextFindStartpoint(LogicalDecodingContext *ctx)
|
||||
XLogRecord *record;
|
||||
char *err = NULL;
|
||||
|
||||
/*
|
||||
* If the caller requires that interrupts be checked, the read_page
|
||||
* callback should do so, as those will often wait.
|
||||
*/
|
||||
|
||||
/* the read_page callback waits for new WAL */
|
||||
record = XLogReadRecord(ctx->reader, startptr, &err);
|
||||
if (err)
|
||||
@ -470,6 +465,8 @@ DecodingContextFindStartpoint(LogicalDecodingContext *ctx)
|
||||
/* only continue till we found a consistent spot */
|
||||
if (DecodingContextReady(ctx))
|
||||
break;
|
||||
|
||||
CHECK_FOR_INTERRUPTS();
|
||||
}
|
||||
|
||||
ctx->slot->data.confirmed_flush = ctx->reader->EndRecPtr;
|
||||
|
@ -438,6 +438,7 @@ pg_logical_slot_get_changes_guts(FunctionCallInfo fcinfo, bool confirm, bool bin
|
||||
if (upto_nchanges != 0 &&
|
||||
upto_nchanges <= p->returned_rows)
|
||||
break;
|
||||
CHECK_FOR_INTERRUPTS();
|
||||
}
|
||||
}
|
||||
PG_CATCH();
|
||||
|
Loading…
Reference in New Issue
Block a user