pgsql: Fix unwanted flushing of libpq's input buffer when socket EOF is

From: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>
To: pgsql-committers(at)postgresql(dot)org
Subject: pgsql: Fix unwanted flushing of libpq's input buffer when socket EOF is
Date: 2015-11-12 18:04:01
Message-ID: E1ZwwE5-0001cJ-0P@gemulon.postgresql.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-committers

Fix unwanted flushing of libpq's input buffer when socket EOF is seen.

In commit 210eb9b743c0645d I centralized libpq's logic for closing down
the backend communication socket, and made the new pqDropConnection
routine always reset the I/O buffers to empty. Many of the call sites
previously had not had such code, and while that amounted to an oversight
in some cases, there was one place where it was intentional and necessary
*not* to flush the input buffer: pqReadData should never cause that to
happen, since we probably still want to process whatever data we read.

This is the true cause of the problem Robert was attempting to fix in
c3e7c24a1d60dc6a, namely that libpq no longer reported the backend's final
ERROR message before reporting "server closed the connection unexpectedly".
But that only accidentally fixed it, by invoking parseInput before the
input buffer got flushed; and very likely there are timing scenarios
where we'd still lose the message before processing it.

To fix, pass a flag to pqDropConnection to tell it whether to flush the
input buffer or not. On review I think flushing is actually correct for
every other call site.

Back-patch to 9.3 where the problem was introduced. In HEAD, also improve
the comments added by c3e7c24a1d60dc6a.

Branch
------
master

Details
-------
http://git.postgresql.org/pg/commitdiff/c405918858c09d4264ffc5a3c73d57dc3efb0213

Modified Files
--------------
src/interfaces/libpq/fe-connect.c | 38 ++++++++++++++++++++---------------
src/interfaces/libpq/fe-exec.c | 17 +++++++++-------
src/interfaces/libpq/fe-misc.c | 3 ++-
src/interfaces/libpq/fe-protocol3.c | 4 ++--
src/interfaces/libpq/libpq-int.h | 2 +-
5 files changed, 37 insertions(+), 27 deletions(-)

Browse pgsql-committers by date

  From Date Subject
Next Message Robert Haas 2015-11-12 18:28:24 Re: pgsql: libpq: Notice errors a backend may have sent just before dying.
Previous Message Tom Lane 2015-11-12 16:54:40 Re: pgsql: libpq: Notice errors a backend may have sent just before dying.