Hi hackers,

After further investigation, I'm withdrawing this patch.

I mistakenly thought XLogEnsureRecordSpace() was called before
every XLogBeginInsert(), but this is not the case. Many call sites
rely on the default MAX_GENERIC_XLOG_RDATAS allocation when their
rdata count is known to be small.

LogLogicalMessage() is working as intended. Sorry for the noise.

Best regards,
Henson

2025년 12월 30일 (화) AM 10:21, Henson Choi <[email protected]>님이 작성:

> Hi hackers,
>
> LogLogicalMessage() in src/backend/replication/logical/message.c is
> missing the XLogEnsureRecordSpace() call that appears before every
> other XLogBeginInsert() in the codebase.
>
> While this currently works because the 3 rdatas used here fit within
> the default allocation of MAX_GENERIC_XLOG_RDATAS (20), this pattern
> inconsistency could cause issues if:
>
> 1. MAX_GENERIC_XLOG_RDATAS is reduced in the future
> 2. This function is modified to use more rdatas
> 3. Someone copies this code without realizing the omission
>
> All other WAL insertion code follows the pattern of calling
> XLogEnsureRecordSpace() before XLogBeginInsert(). This patch adds
> the missing call for consistency.
>
>  XLogRecPtr
>  LogLogicalMessage(const char *prefix, const char *message, size_t size,
>                    bool transactional, bool flush)
>  {
>      ...
>      xlrec.prefix_size = strlen(prefix) + 1;
>      xlrec.message_size = size;
>
> +    XLogEnsureRecordSpace(0, 3);
>      XLogBeginInsert();
>      XLogRegisterData(&xlrec, SizeOfLogicalMessage);
>      XLogRegisterData(prefix, xlrec.prefix_size);
>      XLogRegisterData(message, size);
>      ...
>  }
>
> Best regards,
> Henson
>

Reply via email to