Thread

  1. Re: [PATCH] Add missing XLogEnsureRecordSpace() call in LogLogicalMessage

    Henson Choi <assam258@gmail.com> — 2025-12-30T01:59:16Z

    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
    >