Remove sketchy TerminateThread() call on Ctrl-C on Windows

When pg_dump or pg_restore --jobs N is interrupted with Ctrl-C on
Windows, we cancel all queries, but we don't want the cancellations to
be reported as errors to the user in the short time before the whole
process exits. That was previously achieved by calling
TerminateThread() on each worker thread before sending the cancel
message, but that doesn't appear to be 100% safe: the implementations
of write() and the socket calls inside PQcancel() might acquire user
space locks that were held by the terminated threads.  (write()
certainly does that.)

Instead of silencing the threads in such a sketchy way this now sets a
volatile flag before sending any cancel requests that tells the
threads to not log errors anymore. (Instead of a volatile, it would be
better to use an atomic operation here, but that has to wait until we
add support for atomics on the frontend.)

Note that this also stops using pg_fatal() and exit to exit() from
workers on failure and instead use pg_log_error combined with
exit_nicely. If a query fails in a worker we want it to kill the
worker not the whole process. On Unix that's currently the same thing,
but on Windows workers are threads.

Author: Jelte Fennema-Nio <[email protected]>
Reviewed-by: Bryan Green <[email protected]>
Reviewed-by: Thomas Munro <[email protected]>
Discussion: 
https://www.postgresql.org/message-id/[email protected]

Branch
------
master

Details
-------
https://git.postgresql.org/pg/commitdiff/ad7877b00a4232d71bb4cb63c22f9d748e65e3f7

Modified Files
--------------
src/bin/pg_dump/parallel.c           | 50 ++++++++++++--------------
src/bin/pg_dump/pg_backup_archiver.c | 69 +++++++++++++++++++-----------------
src/bin/pg_dump/pg_backup_db.c       | 30 +++++++++++-----
src/bin/pg_dump/pg_backup_utils.c    | 38 ++++++++++++++++++++
src/bin/pg_dump/pg_backup_utils.h    | 21 +++++++++++
5 files changed, 141 insertions(+), 67 deletions(-)

Reply via email to