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(-)
