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

Reply via email to