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 >
