Hello devs,

When \sleep is used within a pgbench script it resets txn_scheduled which is used for computing stats about the transaction, resulting in absurd statistics:

 latency average = 0.649 ms *** ??? ***
 ...
 script statistics:
  - statement latencies in milliseconds:
          0.235  BEGIN;
        100.301  \sleep 100 ms
          0.351  END;

I probably created this bug when adding "--rate" in 9.4 and trying to be too clever. As nobody complained yet about it, I'm not sure it is worth fixing it there, though.

The fix is that "\sleep" does not have to interfere with the txn_scheduled field, see the attached patch.

 latency average = 100.237 ms  *** BETTER ***
 ...
 script statistics:
  - statement latencies in milliseconds:
          0.099  BEGIN;
        100.001  \sleep 100 ms
          0.135  END;

--
Fabien.
diff --git a/src/bin/pgbench/pgbench.c b/src/bin/pgbench/pgbench.c
index 8027955..de9b1b6 100644
--- a/src/bin/pgbench/pgbench.c
+++ b/src/bin/pgbench/pgbench.c
@@ -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 */
@@ -1828,6 +1829,7 @@ top:
 			}
 		}
 
+		st->sleep_until = st->txn_scheduled;
 		st->sleeping = true;
 		st->throttling = true;
 		st->is_throttled = true;
@@ -1840,7 +1842,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;
@@ -2139,7 +2141,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;
-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

Reply via email to