[PATCH] Add missing XLogEnsureRecordSpace() call in LogLogicalMessage

Started by Henson Choi13 days ago2 messages
#1Henson 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

#2Henson Choi
assam258@gmail.com
In reply to: Henson Choi (#1)
Re: [PATCH] Add missing XLogEnsureRecordSpace() call in LogLogicalMessage

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>님이 작성:

Show quoted text

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