summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane2008-01-17 21:21:50 +0000
committerTom Lane2008-01-17 21:21:50 +0000
commit8d14da5418076e4c6bc0358e96212ddc40ae3bf5 (patch)
tree422ded5abd340ba8aacf4e637d49b92ed872233c
parente1325350617bda70f81fb75e899ea92bee19b8db (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.c17
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