Fix latency calculation when there are \sleep commands in the script.
authorHeikki Linnakangas
Mon, 19 Sep 2016 19:55:43 +0000 (22:55 +0300)
committerHeikki Linnakangas
Mon, 19 Sep 2016 19:59:44 +0000 (22:59 +0300)
We can't use txn_scheduled to hold the sleep-until time for \sleep, because
that interferes with calculation of the latency of the transaction as whole.

Backpatch to 9.4, where this bug was introduced.

Fabien COELHO

Discussion: 1608231622170.7102@lancre>

contrib/pgbench/pgbench.c

index e5510fb830b002f370397b05994d8f072b2597a5..807d7dcdb8d820fb22f58e139144b724833ecce7 100644 (file)
@@ -211,6 +211,7 @@ typedef struct
    Variable   *variables;      /* array of variable definitions */
    int         nvariables;
    int64       txn_scheduled;  /* scheduled start time of transaction (usec) */
+   int64       sleep_until;    /* scheduled start time of next cmd (usec) */
    instr_time  txn_begin;      /* used for measuring schedule lag times */
    instr_time  stmt_begin;     /* used for measuring statement latencies */
    int64       txn_latencies;  /* cumulated latencies */
@@ -967,6 +968,7 @@ top:
        thread->throttle_trigger += wait;
 
        st->txn_scheduled = thread->throttle_trigger;
+       st->sleep_until = st->txn_scheduled;
        st->sleeping = 1;
        st->throttling = true;
        st->is_throttled = true;
@@ -982,7 +984,7 @@ top:
 
        INSTR_TIME_SET_CURRENT(now);
        now_us = INSTR_TIME_GET_MICROSEC(now);
-       if (st->txn_scheduled <= now_us)
+       if (st->sleep_until <= now_us)
        {
            st->sleeping = 0;   /* Done sleeping, go ahead with next command */
            if (st->throttling)
@@ -1599,7 +1601,7 @@ top:
                usec *= 1000000;
 
            INSTR_TIME_SET_CURRENT(now);
-           st->txn_scheduled = INSTR_TIME_GET_MICROSEC(now) + usec;
+           st->sleep_until = INSTR_TIME_GET_MICROSEC(now) + usec;
            st->sleeping = 1;
 
            st->listen = 1;