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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy