Correct assertion and comments about XLogRecordMaxSize.
authorNoah Misch <noah@leadboat.com>
Sun, 1 Oct 2023 19:20:55 +0000 (12:20 -0700)
committerNoah Misch <noah@leadboat.com>
Sun, 1 Oct 2023 19:20:55 +0000 (12:20 -0700)
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
src/include/access/xlogrecord.h

index 258cbd703555ab6883e8d2bccb181efad632187f..588626424e6452cfa5a9a0e6d0a46dec29b0f769 100644 (file)
@@ -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
index f355e08e1d3171f59b31d2f53f025441efff58c0..ec9a3c802a3afb179368e90797ed68690bf900ca 100644 (file)
@@ -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)