diff options
author | Peter Eisentraut <peter_e@gmx.net> | 2017-06-02 14:46:00 -0400 |
---|---|---|
committer | Peter Eisentraut <peter_e@gmx.net> | 2017-06-02 14:49:23 -0400 |
commit | 9fcf670c2efdf31233d429f557ab77937f0f1e6a (patch) | |
tree | 88653233cc978f0764fec508d85fc0a3c99ccaa8 /src/backend/replication/logical/tablesync.c | |
parent | acbd8375e954774181b673a31b814e9d46f436a5 (diff) |
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>
Diffstat (limited to 'src/backend/replication/logical/tablesync.c')
-rw-r--r-- | src/backend/replication/logical/tablesync.c | 10 |
1 files changed, 4 insertions, 6 deletions
diff --git a/src/backend/replication/logical/tablesync.c b/src/backend/replication/logical/tablesync.c index 515724e1026..85e480db4bd 100644 --- a/src/backend/replication/logical/tablesync.c +++ b/src/backend/replication/logical/tablesync.c @@ -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; } |