Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit 8198a32

Browse files
committed
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
1 parent 01025d8 commit 8198a32

File tree

1 file changed

+25
-10
lines changed

1 file changed

+25
-10
lines changed

src/bin/pg_basebackup/pg_basebackup.c

Lines changed: 25 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
#include "libpq-fe.h"
1616
#include "pqexpbuffer.h"
1717
#include "pgtar.h"
18+
#include "pgtime.h"
1819

1920
#include <unistd.h>
2021
#include <dirent.h>
@@ -46,6 +47,7 @@ static bool streamwal = false;
4647
static bool fastcheckpoint = false;
4748
static bool writerecoveryconf = false;
4849
static int standby_message_timeout = 10 * 1000; /* 10 sec = default */
50+
static pg_time_t last_progress_report = 0;
4951

5052
/* Progress counters */
5153
static uint64 totalsize;
@@ -75,7 +77,7 @@ static PQExpBuffer recoveryconfcontents = NULL;
7577
/* Function headers */
7678
static void usage(void);
7779
static void verify_dir_is_empty_or_create(char *dirname);
78-
static void progress_report(int tablespacenum, const char *filename);
80+
static void progress_report(int tablespacenum, const char *filename, bool force);
7981

8082
static void ReceiveTarFile(PGconn *conn, PGresult *res, int rownum);
8183
static void ReceiveAndUnpackTarFile(PGconn *conn, PGresult *res, int rownum);
@@ -399,13 +401,27 @@ verify_dir_is_empty_or_create(char *dirname)
399401
/*
400402
* Print a progress report based on the global variables. If verbose output
401403
* is enabled, also print the current file name.
404+
*
405+
* Progress report is written at maximum once per second, unless the
406+
* force parameter is set to true.
402407
*/
403408
static void
404-
progress_report(int tablespacenum, const char *filename)
409+
progress_report(int tablespacenum, const char *filename, bool force)
405410
{
406-
int percent = (int) ((totaldone / 1024) * 100 / totalsize);
411+
int percent;
407412
char totaldone_str[32];
408413
char totalsize_str[32];
414+
pg_time_t now;
415+
416+
if (!showprogress)
417+
return;
418+
419+
now = time(NULL);
420+
if (now == last_progress_report && !force)
421+
return; /* Max once per second */
422+
423+
last_progress_report = now;
424+
percent = totalsize ? (int) ((totaldone / 1024) * 100 / totalsize) : 0;
409425

410426
/*
411427
* Avoid overflowing past 100% or the full size. This may make the total
@@ -853,9 +869,9 @@ ReceiveTarFile(PGconn *conn, PGresult *res, int rownum)
853869
}
854870
}
855871
totaldone += r;
856-
if (showprogress)
857-
progress_report(rownum, filename);
872+
progress_report(rownum, filename, false);
858873
} /* while (1) */
874+
progress_report(rownum, filename, true);
859875

860876
if (copybuf != NULL)
861877
PQfreemem(copybuf);
@@ -1080,8 +1096,7 @@ ReceiveAndUnpackTarFile(PGconn *conn, PGresult *res, int rownum)
10801096
disconnect_and_exit(1);
10811097
}
10821098
totaldone += r;
1083-
if (showprogress)
1084-
progress_report(rownum, filename);
1099+
progress_report(rownum, filename, false);
10851100

10861101
current_len_left -= r;
10871102
if (current_len_left == 0 && current_padding == 0)
@@ -1097,6 +1112,7 @@ ReceiveAndUnpackTarFile(PGconn *conn, PGresult *res, int rownum)
10971112
}
10981113
} /* continuing data in existing file */
10991114
} /* loop over all data blocks */
1115+
progress_report(rownum, filename, true);
11001116

11011117
if (file != NULL)
11021118
{
@@ -1457,8 +1473,7 @@ BaseBackup(void)
14571473
tablespacecount = PQntuples(res);
14581474
for (i = 0; i < PQntuples(res); i++)
14591475
{
1460-
if (showprogress)
1461-
totalsize += atol(PQgetvalue(res, i, 2));
1476+
totalsize += atol(PQgetvalue(res, i, 2));
14621477

14631478
/*
14641479
* Verify tablespace directories are empty. Don't bother with the
@@ -1505,7 +1520,7 @@ BaseBackup(void)
15051520

15061521
if (showprogress)
15071522
{
1508-
progress_report(PQntuples(res), NULL);
1523+
progress_report(PQntuples(res), NULL, true);
15091524
fprintf(stderr, "\n"); /* Need to move to next line */
15101525
}
15111526
PQclear(res);

0 commit comments

Comments
 (0)