From accf7616ff2854640523d5e42ffa5420cc5a3b51 Mon Sep 17 00:00:00 2001 From: Robert Haas Date: Wed, 9 Mar 2016 13:09:12 -0500 Subject: [PATCH] pgbench: When -T is used, don't wait for transactions beyond end of run. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit At low rates, this can lead to pgbench taking significantly longer to terminate than the user might expect. Repair. Fabien Coelho, reviewed by Aleksander Alekseev, Álvaro Herrera, and me. --- src/bin/pgbench/pgbench.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/bin/pgbench/pgbench.c b/src/bin/pgbench/pgbench.c index 92df7504ad5..e3d0d69b3f2 100644 --- a/src/bin/pgbench/pgbench.c +++ b/src/bin/pgbench/pgbench.c @@ -94,6 +94,7 @@ static int pthread_join(pthread_t th, void **thread_return); int nxacts = 0; /* number of transactions per client */ int duration = 0; /* duration in seconds */ +int64 end_time = 0; /* when to stop in micro seconds, under -T */ /* * scaling factor. for example, scale = 10 will make 1000000 tuples in @@ -1362,6 +1363,10 @@ top: thread->throttle_trigger += wait; st->txn_scheduled = thread->throttle_trigger; + /* stop client if next transaction is beyond pgbench end of execution */ + if (duration > 0 && st->txn_scheduled > end_time) + return clientDone(st, true); + /* * If this --latency-limit is used, and this slot is already late so * that the transaction will miss the latency limit even if it @@ -3582,6 +3587,11 @@ main(int argc, char **argv) INSTR_TIME_SET_CURRENT(thread->start_time); + /* compute when to stop */ + if (duration > 0) + end_time = INSTR_TIME_GET_MICROSEC(thread->start_time) + + (int64) 1000000 * duration; + /* the first thread (i = 0) is executed by main thread */ if (i > 0) { @@ -3600,6 +3610,10 @@ main(int argc, char **argv) } #else INSTR_TIME_SET_CURRENT(threads[0].start_time); + /* compute when to stop */ + if (duration > 0) + end_time = INSTR_TIME_GET_MICROSEC(threads[0].start_time) + + (int64) 1000000 * duration; threads[0].thread = INVALID_THREAD; #endif /* ENABLE_THREAD_SAFETY */