Re: [PATCH] Add missing XLogEnsureRecordSpace() call in LogLogicalMessage
Henson Choi <assam258@gmail.com>
From: Henson Choi <assam258@gmail.com>
To: pgsql-hackers <pgsql-hackers@lists.postgresql.org>
Date: 2025-12-30T01:59:16Z
Lists: pgsql-hackers
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 <assam258@gmail.com>님이 작성:
> 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
>