From 78d551ec7e5151dceee2d182a8f258fdc4b59554 Mon Sep 17 00:00:00 2001 From: Michael Banck Date: Thu, 28 Mar 2019 10:57:11 +0100 Subject: [PATCH 2/2] Support toggling of pg_checksums progress reporting via SIGUSR1. This feature does not work on Windows. Author: Bernd Helmle, Michael Banck Reviewed-by: Fabien Coelho, Alvaro Herrera, Michael Paquier, Kyotaro HORIGUCHI --- doc/src/sgml/ref/pg_checksums.sgml | 4 ++- src/bin/pg_checksums/pg_checksums.c | 51 +++++++++++++++++++++++++++---------- 2 files changed, 40 insertions(+), 15 deletions(-) diff --git a/doc/src/sgml/ref/pg_checksums.sgml b/doc/src/sgml/ref/pg_checksums.sgml index 0934426e58..9f5cbc79ff 100644 --- a/doc/src/sgml/ref/pg_checksums.sgml +++ b/doc/src/sgml/ref/pg_checksums.sgml @@ -141,7 +141,9 @@ PostgreSQL documentation Enable progress reporting. Turning this on will deliver a progress - report while checking or enabling checksums. + report while checking or enabling checksums. Sending the + SIGUSR1 signal will toggle progress reporting + on or off during the verification run (not available on Windows). diff --git a/src/bin/pg_checksums/pg_checksums.c b/src/bin/pg_checksums/pg_checksums.c index d09cf8068d..bc7f29c3c4 100644 --- a/src/bin/pg_checksums/pg_checksums.c +++ b/src/bin/pg_checksums/pg_checksums.c @@ -15,6 +15,7 @@ #include "postgres_fe.h" #include +#include #include #include #include @@ -109,6 +110,23 @@ static const char *const skip[] = { NULL, }; +static void +toggle_progress_report(int signum) +{ + + /* we handle SIGUSR1 only, and toggle the value of show_progress */ + if (signum == SIGUSR1) + { + /* + * Skip to the next line in order to avoid overwriting half of + * the progress report line with the final output. + */ + if (show_progress && isatty(fileno(stderr))) + fprintf(stderr, "\n"); + show_progress = !show_progress; + } +} + /* * Report current progress status. Parts borrowed from * PostgreSQLs' src/bin/pg_basebackup.c @@ -529,23 +547,28 @@ main(int argc, char *argv[]) exit(1); } +#ifndef WIN32 /* - * If progress status information is requested, we need to scan the - * directory tree(s) twice, once to get the idea how much data we need to - * scan and finally to do the real legwork. + * Assign SIGUSR1 signal handler to toggle progress status information */ - if (show_progress) - { - total_size = scan_directory(DataDir, "global", true); - total_size += scan_directory(DataDir, "base", true); - total_size += scan_directory(DataDir, "pg_tblspc", true); + pqsignal(SIGUSR1, toggle_progress_report); +#endif - /* - * Remember start time. Required to calculate the current speed in - * report_progress(). - */ - INSTR_TIME_SET_CURRENT(scan_started); - } + /* + * As progress status information may be requested even after start of + * operation, we need to scan the directory tree(s) twice, once to get + * the idea how much data we need to scan and finally to do the real + * legwork. + */ + total_size = scan_directory(DataDir, "global", true); + total_size += scan_directory(DataDir, "base", true); + total_size += scan_directory(DataDir, "pg_tblspc", true); + + /* + * Remember start time. Required to calculate the current speed in + * report_progress() + */ + INSTR_TIME_SET_CURRENT(scan_started); if (ControlFile->data_checksum_version == 0 && mode == PG_MODE_DISABLE) -- 2.11.0