postgres.git / summary / log / commit / refs

commit    1cf646957135d1200c2b7765e6446fb91bb47d86
Author:   Fujii Masao <fujii@postgresql.org>
Date:     Wed Nov 27 14:03:44 2024 +0000
First released in: 18.0, 13.19, 14.16, 15.11, 16.7, 17.3

    pgbench: Ensure previous progress message is fully cleared when updating.
    
    During pgbench's table initialization, progress updates could display
    leftover characters from the previous message if the new message
    was shorter. This commit resolves the issue by appending spaces to
    the current message to fully overwrite any remaining characters from
    the previous line.
    
    Back-patch to all the supported versions.
    
    Author: Yushi Ogiwara, Tatsuo Ishii, Fujii Masao
    Reviewed-by: Tatsuo Ishii, Fujii Masao
    Discussion: https://postgr.es/m/9a9b8b95b6a709877ae48ad5b0c59bb9@oss.nttdata.com


src/bin/pgbench/pgbench.c | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/src/bin/pgbench/pgbench.c b/src/bin/pgbench/pgbench.c index c1134eae5b5..fd2c8f42c50 100644 --- a/src/bin/pgbench/pgbench.c +++ b/src/bin/pgbench/pgbench.c @@ -4890,6 +4890,8 @@ initGenerateDataClientSide(PGconn *con) PGresult *res; int i; int64 k; + int chars = 0; + int prev_chars = 0; char *copy_statement; /* used to track elapsed time and estimate of the remaining time */ @@ -4975,10 +4977,10 @@ initGenerateDataClientSide(PGconn *con) double elapsed_sec = PG_TIME_GET_DOUBLE(pg_time_now() - start); double remaining_sec = ((double) scale * naccounts - j) * elapsed_sec / j; - fprintf(stderr, INT64_FORMAT " of " INT64_FORMAT " tuples (%d%%) done (elapsed %.2f s, remaining %.2f s)%c", - j, (int64) naccounts * scale, - (int) (((int64) j * 100) / (naccounts * (int64) scale)), - elapsed_sec, remaining_sec, eol); + chars = fprintf(stderr, INT64_FORMAT " of " INT64_FORMAT " tuples (%d%%) done (elapsed %.2f s, remaining %.2f s)", + j, (int64) naccounts * scale, + (int) (((int64) j * 100) / (naccounts * (int64) scale)), + elapsed_sec, remaining_sec); } /* let's not call the timing for each row, but only each 100 rows */ else if (use_quiet && (j % 100 == 0)) @@ -4989,14 +4991,24 @@ initGenerateDataClientSide(PGconn *con) /* have we reached the next interval (or end)? */ if ((j == scale * naccounts) || (elapsed_sec >= log_interval * LOG_STEP_SECONDS)) { - fprintf(stderr, INT64_FORMAT " of " INT64_FORMAT " tuples (%d%%) done (elapsed %.2f s, remaining %.2f s)%c", - j, (int64) naccounts * scale, - (int) (((int64) j * 100) / (naccounts * (int64) scale)), elapsed_sec, remaining_sec, eol); + chars = fprintf(stderr, INT64_FORMAT " of " INT64_FORMAT " tuples (%d%%) done (elapsed %.2f s, remaining %.2f s)", + j, (int64) naccounts * scale, + (int) (((int64) j * 100) / (naccounts * (int64) scale)), elapsed_sec, remaining_sec); /* skip to the next interval */ log_interval = (int) ceil(elapsed_sec / LOG_STEP_SECONDS); } } + + /* + * If the previous progress message is longer than the current one, + * add spaces to the current line to fully overwrite any remaining + * characters from the previous message. + */ + if (prev_chars > chars) + fprintf(stderr, "%*c", prev_chars - chars, ' '); + fputc(eol, stderr); + prev_chars = chars; } if (eol != '\n') [parent: 56265ed6a12c]