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 */