Commit a58db3aa authored by Jeff Davis's avatar Jeff Davis

Revert "Cannot use WL_SOCKET_WRITEABLE without WL_SOCKET_READABLE."

This reverts commit 3a9e64aa.

Commit 4bad60e3 fixed the root of the problem that 3a9e64aa worked
around.

This enables proper pipelining of commands after terminating
replication, eliminating an undocumented limitation.

Discussion: https://postgr.es/m/3d57bc29-4459-578b-79cb-7641baf53c57%40iki.fi
Backpatch-through: 9.5
parent 9b584953
...@@ -1719,7 +1719,12 @@ ProcessRepliesIfAny(void) ...@@ -1719,7 +1719,12 @@ ProcessRepliesIfAny(void)
last_processing = GetCurrentTimestamp(); last_processing = GetCurrentTimestamp();
for (;;) /*
* If we already received a CopyDone from the frontend, any subsequent
* message is the beginning of a new command, and should be processed in
* the main processing loop.
*/
while (!streamingDoneReceiving)
{ {
pq_startmsgread(); pq_startmsgread();
r = pq_getbyte_if_available(&firstchar); r = pq_getbyte_if_available(&firstchar);
...@@ -1748,19 +1753,6 @@ ProcessRepliesIfAny(void) ...@@ -1748,19 +1753,6 @@ ProcessRepliesIfAny(void)
proc_exit(0); proc_exit(0);
} }
/*
* If we already received a CopyDone from the frontend, the frontend
* should not send us anything until we've closed our end of the COPY.
* XXX: In theory, the frontend could already send the next command
* before receiving the CopyDone, but libpq doesn't currently allow
* that.
*/
if (streamingDoneReceiving && firstchar != 'X')
ereport(FATAL,
(errcode(ERRCODE_PROTOCOL_VIOLATION),
errmsg("unexpected standby message type \"%c\", after receiving CopyDone",
firstchar)));
/* Handle the very limited subset of commands expected in this phase */ /* Handle the very limited subset of commands expected in this phase */
switch (firstchar) switch (firstchar)
{ {
...@@ -2362,8 +2354,10 @@ WalSndLoop(WalSndSendDataCallback send_data) ...@@ -2362,8 +2354,10 @@ WalSndLoop(WalSndSendDataCallback send_data)
long sleeptime; long sleeptime;
int wakeEvents; int wakeEvents;
wakeEvents = WL_LATCH_SET | WL_EXIT_ON_PM_DEATH | WL_TIMEOUT | wakeEvents = WL_LATCH_SET | WL_EXIT_ON_PM_DEATH | WL_TIMEOUT;
WL_SOCKET_READABLE;
if (!streamingDoneReceiving)
wakeEvents |= WL_SOCKET_READABLE;
/* /*
* Use fresh timestamp, not last_processing, to reduce the chance * Use fresh timestamp, not last_processing, to reduce the chance
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment