mirror of
https://git.postgresql.org/git/postgresql.git
synced 2025-02-17 19:30:00 +08:00
Revert "Cannot use WL_SOCKET_WRITEABLE without WL_SOCKET_READABLE."
This reverts commit3a9e64aa0d
. Commit4bad60e3
fixed the root of the problem that3a9e64aa
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
This commit is contained in:
parent
da214247de
commit
133a0906d5
@ -1434,7 +1434,12 @@ ProcessRepliesIfAny(void)
|
||||
|
||||
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();
|
||||
r = pq_getbyte_if_available(&firstchar);
|
||||
@ -1463,19 +1468,6 @@ ProcessRepliesIfAny(void)
|
||||
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 */
|
||||
switch (firstchar)
|
||||
{
|
||||
@ -1960,8 +1952,10 @@ WalSndLoop(WalSndSendDataCallback send_data)
|
||||
long sleeptime;
|
||||
int wakeEvents;
|
||||
|
||||
wakeEvents = WL_LATCH_SET | WL_POSTMASTER_DEATH | WL_TIMEOUT |
|
||||
WL_SOCKET_READABLE;
|
||||
wakeEvents = WL_LATCH_SET | WL_POSTMASTER_DEATH | WL_TIMEOUT;
|
||||
|
||||
if (!streamingDoneReceiving)
|
||||
wakeEvents |= WL_SOCKET_READABLE;
|
||||
|
||||
/*
|
||||
* Use fresh timestamp, not last_processed, to reduce the chance
|
||||
|
Loading…
Reference in New Issue
Block a user