Hmm, this looks quite nice and simple. My only comment is that a sequence like this
/* Read from WAL buffers, if available. */ rbytes = XLogReadFromBuffers(&output_message.data[output_message.len], startptr, nbytes, xlogreader->seg.ws_tli); output_message.len += rbytes; startptr += rbytes; nbytes -= rbytes; if (!WALRead(xlogreader, &output_message.data[output_message.len], startptr, leaves you wondering if WALRead() should be called at all or not, in the case when all bytes were read by XLogReadFromBuffers. I think in many cases what's going to happen is that nbytes is going to be zero, and then WALRead is going to return having done nothing in its inner loop. I think this warrants a comment somewhere. Alternatively, we could short-circuit the 'if' expression so that WALRead() is not called in that case (but I'm not sure it's worth the loss of code clarity). Also, but this is really quite minor, it seems sad to add more functions with the prefix XLog, when we have renamed things to use the prefix WAL, and we have kept the old names only to avoid backpatchability issues. I mean, if we have WALRead() already, wouldn't it make perfect sense to name the new routine WALReadFromBuffers? -- Álvaro Herrera 48°01'N 7°57'E — https://www.EnterpriseDB.com/ "Tiene valor aquel que admite que es un cobarde" (Fernandel)