aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAndres Freund <andres@anarazel.de>2021-08-04 19:19:44 -0700
committerAndres Freund <andres@anarazel.de>2021-08-04 19:19:58 -0700
commitfa604e0dd07a39ba34f93d06ded8243280dffdeb (patch)
tree63dcc3400102dc8ffa744276c2c6278341274065 /src
parente8086bd3ba0ab73a18ac2293dd14f488734126ec (diff)
downloadpostgresql-fa604e0dd07a39ba34f93d06ded8243280dffdeb.tar.gz
postgresql-fa604e0dd07a39ba34f93d06ded8243280dffdeb.zip
pgbench: When using pipelining only do PQconsumeInput() when necessary.
Up to now we did a PQconsumeInput() for each pipelined query, asking the OS for more input - which it often won't have, as all results might already have been sent. That turns out to have a noticeable performance impact. Alvaro Herrera reviewed the idea to add the PQisBusy() check, but not this concrete patch. Author: Andres Freund <andres@anarazel.de> Discussion: https://postgr.es/m/20210720180039.23rivhdft3l4mayn@alap3.anarazel.de Backpatch: 14, where libpq/pgbench pipelining was introduced.
Diffstat (limited to 'src')
-rw-r--r--src/bin/pgbench/pgbench.c9
1 files changed, 8 insertions, 1 deletions
diff --git a/src/bin/pgbench/pgbench.c b/src/bin/pgbench/pgbench.c
index 364b5a2e47d..129cf2ed61d 100644
--- a/src/bin/pgbench/pgbench.c
+++ b/src/bin/pgbench/pgbench.c
@@ -3460,7 +3460,14 @@ advanceConnectionState(TState *thread, CState *st, StatsData *agg)
*/
case CSTATE_WAIT_RESULT:
pg_log_debug("client %d receiving", st->id);
- if (!PQconsumeInput(st->con))
+
+ /*
+ * Only check for new network data if we processed all data
+ * fetched prior. Otherwise we end up doing a syscall for each
+ * individual pipelined query, which has a measurable
+ * performance impact.
+ */
+ if (PQisBusy(st->con) && !PQconsumeInput(st->con))
{
/* there's something wrong */
commandFailed(st, "SQL", "perhaps the backend died while processing");