Re: Fix typo about WalSndPrepareWrite - Mailing list pgsql-hackers
| From | Kyotaro Horiguchi |
|---|---|
| Subject | Re: Fix typo about WalSndPrepareWrite |
| Date | |
| Msg-id | 20210114.163227.206646911586496139.horikyota.ntt@gmail.com Whole thread Raw |
| In response to | Re: Fix typo about WalSndPrepareWrite (Li Japin <japinli@hotmail.com>) |
| Responses |
Re: Fix typo about WalSndPrepareWrite
|
| List | pgsql-hackers |
At Thu, 14 Jan 2021 06:46:35 +0000, Li Japin <japinli@hotmail.com> wrote in
>
> On Jan 14, 2021, at 12:56 PM, Ashutosh Bapat <ashutosh.bapat.oss@gmail.com<mailto:ashutosh.bapat.oss@gmail.com>>
wrote:
>
> Hi Japin,
> Thanks for the report.
>
> I think that comment is correct. It refers to the following code
> blocks of XLogSendPhysical()
>
> 2744 /*
> 2745 * OK to read and send the slice.
> 2746 */
> 2747 resetStringInfo(&output_message);
> 2748 pq_sendbyte(&output_message, 'w');
> 2749
> 2750 pq_sendint64(&output_message, startptr); /* dataStart */
> 2751 pq_sendint64(&output_message, SendRqstPtr); /* walEnd */
> 2752 pq_sendint64(&output_message, 0); /* sendtime, filled in last */
>
> 2803 * Fill the send timestamp last, so that it is taken as late
> as possible.
> 2804 */
> 2805 resetStringInfo(&tmpbuf);
> 2806 pq_sendint64(&tmpbuf, GetCurrentTimestamp());
> 2807 memcpy(&output_message.data[1 + sizeof(int64) + sizeof(int64)],
> 2808 tmpbuf.data, sizeof(int64));
> 2809
> 2810 pq_putmessage_noblock('d', output_message.data, output_message.len);
>
>
> After a quick search, I found that WalSndPrepareWrite and WalSndWriteData are always pairs [1].
> IIUC the space of sendtime leave by WalSndPrepareWrite, it always fill out by WalSndWriteData.
>
>
> WalSndWriteData() also fills the timestamp there but it may not always
> be used with WalSndPrepareWrite, at least theoretically. So it's the
> XLogSendPhysical() that it's referring to.
The two functions are the body of two logical-decoding API
functions. They are assumed to be called in that order. See
OutputPluginWrite() for the restriction. The sequence of the two
logica-decoding funcitons and the code block in XLogSendPhysical are
parallels in (theoretically) different protocols.
> Maybe a better way is to separate those two codeblocks into functions
> and use it in WalSndPrepareWrite, WalSndWriteData and XLogSendPhysical
> appropriately. That way we don't have to add a comment like that and
> the sanity of 'w' message is preserved.
>
> Sure, we can write a separate function to fill out the sendtime. Any thoughts?
So I put -1 since they (physical and logical, not prepare and write)
are for distinct protocols.
> [1]
> src/backend/replication/walsender.c:247:static void WalSndPrepareWrite(LogicalDecodingContext *ctx, XLogRecPtr lsn,
TransactionIdxid, bool last_write);
> src/backend/replication/walsender.c:1015:
WalSndPrepareWrite, WalSndWriteData,
> src/backend/replication/walsender.c:1176: WalSndPrepareWrite,
WalSndWriteData,
> src/backend/replication/walsender.c:1233:WalSndPrepareWrite(LogicalDecodingContext *ctx, XLogRecPtr lsn,
TransactionIdxid, bool last_write)
> src/backend/replication/walsender.c:1255: * Actually write out data previously prepared by WalSndPrepareWrite out to
regards.
--
Kyotaro Horiguchi
NTT Open Source Software Center
pgsql-hackers by date: