Make tablesync worker exit when apply dies while it was waiting for it

This avoids "orphaned" sync workers.

This was caused by a thinko in wait_for_sync_status_change.

Author: Petr Jelinek <petr.jelinek@2ndquadrant.com>
Reported-by: Masahiko Sawada <sawada.mshk@gmail.com>
This commit is contained in:
Peter Eisentraut 2017-06-03 09:18:52 -04:00
parent 34aebcf42a
commit 3c9bc2157a
1 changed files with 21 additions and 3 deletions

View File

@ -146,7 +146,12 @@ finish_sync_worker(void)
/*
* Wait until the table synchronization change.
*
* Returns false if the relation subscription state disappeared.
* If called from apply worker, it will wait for the synchronization worker to
* change table state in shmem. If called from synchronization worker, it
* will wait for apply worker to change table state in shmem.
*
* Returns false if the opposite worker has disappeared or the table state has
* been reset.
*/
static bool
wait_for_sync_status_change(Oid relid, char origstate)
@ -161,14 +166,27 @@ wait_for_sync_status_change(Oid relid, char origstate)
CHECK_FOR_INTERRUPTS();
LWLockAcquire(LogicalRepWorkerLock, LW_SHARED);
/* Check if the opposite worker is still running and bail if not. */
worker = logicalrep_worker_find(MyLogicalRepWorker->subid,
relid, false);
am_tablesync_worker() ? InvalidOid : relid,
false);
if (!worker)
{
LWLockRelease(LogicalRepWorkerLock);
return false;
}
/*
* If I'm the synchronization worker, look at my own state. Otherwise
* look at the state of the synchronization worker we found above.
*/
if (am_tablesync_worker())
worker = MyLogicalRepWorker;
Assert(worker->relid == relid);
state = worker->relstate;
LWLockRelease(LogicalRepWorkerLock);
if (state == SUBREL_STATE_UNKNOWN)
@ -179,7 +197,7 @@ wait_for_sync_status_change(Oid relid, char origstate)
rc = WaitLatch(&MyProc->procLatch,
WL_LATCH_SET | WL_TIMEOUT | WL_POSTMASTER_DEATH,
10000L, WAIT_EVENT_LOGICAL_SYNC_STATE_CHANGE);
1000L, WAIT_EVENT_LOGICAL_SYNC_STATE_CHANGE);
/* emergency bailout if postmaster has died */
if (rc & WL_POSTMASTER_DEATH)