summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane2016-05-26 14:50:30 +0000
committerTom Lane2016-05-26 14:50:42 +0000
commitd32bc204c733276810a400db41f64f32c489733f (patch)
tree59ebdb4ca42ad52c4d0c06e23602d1bea4cb3142
parent7a0f09da7dc3378130547c81e47b9c96bcfd0634 (diff)
In Windows pg_dump, ensure idle workers will shut down during error exit.
The Windows coding of ShutdownWorkersHard() thought that setting termEvent was sufficient to make workers exit after an error. But that only helps if a worker is busy and passes through checkAborting(). An idle worker will just sit, resulting in pg_dump failing to exit until the user gives up and hits control-C. We should close the write end of the command pipe so that idle workers will see socket EOF and exit, as the Unix coding was already doing. Back-patch to 9.3 where parallel pg_dump was introduced. Kyotaro Horiguchi
-rw-r--r--src/bin/pg_dump/parallel.c14
1 files changed, 6 insertions, 8 deletions
diff --git a/src/bin/pg_dump/parallel.c b/src/bin/pg_dump/parallel.c
index fb4a57f46a4..4bf3219742b 100644
--- a/src/bin/pg_dump/parallel.c
+++ b/src/bin/pg_dump/parallel.c
@@ -301,28 +301,26 @@ checkAborting(ArchiveHandle *AH)
}
/*
- * Shut down any remaining workers, this has an implicit do_wait == true.
- *
- * The fastest way we can make the workers terminate gracefully is when
- * they are listening for new commands and we just tell them to terminate.
+ * Shut down any remaining workers, waiting for them to finish.
*/
static void
ShutdownWorkersHard(ParallelState *pstate)
{
-#ifndef WIN32
int i;
/*
- * Close our write end of the sockets so that the workers know they can
- * exit.
+ * Close our write end of the sockets so that any workers waiting for
+ * commands know they can exit.
*/
for (i = 0; i < pstate->numWorkers; i++)
closesocket(pstate->parallelSlot[i].pipeWrite);
+#ifndef WIN32
+ /* On non-Windows, send SIGTERM to abort commands-in-progress. */
for (i = 0; i < pstate->numWorkers; i++)
kill(pstate->parallelSlot[i].pid, SIGTERM);
#else
- /* The workers monitor this event via checkAborting(). */
+ /* Non-idle workers monitor this event via checkAborting(). */
SetEvent(termEvent);
#endif