mirror of
https://github.com/postgres/postgres.git
synced 2025-07-30 11:03:19 +03:00
Implement pipeline mode in libpq
Pipeline mode in libpq lets an application avoid the Sync messages in the FE/BE protocol that are implicit in the old libpq API after each query. The application can then insert Sync at its leisure with a new libpq function PQpipelineSync. This can lead to substantial reductions in query latency. Co-authored-by: Craig Ringer <craig.ringer@enterprisedb.com> Co-authored-by: Matthieu Garrigues <matthieu.garrigues@gmail.com> Co-authored-by: Álvaro Herrera <alvherre@alvh.no-ip.org> Reviewed-by: Andres Freund <andres@anarazel.de> Reviewed-by: Aya Iwata <iwata.aya@jp.fujitsu.com> Reviewed-by: Daniel Vérité <daniel@manitou-mail.org> Reviewed-by: David G. Johnston <david.g.johnston@gmail.com> Reviewed-by: Justin Pryzby <pryzby@telsasoft.com> Reviewed-by: Kirk Jamison <k.jamison@fujitsu.com> Reviewed-by: Michael Paquier <michael.paquier@gmail.com> Reviewed-by: Nikhil Sontakke <nikhils@2ndquadrant.com> Reviewed-by: Vaishnavi Prabakaran <VaishnaviP@fast.au.fujitsu.com> Reviewed-by: Zhihong Yu <zyu@yugabyte.com> Discussion: https://postgr.es/m/CAMsr+YFUjJytRyV4J-16bEoiZyH=4nj+sQ7JP9ajwz=B4dMMZw@mail.gmail.com Discussion: https://postgr.es/m/CAJkzx4T5E-2cQe3dtv2R78dYFvz+in8PY7A8MArvLhs_pg75gg@mail.gmail.com
This commit is contained in:
@ -522,6 +522,23 @@ pqDropConnection(PGconn *conn, bool flushInput)
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* pqFreeCommandQueue
|
||||
* Free all the entries of PGcmdQueueEntry queue passed.
|
||||
*/
|
||||
static void
|
||||
pqFreeCommandQueue(PGcmdQueueEntry *queue)
|
||||
{
|
||||
while (queue != NULL)
|
||||
{
|
||||
PGcmdQueueEntry *cur = queue;
|
||||
|
||||
queue = cur->next;
|
||||
if (cur->query)
|
||||
free(cur->query);
|
||||
free(cur);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* pqDropServerData
|
||||
@ -553,6 +570,12 @@ pqDropServerData(PGconn *conn)
|
||||
}
|
||||
conn->notifyHead = conn->notifyTail = NULL;
|
||||
|
||||
pqFreeCommandQueue(conn->cmd_queue_head);
|
||||
conn->cmd_queue_head = conn->cmd_queue_tail = NULL;
|
||||
|
||||
pqFreeCommandQueue(conn->cmd_queue_recycle);
|
||||
conn->cmd_queue_recycle = NULL;
|
||||
|
||||
/* Reset ParameterStatus data, as well as variables deduced from it */
|
||||
pstatus = conn->pstatus;
|
||||
while (pstatus != NULL)
|
||||
@ -2459,6 +2482,7 @@ keep_going: /* We will come back to here until there is
|
||||
/* Drop any PGresult we might have, too */
|
||||
conn->asyncStatus = PGASYNC_IDLE;
|
||||
conn->xactStatus = PQTRANS_IDLE;
|
||||
conn->pipelineStatus = PQ_PIPELINE_OFF;
|
||||
pqClearAsyncResult(conn);
|
||||
|
||||
/* Reset conn->status to put the state machine in the right state */
|
||||
@ -3917,6 +3941,7 @@ makeEmptyPGconn(void)
|
||||
|
||||
conn->status = CONNECTION_BAD;
|
||||
conn->asyncStatus = PGASYNC_IDLE;
|
||||
conn->pipelineStatus = PQ_PIPELINE_OFF;
|
||||
conn->xactStatus = PQTRANS_IDLE;
|
||||
conn->options_valid = false;
|
||||
conn->nonblocking = false;
|
||||
@ -4084,8 +4109,6 @@ freePGconn(PGconn *conn)
|
||||
if (conn->connip)
|
||||
free(conn->connip);
|
||||
/* Note that conn->Pfdebug is not ours to close or free */
|
||||
if (conn->last_query)
|
||||
free(conn->last_query);
|
||||
if (conn->write_err_msg)
|
||||
free(conn->write_err_msg);
|
||||
if (conn->inBuffer)
|
||||
@ -4174,6 +4197,7 @@ closePGconn(PGconn *conn)
|
||||
conn->status = CONNECTION_BAD; /* Well, not really _bad_ - just absent */
|
||||
conn->asyncStatus = PGASYNC_IDLE;
|
||||
conn->xactStatus = PQTRANS_IDLE;
|
||||
conn->pipelineStatus = PQ_PIPELINE_OFF;
|
||||
pqClearAsyncResult(conn); /* deallocate result */
|
||||
resetPQExpBuffer(&conn->errorMessage);
|
||||
release_conn_addrinfo(conn);
|
||||
@ -6726,6 +6750,15 @@ PQbackendPID(const PGconn *conn)
|
||||
return conn->be_pid;
|
||||
}
|
||||
|
||||
PGpipelineStatus
|
||||
PQpipelineStatus(const PGconn *conn)
|
||||
{
|
||||
if (!conn)
|
||||
return PQ_PIPELINE_OFF;
|
||||
|
||||
return conn->pipelineStatus;
|
||||
}
|
||||
|
||||
int
|
||||
PQconnectionNeedsPassword(const PGconn *conn)
|
||||
{
|
||||
|
Reference in New Issue
Block a user