mirror of
https://github.com/postgres/postgres.git
synced 2025-10-19 15:49:24 +03:00
Wake up a subscription's replication worker processes after DDL.
Waken related worker processes immediately at commit of a transaction that has performed ALTER SUBSCRIPTION (including the RENAME and OWNER variants). This reduces the response time for such operations. In the real world that might not be worth much, but it shaves several seconds off the runtime for the subscription test suite. In the case of PREPARE, we just throw away this notification state; it doesn't seem worth the work to preserve it. The workers will still react after the eventual COMMIT PREPARED, but not as quickly. Nathan Bossart Discussion: https://postgr.es/m/20221122004119.GA132961@nathanxps13
This commit is contained in:
@@ -254,6 +254,8 @@ WalReceiverConn *LogRepWorkerWalRcvConn = NULL;
|
||||
Subscription *MySubscription = NULL;
|
||||
static bool MySubscriptionValid = false;
|
||||
|
||||
static List *on_commit_wakeup_workers_subids = NIL;
|
||||
|
||||
bool in_remote_transaction = false;
|
||||
static XLogRecPtr remote_final_lsn = InvalidXLogRecPtr;
|
||||
|
||||
@@ -4092,3 +4094,53 @@ reset_apply_error_context_info(void)
|
||||
apply_error_callback_arg.remote_attnum = -1;
|
||||
set_apply_error_context_xact(InvalidTransactionId, InvalidXLogRecPtr);
|
||||
}
|
||||
|
||||
/*
|
||||
* Request wakeup of the workers for the given subscription OID
|
||||
* at commit of the current transaction.
|
||||
*
|
||||
* This is used to ensure that the workers process assorted changes
|
||||
* as soon as possible.
|
||||
*/
|
||||
void
|
||||
LogicalRepWorkersWakeupAtCommit(Oid subid)
|
||||
{
|
||||
MemoryContext oldcxt;
|
||||
|
||||
oldcxt = MemoryContextSwitchTo(TopTransactionContext);
|
||||
on_commit_wakeup_workers_subids =
|
||||
list_append_unique_oid(on_commit_wakeup_workers_subids, subid);
|
||||
MemoryContextSwitchTo(oldcxt);
|
||||
}
|
||||
|
||||
/*
|
||||
* Wake up the workers of any subscriptions that were changed in this xact.
|
||||
*/
|
||||
void
|
||||
AtEOXact_LogicalRepWorkers(bool isCommit)
|
||||
{
|
||||
if (isCommit && on_commit_wakeup_workers_subids != NIL)
|
||||
{
|
||||
ListCell *lc;
|
||||
|
||||
LWLockAcquire(LogicalRepWorkerLock, LW_SHARED);
|
||||
foreach(lc, on_commit_wakeup_workers_subids)
|
||||
{
|
||||
Oid subid = lfirst_oid(lc);
|
||||
List *workers;
|
||||
ListCell *lc2;
|
||||
|
||||
workers = logicalrep_workers_find(subid, true);
|
||||
foreach(lc2, workers)
|
||||
{
|
||||
LogicalRepWorker *worker = (LogicalRepWorker *) lfirst(lc2);
|
||||
|
||||
logicalrep_worker_wakeup_ptr(worker);
|
||||
}
|
||||
}
|
||||
LWLockRelease(LogicalRepWorkerLock);
|
||||
}
|
||||
|
||||
/* The List storage will be reclaimed automatically in xact cleanup. */
|
||||
on_commit_wakeup_workers_subids = NIL;
|
||||
}
|
||||
|
Reference in New Issue
Block a user