diff options
author | Tom Lane | 2008-01-17 21:21:50 +0000 |
---|---|---|
committer | Tom Lane | 2008-01-17 21:21:50 +0000 |
commit | 8d14da5418076e4c6bc0358e96212ddc40ae3bf5 (patch) | |
tree | 422ded5abd340ba8aacf4e637d49b92ed872233c | |
parent | e1325350617bda70f81fb75e899ea92bee19b8db (diff) |
Insert into getCopyDataMessage() the same logic that already existed in the
main code path for enlarging libpq's input buffer in one swoop when needing to
read a long data message. Without this, the code will double the buffer size,
read more data, notice it still hasn't got the whole message, and repeat till
it finally has a large enough buffer. Which wastes a lot of data-moving
effort and also memory (since malloc probably can't do anything very useful
with the freed-up smaller buffers). Not sure why this wasn't there already;
certainly the COPY data path is a place where we're quite likely to see long
data messages. I'm not backpatching though, since this is just a marginal
performance issue rather than a real bug.
-rw-r--r-- | src/interfaces/libpq/fe-protocol3.c | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/src/interfaces/libpq/fe-protocol3.c b/src/interfaces/libpq/fe-protocol3.c index f473588526..152f05694b 100644 --- a/src/interfaces/libpq/fe-protocol3.c +++ b/src/interfaces/libpq/fe-protocol3.c @@ -1305,7 +1305,24 @@ getCopyDataMessage(PGconn *conn) } avail = conn->inEnd - conn->inCursor; if (avail < msgLength - 4) + { + /* + * Before returning, enlarge the input buffer if needed to hold + * the whole message. See notes in parseInput. + */ + if (pqCheckInBufferSpace(conn->inCursor + msgLength - 4, conn)) + { + /* + * XXX add some better recovery code... plan is to skip over + * the message using its length, then report an error. For the + * moment, just treat this like loss of sync (which indeed it + * might be!) + */ + handleSyncLoss(conn, id, msgLength); + return -2; + } return 0; + } /* * If it's a legitimate async message type, process it. (NOTIFY |