postgres.git / summary / log / commit / refs

commit    b9784e1f769497dcfaa1f866913f3d86a2adf176
Author:   Tom Lane <tgl@sss.pgh.pa.us>
Date:     Thu May 26 14:50:30 2016 +0000

    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


src/bin/pg_dump/parallel.c | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/src/bin/pg_dump/parallel.c b/src/bin/pg_dump/parallel.c index 8184ffdf8d0..6debe9d4e5b 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 [parent: 6537a48c5521]