pgbench: Ensure previous progress message is fully cleared when updating.
authorFujii Masao <[email protected]>
Wed, 27 Nov 2024 14:04:55 +0000 (23:04 +0900)
committerFujii Masao <[email protected]>
Wed, 27 Nov 2024 14:05:24 +0000 (23:05 +0900)
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- 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

index 6ea89cabc97a6a8025603e29334a93315be19a4d..6bccacaf86cee4281d2c69d910a4c2311396ebd1 100644 (file)
@@ -3840,6 +3840,8 @@ initGenerateDataClientSide(PGconn *con)
    PGresult   *res;
    int         i;
    int64       k;
+   int         chars = 0;
+   int         prev_chars = 0;
 
    /* used to track elapsed time and estimate of the remaining time */
    instr_time  start,
@@ -3926,10 +3928,10 @@ initGenerateDataClientSide(PGconn *con)
            elapsed_sec = INSTR_TIME_GET_DOUBLE(diff);
            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))
@@ -3943,14 +3945,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')