Newline after --progress report

Started by Heikki Linnakangasover 5 years ago5 messages
#1Heikki Linnakangas
hlinnaka@iki.fi
1 attachment(s)

While hacking on pg_rewind, this in pg_rewind's main() function caught
my eye:

progress_report(true);
printf("\n");

It is peculiar, because progress_report() uses fprintf(stderr, ...) for
all its printing, and in fact the only other use of printf() in
pg_rewind is in printing the "pg_rewind --help" text.

I think the idea here was to move to the next line, after
progress_report() has updated the progress line for the last time. It
probably also should not be printed, when "--progress" is not used.

Attached is a patch to fix this, as well as a similar issue in
pg_checksums. pg_basebackup and pgbench also print progres reports like
this, but they seem correct to me.

- Heikki

Attachments:

0001-Fix-printing-last-progress-report-line-in-client-pro.patchtext/x-patch; charset=UTF-8; name=0001-Fix-printing-last-progress-report-line-in-client-pro.patchDownload
From b4a64c3aca7257336c3ca1bf4bee8675e148de10 Mon Sep 17 00:00:00 2001
From: Heikki Linnakangas <heikki.linnakangas@iki.fi>
Date: Wed, 12 Aug 2020 23:27:01 +0300
Subject: [PATCH 1/1] Fix printing last progress report line in client
 programs.

A number of client programs have a "--progress" option that when printing
to a TTY, updates the current line by printing a '\r' and overwriting it.
After the last line, an extra '\n' needs to be printed to move the cursor
to the next line. pg_basebackup and pgbench got this right, but pg_rewind
and pg_checksums were slightly wrong. pg_rewind printed the newline to
stdout instead of stderr, and pg_checksum printed the newline even when
not printing to a TTY. Fix them.
---
 src/bin/pg_checksums/pg_checksums.c | 3 ++-
 src/bin/pg_rewind/pg_rewind.c       | 3 ++-
 2 files changed, 4 insertions(+), 2 deletions(-)

diff --git a/src/bin/pg_checksums/pg_checksums.c b/src/bin/pg_checksums/pg_checksums.c
index 1daa5aed0e0..9ae884897ef 100644
--- a/src/bin/pg_checksums/pg_checksums.c
+++ b/src/bin/pg_checksums/pg_checksums.c
@@ -626,7 +626,8 @@ main(int argc, char *argv[])
 		if (showprogress)
 		{
 			progress_report(true);
-			fprintf(stderr, "\n");	/* Need to move to next line */
+			if (isatty(fileno(stderr)))
+				fprintf(stderr, "\n");	/* Need to move to next line */
 		}
 
 		printf(_("Checksum operation completed\n"));
diff --git a/src/bin/pg_rewind/pg_rewind.c b/src/bin/pg_rewind/pg_rewind.c
index 0015d3b461a..c000c12fa58 100644
--- a/src/bin/pg_rewind/pg_rewind.c
+++ b/src/bin/pg_rewind/pg_rewind.c
@@ -422,7 +422,8 @@ main(int argc, char **argv)
 	executeFileMap();
 
 	progress_report(true);
-	printf("\n");
+	if (showprogress && isatty(fileno(stderr)))
+		fprintf(stderr, "\n");	/* Need to move to next line */
 
 	if (showprogress)
 		pg_log_info("creating backup label and updating control file");
-- 
2.20.1

#2Tom Lane
tgl@sss.pgh.pa.us
In reply to: Heikki Linnakangas (#1)
Re: Newline after --progress report

Heikki Linnakangas <hlinnaka@iki.fi> writes:

While hacking on pg_rewind, this in pg_rewind's main() function caught
my eye:

Good catch.

Attached is a patch to fix this, as well as a similar issue in
pg_checksums. pg_basebackup and pgbench also print progres reports like
this, but they seem correct to me.

I wonder whether it'd be better to push the responsibility for this
into progress_report(), by adding an additional parameter "bool last"
or the like. Then the callers would not need such an unseemly amount
of knowledge about what progress_report() is doing.

regards, tom lane

#3Heikki Linnakangas
hlinnaka@iki.fi
In reply to: Tom Lane (#2)
Re: Newline after --progress report

On 14/08/2020 16:51, Tom Lane wrote:

Heikki Linnakangas <hlinnaka@iki.fi> writes:

Attached is a patch to fix this, as well as a similar issue in
pg_checksums. pg_basebackup and pgbench also print progres reports like
this, but they seem correct to me.

I wonder whether it'd be better to push the responsibility for this
into progress_report(), by adding an additional parameter "bool last"
or the like. Then the callers would not need such an unseemly amount
of knowledge about what progress_report() is doing.

Good point. Pushed a patch along those lines.

- Heikki

#4Tom Lane
tgl@sss.pgh.pa.us
In reply to: Heikki Linnakangas (#3)
Re: Newline after --progress report

Heikki Linnakangas <hlinnaka@iki.fi> writes:

Good point. Pushed a patch along those lines.

Uh ... you patched v12 but not v13?

Also, I'd recommend that you NOT do this:

+ fprintf(stderr, (!finished && isatty(fileno(stderr))) ? "\r" : "\n");

as it breaks printf format verification in many/most compilers.

regards, tom lane

#5Heikki Linnakangas
hlinnaka@iki.fi
In reply to: Tom Lane (#4)
Re: Newline after --progress report

On 17/08/2020 16:59, Tom Lane wrote:

Heikki Linnakangas <hlinnaka@iki.fi> writes:

Good point. Pushed a patch along those lines.

Uh ... you patched v12 but not v13?

Darn, I forgot it exists.

Also, I'd recommend that you NOT do this:

+ fprintf(stderr, (!finished && isatty(fileno(stderr))) ? "\r" : "\n");

as it breaks printf format verification in many/most compilers.

Ok. I pushed the same commit to v12 as to other branches now, to keep
them in sync. I'll go fix that as a separate commit. Thanks!

- Heikki