aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2017-04-11 08:59:40 -0400
committerTom Lane <tgl@sss.pgh.pa.us>2017-04-11 08:59:40 -0400
commitfeffa0e0795a5a99324890a6dd548ba162ec104c (patch)
tree4ae89120ec4b5c51a3072b08dcdedc9598262b72
parenta6940bdcb9ef87a54459deac5699a61cfdbc696c (diff)
downloadpostgresql-feffa0e0795a5a99324890a6dd548ba162ec104c.tar.gz
postgresql-feffa0e0795a5a99324890a6dd548ba162ec104c.zip
Fix pgbench's --progress-timestamp option to print Unix-epoch timestamps.
As a consequence of commit 1d63f7d2d, on platforms with CLOCK_MONOTONIC, you got some random timescale or other instead of standard Unix timestamps as expected. I'd attempted to fix pgbench for that change in commits 74baa1e3b and 67a875355, but missed this place. Fix in the same way as those previous commits, ie, just eat the cost of an extra gettimeofday(); one extra syscall per progress report isn't worth sweating over. Per report from Jeff Janes. In passing, use snprintf not sprintf for this purpose. I don't think there's any chance of actual buffer overrun, but it just looks safer. Discussion: https://postgr.es/m/CAMkU=1zrQaPwBN+NcBd3pWCb=vWaiL=mmWfJjDJjh-a7eVr-Og@mail.gmail.com
-rw-r--r--src/bin/pgbench/pgbench.c17
1 files changed, 14 insertions, 3 deletions
diff --git a/src/bin/pgbench/pgbench.c b/src/bin/pgbench/pgbench.c
index 78f1e6b1e32..ae3624721e1 100644
--- a/src/bin/pgbench/pgbench.c
+++ b/src/bin/pgbench/pgbench.c
@@ -4652,10 +4652,21 @@ threadRun(void *arg)
(cur.cnt - last.cnt);
if (progress_timestamp)
- sprintf(tbuf, "%.03f s",
- INSTR_TIME_GET_MILLISEC(now_time) / 1000.0);
+ {
+ /*
+ * On some platforms the current system timestamp is
+ * available in now_time, but rather than get entangled
+ * with that, we just eat the cost of an extra syscall in
+ * all cases.
+ */
+ struct timeval tv;
+
+ gettimeofday(&tv, NULL);
+ snprintf(tbuf, sizeof(tbuf), "%ld.%03ld s",
+ (long) tv.tv_sec, (long) (tv.tv_usec / 1000));
+ }
else
- sprintf(tbuf, "%.1f s", total_run);
+ snprintf(tbuf, sizeof(tbuf), "%.1f s", total_run);
fprintf(stderr,
"progress: %s, %.1f tps, lat %.3f ms stddev %.3f",