mirror of
https://github.com/postgres/postgres.git
synced 2025-06-13 07:41:39 +03:00
Drop replication origin slots before tablesync worker exits.
Currently, the replication origin tracking of the tablesync worker is dropped by the apply worker. So, there will be a small lag between the tablesync worker exit and its origin tracking got removed. In the meantime, new tablesync workers can be launched and will try to set up a new origin tracking. This can lead the system to reach max configured limit (max_replication_slots) even if the user has configured the max limit considering the number of tablesync workers required in the system. We decided not to back-patch as this can occur in very narrow circumstances and users have to option to increase the configured limit by increasing max_replication_slots. Reported-by: Hubert Depesz Lubaczewski Author: Ajin Cherian Reviwed-by: Masahiko Sawada, Peter Smith, Hou Zhijie, Amit Kapila Discussion: https://postgr.es/m/20220714115155.GA5439@depesz.com
This commit is contained in:
@ -919,10 +919,10 @@ AlterSubscription_refresh(Subscription *sub, bool copy_data,
|
||||
logicalrep_worker_stop(sub->oid, relid);
|
||||
|
||||
/*
|
||||
* For READY state, we would have already dropped the
|
||||
* tablesync origin.
|
||||
* For READY state and SYNCDONE state, we would have already
|
||||
* dropped the tablesync origin.
|
||||
*/
|
||||
if (state != SUBREL_STATE_READY)
|
||||
if (state != SUBREL_STATE_READY && state != SUBREL_STATE_SYNCDONE)
|
||||
{
|
||||
char originname[NAMEDATALEN];
|
||||
|
||||
@ -930,11 +930,8 @@ AlterSubscription_refresh(Subscription *sub, bool copy_data,
|
||||
* Drop the tablesync's origin tracking if exists.
|
||||
*
|
||||
* It is possible that the origin is not yet created for
|
||||
* tablesync worker, this can happen for the states before
|
||||
* SUBREL_STATE_FINISHEDCOPY. The apply worker can also
|
||||
* concurrently try to drop the origin and by this time
|
||||
* the origin might be already removed. For these reasons,
|
||||
* passing missing_ok = true.
|
||||
* tablesync worker so passing missing_ok = true. This can
|
||||
* happen for the states before SUBREL_STATE_FINISHEDCOPY.
|
||||
*/
|
||||
ReplicationOriginNameForTablesync(sub->oid, relid, originname,
|
||||
sizeof(originname));
|
||||
@ -1507,13 +1504,19 @@ DropSubscription(DropSubscriptionStmt *stmt, bool isTopLevel)
|
||||
/*
|
||||
* Drop the tablesync's origin tracking if exists.
|
||||
*
|
||||
* For SYNCDONE/READY states, the tablesync origin tracking is known
|
||||
* to have already been dropped by the tablesync worker.
|
||||
*
|
||||
* It is possible that the origin is not yet created for tablesync
|
||||
* worker so passing missing_ok = true. This can happen for the states
|
||||
* before SUBREL_STATE_FINISHEDCOPY.
|
||||
*/
|
||||
ReplicationOriginNameForTablesync(subid, relid, originname,
|
||||
sizeof(originname));
|
||||
replorigin_drop_by_name(originname, true, false);
|
||||
if (rstate->state != SUBREL_STATE_SYNCDONE)
|
||||
{
|
||||
ReplicationOriginNameForTablesync(subid, relid, originname,
|
||||
sizeof(originname));
|
||||
replorigin_drop_by_name(originname, true, false);
|
||||
}
|
||||
}
|
||||
|
||||
/* Clean up dependencies */
|
||||
|
Reference in New Issue
Block a user