]> granicus.if.org Git - postgresql/commitdiff
Fix progress logging when scale factor is large.
authorTatsuo Ishii <ishii@postgresql.org>
Thu, 12 Dec 2013 10:01:01 +0000 (19:01 +0900)
committerTatsuo Ishii <ishii@postgresql.org>
Thu, 12 Dec 2013 10:10:35 +0000 (19:10 +0900)
Integer overflow showed minus percent and minus remaining time something like this.
  239300000 of 3800000000 tuples (-48%) done (elapsed 226.86 s, remaining -696.10 s).

contrib/pgbench/pgbench.c

index 2c96fae78245ca127d87b0df0f2f56c5904a2e92..2ae85a104b562d3ce6546c3921fadff496be0ec0 100644 (file)
@@ -1720,11 +1720,11 @@ init(bool is_no_vacuum)
                        INSTR_TIME_SUBTRACT(diff, start);
 
                        elapsed_sec = INSTR_TIME_GET_DOUBLE(diff);
-                       remaining_sec = (scale * naccounts - j) * elapsed_sec / j;
+                       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).\n",
                                        j, (int64) naccounts * scale,
-                                       (int) (((int64) j * 100) / (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 */
@@ -1734,14 +1734,14 @@ init(bool is_no_vacuum)
                        INSTR_TIME_SUBTRACT(diff, start);
 
                        elapsed_sec = INSTR_TIME_GET_DOUBLE(diff);
-                       remaining_sec = (scale * naccounts - j) * elapsed_sec / j;
+                       remaining_sec = ((double) scale * naccounts - j) * elapsed_sec / j;
 
                        /* 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).\n",
                                                j, (int64) naccounts * scale,
-                                               (int) (((int64) j * 100) / (naccounts * scale)), elapsed_sec, remaining_sec);
+                                               (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);