Fix latency calculation when there are \sleep commands in the script.
authorHeikki Linnakangas <[email protected]>
Mon, 19 Sep 2016 19:55:43 +0000 (22:55 +0300)
committerHeikki Linnakangas <[email protected]>
Mon, 19 Sep 2016 19:55:43 +0000 (22:55 +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: <alpine.DEB.2.20.1608231622170.7102@lancre>

src/bin/pgbench/pgbench.c

index 56c37d537ed014c57468e0a66bf877b8ed8c0dbe..4676a59020a33a35a9a9e2436fd29853241bf723 100644 (file)
@@ -250,6 +250,7 @@ typedef struct
    int         nvariables;     /* number of variables */
    bool        vars_sorted;    /* are variables sorted by name? */
    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 */
    int         use_file;       /* index in sql_scripts for this client */
@@ -1830,6 +1831,7 @@ top:
            }
        }
 
+       st->sleep_until = st->txn_scheduled;
        st->sleeping = true;
        st->throttling = true;
        st->is_throttled = true;
@@ -1842,7 +1844,7 @@ top:
    {                           /* are we sleeping? */
        if (INSTR_TIME_IS_ZERO(now))
            INSTR_TIME_SET_CURRENT(now);
-       if (INSTR_TIME_GET_MICROSEC(now) < st->txn_scheduled)
+       if (INSTR_TIME_GET_MICROSEC(now) < st->sleep_until)
            return true;        /* Still sleeping, nothing to do here */
        /* Else done sleeping, go ahead with next command */
        st->sleeping = false;
@@ -2141,7 +2143,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 = true;
 
            st->listen = true;