From: Magnus Hagander Date: Sun, 9 Feb 2014 11:47:09 +0000 (+0100) Subject: Limit pg_basebackup progress output to 1/second X-Git-Tag: REL9_4_BETA1~518 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=8198a321c9ea2072c5acde438f4d19638e04f6f2;p=postgresql Limit pg_basebackup progress output to 1/second This prevents pg_basebackup from generating excessive output when dumping large clusters. The status is now updated once / second, still making it possible to see that there is progress happening, but limiting the total bandwidth. Mika Eloranta, reviewed by Sawada Masahiko and Oskari Saarenmaa --- diff --git a/src/bin/pg_basebackup/pg_basebackup.c b/src/bin/pg_basebackup/pg_basebackup.c index a396c2fd93..a6e320c0f2 100644 --- a/src/bin/pg_basebackup/pg_basebackup.c +++ b/src/bin/pg_basebackup/pg_basebackup.c @@ -15,6 +15,7 @@ #include "libpq-fe.h" #include "pqexpbuffer.h" #include "pgtar.h" +#include "pgtime.h" #include #include @@ -46,6 +47,7 @@ static bool streamwal = false; static bool fastcheckpoint = false; static bool writerecoveryconf = false; static int standby_message_timeout = 10 * 1000; /* 10 sec = default */ +static pg_time_t last_progress_report = 0; /* Progress counters */ static uint64 totalsize; @@ -75,7 +77,7 @@ static PQExpBuffer recoveryconfcontents = NULL; /* Function headers */ static void usage(void); static void verify_dir_is_empty_or_create(char *dirname); -static void progress_report(int tablespacenum, const char *filename); +static void progress_report(int tablespacenum, const char *filename, bool force); static void ReceiveTarFile(PGconn *conn, PGresult *res, int rownum); static void ReceiveAndUnpackTarFile(PGconn *conn, PGresult *res, int rownum); @@ -399,13 +401,27 @@ verify_dir_is_empty_or_create(char *dirname) /* * Print a progress report based on the global variables. If verbose output * is enabled, also print the current file name. + * + * Progress report is written at maximum once per second, unless the + * force parameter is set to true. */ static void -progress_report(int tablespacenum, const char *filename) +progress_report(int tablespacenum, const char *filename, bool force) { - int percent = (int) ((totaldone / 1024) * 100 / totalsize); + int percent; char totaldone_str[32]; char totalsize_str[32]; + pg_time_t now; + + if (!showprogress) + return; + + now = time(NULL); + if (now == last_progress_report && !force) + return; /* Max once per second */ + + last_progress_report = now; + percent = totalsize ? (int) ((totaldone / 1024) * 100 / totalsize) : 0; /* * Avoid overflowing past 100% or the full size. This may make the total @@ -853,9 +869,9 @@ ReceiveTarFile(PGconn *conn, PGresult *res, int rownum) } } totaldone += r; - if (showprogress) - progress_report(rownum, filename); + progress_report(rownum, filename, false); } /* while (1) */ + progress_report(rownum, filename, true); if (copybuf != NULL) PQfreemem(copybuf); @@ -1080,8 +1096,7 @@ ReceiveAndUnpackTarFile(PGconn *conn, PGresult *res, int rownum) disconnect_and_exit(1); } totaldone += r; - if (showprogress) - progress_report(rownum, filename); + progress_report(rownum, filename, false); current_len_left -= r; if (current_len_left == 0 && current_padding == 0) @@ -1097,6 +1112,7 @@ ReceiveAndUnpackTarFile(PGconn *conn, PGresult *res, int rownum) } } /* continuing data in existing file */ } /* loop over all data blocks */ + progress_report(rownum, filename, true); if (file != NULL) { @@ -1457,8 +1473,7 @@ BaseBackup(void) tablespacecount = PQntuples(res); for (i = 0; i < PQntuples(res); i++) { - if (showprogress) - totalsize += atol(PQgetvalue(res, i, 2)); + totalsize += atol(PQgetvalue(res, i, 2)); /* * Verify tablespace directories are empty. Don't bother with the @@ -1505,7 +1520,7 @@ BaseBackup(void) if (showprogress) { - progress_report(PQntuples(res), NULL); + progress_report(PQntuples(res), NULL, true); fprintf(stderr, "\n"); /* Need to move to next line */ } PQclear(res);