From e1f95ec8cf6ea75d90905b2c746e2e1e9f3c9fc1 Mon Sep 17 00:00:00 2001 From: Noah Misch Date: Sun, 1 Oct 2023 12:20:55 -0700 Subject: [PATCH] Correct assertion and comments about XLogRecordMaxSize. The largest allocation, of xl_tot_len+8192, is in allocate_recordbuf(). Discussion: https://postgr.es/m/20230812211327.GB2326466@rfd.leadboat.com --- src/backend/access/transam/xloginsert.c | 9 +++++---- src/include/access/xlogrecord.h | 4 ++-- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/backend/access/transam/xloginsert.c b/src/backend/access/transam/xloginsert.c index 258cbd70355..588626424e6 100644 --- a/src/backend/access/transam/xloginsert.c +++ b/src/backend/access/transam/xloginsert.c @@ -897,8 +897,7 @@ XLogRecordAssemble(RmgrId rmid, uint8 info, * * XLogReader machinery is only able to handle records up to a certain * size (ignoring machine resource limitations), so make sure that we will - * not emit records larger than the sizes advertised to be supported. This - * cap is based on DecodeXLogRecordRequiredSpace(). + * not emit records larger than the sizes advertised to be supported. */ if (total_len > XLogRecordMaxSize) ereport(ERROR, @@ -1339,10 +1338,12 @@ InitXLogInsert(void) /* * Check that any records assembled can be decoded. This is capped based - * on what XLogReader would require at its maximum bound. This code path + * on what XLogReader would require at its maximum bound. The XLOG_BLCKSZ + * addend covers the larger allocate_recordbuf() demand. This code path * is called once per backend, more than enough for this check. */ - size_t max_required = DecodeXLogRecordRequiredSpace(XLogRecordMaxSize); + size_t max_required = + DecodeXLogRecordRequiredSpace(XLogRecordMaxSize + XLOG_BLCKSZ); Assert(AllocSizeIsValid(max_required)); #endif diff --git a/src/include/access/xlogrecord.h b/src/include/access/xlogrecord.h index f355e08e1d3..ec9a3c802a3 100644 --- a/src/include/access/xlogrecord.h +++ b/src/include/access/xlogrecord.h @@ -68,8 +68,8 @@ typedef struct XLogRecord * in length if we ignore any allocation overhead of the XLogReader. * * To accommodate some overhead, this value allows for 4M of allocation - * overhead, that should be plenty enough for what - * DecodeXLogRecordRequiredSpace() expects as extra. + * overhead, that should be plenty enough for what the XLogReader + * infrastructure expects as extra. */ #define XLogRecordMaxSize (1020 * 1024 * 1024) -- 2.30.2