On Wed, Jan 27, 2016 at 2:31 PM, Fabien COELHO <coe...@cri.ensmp.fr> wrote:
- when a duration (-T) is specified, ensure that pgbench ends at that
time (i.e. do not wait for a transaction beyond the end of the run).
Every other place where doCustom() returns false is implemented as
return clientDone(...). I think this should probably do the same.
Why not. clientDone() second arguments is totally ignored, I put true
because it looks better.
I also think that we should probably store the end time someplace
instead of recomputing it in multiple places (this patch adds two such
places).
Why not.
Attached is a v4.
--
Fabien.
diff --git a/src/bin/pgbench/pgbench.c b/src/bin/pgbench/pgbench.c
index 92df750..b89f5ad 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 */
@@ -3738,7 +3752,10 @@ threadRun(void *arg)
}
}
- while (remains > 0)
+ while (remains > 0 ||
+ /* thread zero keeps on printing progress report if any */
+ (progress > 0 && thread->tid == 0 && duration > 0 &&
+ next_report <= end_time))
{
fd_set input_mask;
int maxsock; /* max socket number to be waited */
--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers