mirror of
https://github.com/postgres/postgres.git
synced 2025-10-29 22:49:41 +03:00
Add worker type argument to logical replication worker functions.
Extend logicalrep_worker_stop, logicalrep_worker_wakeup, and logicalrep_worker_find to accept a worker type argument. This change enables differentiation between logical replication worker types, such as apply workers and table sync workers. While preserving existing behavior, it lays the groundwork for upcoming patch to add sequence synchronization workers. Author: Vignesh C <vignesh21@gmail.com> Reviewed-by: shveta malik <shveta.malik@gmail.com> Reviewed-by: Peter Smith <smithpb2250@gmail.com> Reviewed-by: Chao Li <li.evan.chao@gmail.com> Reviewed-by: Hayato Kuroda <kuroda.hayato@fujitsu.com> Reviewed-by: Amit Kapila <amit.kapila16@gmail.com> Discussion: https://postgr.es/m/CAA4eK1LC+KJiAkSrpE_NwvNdidw9F2os7GERUeSxSKv71gXysQ@mail.gmail.com
This commit is contained in:
@@ -1082,7 +1082,7 @@ AlterSubscription_refresh(Subscription *sub, bool copy_data,
|
|||||||
|
|
||||||
sub_remove_rels = lappend(sub_remove_rels, remove_rel);
|
sub_remove_rels = lappend(sub_remove_rels, remove_rel);
|
||||||
|
|
||||||
logicalrep_worker_stop(sub->oid, relid);
|
logicalrep_worker_stop(WORKERTYPE_TABLESYNC, sub->oid, relid);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* For READY state, we would have already dropped the
|
* For READY state, we would have already dropped the
|
||||||
@@ -2134,7 +2134,7 @@ DropSubscription(DropSubscriptionStmt *stmt, bool isTopLevel)
|
|||||||
{
|
{
|
||||||
LogicalRepWorker *w = (LogicalRepWorker *) lfirst(lc);
|
LogicalRepWorker *w = (LogicalRepWorker *) lfirst(lc);
|
||||||
|
|
||||||
logicalrep_worker_stop(w->subid, w->relid);
|
logicalrep_worker_stop(w->type, w->subid, w->relid);
|
||||||
}
|
}
|
||||||
list_free(subworkers);
|
list_free(subworkers);
|
||||||
|
|
||||||
|
|||||||
@@ -245,20 +245,25 @@ WaitForReplicationWorkerAttach(LogicalRepWorker *worker,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Walks the workers array and searches for one that matches given
|
* Walks the workers array and searches for one that matches given worker type,
|
||||||
* subscription id and relid.
|
* subscription id, and relation id.
|
||||||
*
|
*
|
||||||
* We are only interested in the leader apply worker or table sync worker.
|
* For apply workers, the relid should be set to InvalidOid, as they manage
|
||||||
|
* changes across all tables. For table sync workers, the relid should be set
|
||||||
|
* to the OID of the relation being synchronized.
|
||||||
*/
|
*/
|
||||||
LogicalRepWorker *
|
LogicalRepWorker *
|
||||||
logicalrep_worker_find(Oid subid, Oid relid, bool only_running)
|
logicalrep_worker_find(LogicalRepWorkerType wtype, Oid subid, Oid relid,
|
||||||
|
bool only_running)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
LogicalRepWorker *res = NULL;
|
LogicalRepWorker *res = NULL;
|
||||||
|
|
||||||
|
/* relid must be valid only for table sync workers */
|
||||||
|
Assert((wtype == WORKERTYPE_TABLESYNC) == OidIsValid(relid));
|
||||||
Assert(LWLockHeldByMe(LogicalRepWorkerLock));
|
Assert(LWLockHeldByMe(LogicalRepWorkerLock));
|
||||||
|
|
||||||
/* Search for attached worker for a given subscription id. */
|
/* Search for an attached worker that matches the specified criteria. */
|
||||||
for (i = 0; i < max_logical_replication_workers; i++)
|
for (i = 0; i < max_logical_replication_workers; i++)
|
||||||
{
|
{
|
||||||
LogicalRepWorker *w = &LogicalRepCtx->workers[i];
|
LogicalRepWorker *w = &LogicalRepCtx->workers[i];
|
||||||
@@ -268,7 +273,7 @@ logicalrep_worker_find(Oid subid, Oid relid, bool only_running)
|
|||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (w->in_use && w->subid == subid && w->relid == relid &&
|
if (w->in_use && w->subid == subid && w->relid == relid &&
|
||||||
(!only_running || w->proc))
|
w->type == wtype && (!only_running || w->proc))
|
||||||
{
|
{
|
||||||
res = w;
|
res = w;
|
||||||
break;
|
break;
|
||||||
@@ -627,16 +632,20 @@ logicalrep_worker_stop_internal(LogicalRepWorker *worker, int signo)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Stop the logical replication worker for subid/relid, if any.
|
* Stop the logical replication worker that matches the specified worker type,
|
||||||
|
* subscription id, and relation id.
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
logicalrep_worker_stop(Oid subid, Oid relid)
|
logicalrep_worker_stop(LogicalRepWorkerType wtype, Oid subid, Oid relid)
|
||||||
{
|
{
|
||||||
LogicalRepWorker *worker;
|
LogicalRepWorker *worker;
|
||||||
|
|
||||||
|
/* relid must be valid only for table sync workers */
|
||||||
|
Assert((wtype == WORKERTYPE_TABLESYNC) == OidIsValid(relid));
|
||||||
|
|
||||||
LWLockAcquire(LogicalRepWorkerLock, LW_SHARED);
|
LWLockAcquire(LogicalRepWorkerLock, LW_SHARED);
|
||||||
|
|
||||||
worker = logicalrep_worker_find(subid, relid, false);
|
worker = logicalrep_worker_find(wtype, subid, relid, false);
|
||||||
|
|
||||||
if (worker)
|
if (worker)
|
||||||
{
|
{
|
||||||
@@ -694,16 +703,20 @@ logicalrep_pa_worker_stop(ParallelApplyWorkerInfo *winfo)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Wake up (using latch) any logical replication worker for specified sub/rel.
|
* Wake up (using latch) any logical replication worker that matches the
|
||||||
|
* specified worker type, subscription id, and relation id.
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
logicalrep_worker_wakeup(Oid subid, Oid relid)
|
logicalrep_worker_wakeup(LogicalRepWorkerType wtype, Oid subid, Oid relid)
|
||||||
{
|
{
|
||||||
LogicalRepWorker *worker;
|
LogicalRepWorker *worker;
|
||||||
|
|
||||||
|
/* relid must be valid only for table sync workers */
|
||||||
|
Assert((wtype == WORKERTYPE_TABLESYNC) == OidIsValid(relid));
|
||||||
|
|
||||||
LWLockAcquire(LogicalRepWorkerLock, LW_SHARED);
|
LWLockAcquire(LogicalRepWorkerLock, LW_SHARED);
|
||||||
|
|
||||||
worker = logicalrep_worker_find(subid, relid, true);
|
worker = logicalrep_worker_find(wtype, subid, relid, true);
|
||||||
|
|
||||||
if (worker)
|
if (worker)
|
||||||
logicalrep_worker_wakeup_ptr(worker);
|
logicalrep_worker_wakeup_ptr(worker);
|
||||||
@@ -1260,7 +1273,8 @@ ApplyLauncherMain(Datum main_arg)
|
|||||||
continue;
|
continue;
|
||||||
|
|
||||||
LWLockAcquire(LogicalRepWorkerLock, LW_SHARED);
|
LWLockAcquire(LogicalRepWorkerLock, LW_SHARED);
|
||||||
w = logicalrep_worker_find(sub->oid, InvalidOid, false);
|
w = logicalrep_worker_find(WORKERTYPE_APPLY, sub->oid, InvalidOid,
|
||||||
|
false);
|
||||||
|
|
||||||
if (w != NULL)
|
if (w != NULL)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -69,7 +69,8 @@ FinishSyncWorker(void)
|
|||||||
CommitTransactionCommand();
|
CommitTransactionCommand();
|
||||||
|
|
||||||
/* Find the leader apply worker and signal it. */
|
/* Find the leader apply worker and signal it. */
|
||||||
logicalrep_worker_wakeup(MyLogicalRepWorker->subid, InvalidOid);
|
logicalrep_worker_wakeup(WORKERTYPE_APPLY, MyLogicalRepWorker->subid,
|
||||||
|
InvalidOid);
|
||||||
|
|
||||||
/* Stop gracefully */
|
/* Stop gracefully */
|
||||||
proc_exit(0);
|
proc_exit(0);
|
||||||
|
|||||||
@@ -160,7 +160,8 @@ wait_for_table_state_change(Oid relid, char expected_state)
|
|||||||
|
|
||||||
/* Check if the sync worker is still running and bail if not. */
|
/* Check if the sync worker is still running and bail if not. */
|
||||||
LWLockAcquire(LogicalRepWorkerLock, LW_SHARED);
|
LWLockAcquire(LogicalRepWorkerLock, LW_SHARED);
|
||||||
worker = logicalrep_worker_find(MyLogicalRepWorker->subid, relid,
|
worker = logicalrep_worker_find(WORKERTYPE_TABLESYNC,
|
||||||
|
MyLogicalRepWorker->subid, relid,
|
||||||
false);
|
false);
|
||||||
LWLockRelease(LogicalRepWorkerLock);
|
LWLockRelease(LogicalRepWorkerLock);
|
||||||
if (!worker)
|
if (!worker)
|
||||||
@@ -207,8 +208,9 @@ wait_for_worker_state_change(char expected_state)
|
|||||||
* waiting.
|
* waiting.
|
||||||
*/
|
*/
|
||||||
LWLockAcquire(LogicalRepWorkerLock, LW_SHARED);
|
LWLockAcquire(LogicalRepWorkerLock, LW_SHARED);
|
||||||
worker = logicalrep_worker_find(MyLogicalRepWorker->subid,
|
worker = logicalrep_worker_find(WORKERTYPE_APPLY,
|
||||||
InvalidOid, false);
|
MyLogicalRepWorker->subid, InvalidOid,
|
||||||
|
false);
|
||||||
if (worker && worker->proc)
|
if (worker && worker->proc)
|
||||||
logicalrep_worker_wakeup_ptr(worker);
|
logicalrep_worker_wakeup_ptr(worker);
|
||||||
LWLockRelease(LogicalRepWorkerLock);
|
LWLockRelease(LogicalRepWorkerLock);
|
||||||
@@ -476,7 +478,8 @@ ProcessSyncingTablesForApply(XLogRecPtr current_lsn)
|
|||||||
*/
|
*/
|
||||||
LWLockAcquire(LogicalRepWorkerLock, LW_SHARED);
|
LWLockAcquire(LogicalRepWorkerLock, LW_SHARED);
|
||||||
|
|
||||||
syncworker = logicalrep_worker_find(MyLogicalRepWorker->subid,
|
syncworker = logicalrep_worker_find(WORKERTYPE_TABLESYNC,
|
||||||
|
MyLogicalRepWorker->subid,
|
||||||
rstate->relid, false);
|
rstate->relid, false);
|
||||||
|
|
||||||
if (syncworker)
|
if (syncworker)
|
||||||
|
|||||||
@@ -1817,7 +1817,8 @@ apply_handle_stream_start(StringInfo s)
|
|||||||
* Signal the leader apply worker, as it may be waiting for
|
* Signal the leader apply worker, as it may be waiting for
|
||||||
* us.
|
* us.
|
||||||
*/
|
*/
|
||||||
logicalrep_worker_wakeup(MyLogicalRepWorker->subid, InvalidOid);
|
logicalrep_worker_wakeup(WORKERTYPE_APPLY,
|
||||||
|
MyLogicalRepWorker->subid, InvalidOid);
|
||||||
}
|
}
|
||||||
|
|
||||||
parallel_stream_nchanges = 0;
|
parallel_stream_nchanges = 0;
|
||||||
@@ -3284,8 +3285,9 @@ FindDeletedTupleInLocalRel(Relation localrel, Oid localidxoid,
|
|||||||
* maybe_advance_nonremovable_xid() for details).
|
* maybe_advance_nonremovable_xid() for details).
|
||||||
*/
|
*/
|
||||||
LWLockAcquire(LogicalRepWorkerLock, LW_SHARED);
|
LWLockAcquire(LogicalRepWorkerLock, LW_SHARED);
|
||||||
leader = logicalrep_worker_find(MyLogicalRepWorker->subid,
|
leader = logicalrep_worker_find(WORKERTYPE_APPLY,
|
||||||
InvalidOid, false);
|
MyLogicalRepWorker->subid, InvalidOid,
|
||||||
|
false);
|
||||||
if (!leader)
|
if (!leader)
|
||||||
{
|
{
|
||||||
ereport(ERROR,
|
ereport(ERROR,
|
||||||
|
|||||||
@@ -254,7 +254,8 @@ extern PGDLLIMPORT bool InitializingApplyWorker;
|
|||||||
extern PGDLLIMPORT List *table_states_not_ready;
|
extern PGDLLIMPORT List *table_states_not_ready;
|
||||||
|
|
||||||
extern void logicalrep_worker_attach(int slot);
|
extern void logicalrep_worker_attach(int slot);
|
||||||
extern LogicalRepWorker *logicalrep_worker_find(Oid subid, Oid relid,
|
extern LogicalRepWorker *logicalrep_worker_find(LogicalRepWorkerType wtype,
|
||||||
|
Oid subid, Oid relid,
|
||||||
bool only_running);
|
bool only_running);
|
||||||
extern List *logicalrep_workers_find(Oid subid, bool only_running,
|
extern List *logicalrep_workers_find(Oid subid, bool only_running,
|
||||||
bool acquire_lock);
|
bool acquire_lock);
|
||||||
@@ -263,9 +264,11 @@ extern bool logicalrep_worker_launch(LogicalRepWorkerType wtype,
|
|||||||
Oid userid, Oid relid,
|
Oid userid, Oid relid,
|
||||||
dsm_handle subworker_dsm,
|
dsm_handle subworker_dsm,
|
||||||
bool retain_dead_tuples);
|
bool retain_dead_tuples);
|
||||||
extern void logicalrep_worker_stop(Oid subid, Oid relid);
|
extern void logicalrep_worker_stop(LogicalRepWorkerType wtype, Oid subid,
|
||||||
|
Oid relid);
|
||||||
extern void logicalrep_pa_worker_stop(ParallelApplyWorkerInfo *winfo);
|
extern void logicalrep_pa_worker_stop(ParallelApplyWorkerInfo *winfo);
|
||||||
extern void logicalrep_worker_wakeup(Oid subid, Oid relid);
|
extern void logicalrep_worker_wakeup(LogicalRepWorkerType wtype, Oid subid,
|
||||||
|
Oid relid);
|
||||||
extern void logicalrep_worker_wakeup_ptr(LogicalRepWorker *worker);
|
extern void logicalrep_worker_wakeup_ptr(LogicalRepWorker *worker);
|
||||||
|
|
||||||
extern int logicalrep_sync_worker_count(Oid subid);
|
extern int logicalrep_sync_worker_count(Oid subid);
|
||||||
|
|||||||
Reference in New Issue
Block a user