On Mon, Oct 31, 2016 at 10:54 PM, Andres Freund <and...@anarazel.de> wrote: > On 2016-10-31 09:44:16 -0400, Robert Haas wrote: >> On Mon, Oct 31, 2016 at 4:59 AM, Andres Freund <and...@anarazel.de> wrote: >> > I^Wsomebody appears to have made a number of dumb mistakes in >> > WalSndWriteData(), namely: >> > 1) The timestamp is set way too late, after >> > pq_putmessage_noblock(). That'll sometimes work, sometimes not. I >> > have no idea how that ended up happening. It's eye-wateringly dumb. >> > >> > 2) We only do WalSndKeepaliveIfNecessary() if we're blocked on socket >> > IO. But on a long-lived connection that might be a lot of data, we >> > should really do that once *before* trying to send the payload in the >> > first place. >> > >> > 3) Similarly to 2) it might be worthwhile checking for interrupts >> > everytime, not just when blocked on network IO. >> > >> > See also: >> > http://archives.postgresql.org/message-id/CAMsr%2BYE2dSfHVr7iEv1GSPZihitWX-PMkD9QALEGcTYa%2Bsdsgg%40mail.gmail.com >> >> Do you intend to do something about these problems? > > At least 1) and 2), yes. I basically wrote this email to have something > to reference in my todo list...
Just looking at this thread, 1) and 2) is actually something like the attached? -- Michael
diff --git a/src/backend/replication/walsender.c b/src/backend/replication/walsender.c index bc5e508..8b3207c 100644 --- a/src/backend/replication/walsender.c +++ b/src/backend/replication/walsender.c @@ -1073,9 +1073,6 @@ static void WalSndWriteData(LogicalDecodingContext *ctx, XLogRecPtr lsn, TransactionId xid, bool last_write) { - /* output previously gathered data in a CopyData packet */ - pq_putmessage_noblock('d', ctx->out->data, ctx->out->len); - /* * Fill the send timestamp last, so that it is taken as late as possible. * This is somewhat ugly, but the protocol's set as it's already used for @@ -1086,6 +1083,9 @@ WalSndWriteData(LogicalDecodingContext *ctx, XLogRecPtr lsn, TransactionId xid, memcpy(&ctx->out->data[1 + sizeof(int64) + sizeof(int64)], tmpbuf.data, sizeof(int64)); + /* output previously gathered data in a CopyData packet */ + pq_putmessage_noblock('d', ctx->out->data, ctx->out->len); + /* fast path */ /* Try to flush pending output to the client */ if (pq_flush_if_writable() != 0) @@ -1120,6 +1120,11 @@ WalSndWriteData(LogicalDecodingContext *ctx, XLogRecPtr lsn, TransactionId xid, SyncRepInitConfig(); } + now = GetCurrentTimestamp(); + + /* Send keepalive if the time has come */ + WalSndKeepaliveIfNecessary(now); + /* Check for input from the client */ ProcessRepliesIfAny(); @@ -1131,14 +1136,9 @@ WalSndWriteData(LogicalDecodingContext *ctx, XLogRecPtr lsn, TransactionId xid, if (!pq_is_send_pending()) break; - now = GetCurrentTimestamp(); - /* die if timeout was reached */ WalSndCheckTimeOut(now); - /* Send keepalive if the time has come */ - WalSndKeepaliveIfNecessary(now); - sleeptime = WalSndComputeSleeptime(now); wakeEvents = WL_LATCH_SET | WL_POSTMASTER_DEATH |
-- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers