mirror of
https://github.com/postgres/postgres.git
synced 2025-07-15 19:21:59 +03:00
Fix signal handling in logical replication workers
The logical replication worker processes now use the normal die() handler for SIGTERM and CHECK_FOR_INTERRUPTS() instead of custom code. One problem before was that the apply worker would not exit promptly when a subscription was dropped, which could lead to deadlocks. Author: Petr Jelinek <petr.jelinek@2ndquadrant.com> Reported-by: Masahiko Sawada <sawada.mshk@gmail.com>
This commit is contained in:
@ -154,10 +154,12 @@ wait_for_sync_status_change(Oid relid, char origstate)
|
||||
int rc;
|
||||
char state = origstate;
|
||||
|
||||
while (!got_SIGTERM)
|
||||
for (;;)
|
||||
{
|
||||
LogicalRepWorker *worker;
|
||||
|
||||
CHECK_FOR_INTERRUPTS();
|
||||
|
||||
LWLockAcquire(LogicalRepWorkerLock, LW_SHARED);
|
||||
worker = logicalrep_worker_find(MyLogicalRepWorker->subid,
|
||||
relid, false);
|
||||
@ -525,7 +527,7 @@ copy_read_data(void *outbuf, int minread, int maxread)
|
||||
bytesread += avail;
|
||||
}
|
||||
|
||||
while (!got_SIGTERM && maxread > 0 && bytesread < minread)
|
||||
while (maxread > 0 && bytesread < minread)
|
||||
{
|
||||
pgsocket fd = PGINVALID_SOCKET;
|
||||
int rc;
|
||||
@ -579,10 +581,6 @@ copy_read_data(void *outbuf, int minread, int maxread)
|
||||
ResetLatch(&MyProc->procLatch);
|
||||
}
|
||||
|
||||
/* Check for exit condition. */
|
||||
if (got_SIGTERM)
|
||||
proc_exit(0);
|
||||
|
||||
return bytesread;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user