Restore smgrtruncate() prototype in back-branches.
authorThomas Munro <tmunro@postgresql.org>
Tue, 7 Jan 2025 18:50:30 +0000 (07:50 +1300)
committerThomas Munro <tmunro@postgresql.org>
Tue, 7 Jan 2025 21:46:45 +0000 (10:46 +1300)
It's possible that external code is calling smgrtruncate().  Any
external callers might like to consider the recent changes to
RelationTruncate(), but commit 38c579b0 should not have changed the
function prototype in the back-branches, per ABI stability policy.

Restore smgrtruncate()'s traditional argument list in the back-branches,
but make it a wrapper for a new function smgrtruncate2().  The three
callers in core can use smgrtruncate2() directly.  In master (18-to-be),
smgrtruncate2() is effectively renamed to smgrtruncate(), so this wart
is cleaned up.

Reviewed-by: Michael Paquier <michael@paquier.xyz>
Discussion: https://postgr.es/m/CA%2BhUKG%2BThae6x6%2BjmQiuALQBT2Ae1ChjMh1%3DkMvJ8y_SBJZrvA%40mail.gmail.com

contrib/pg_visibility/pg_visibility.c
src/backend/catalog/storage.c
src/backend/storage/smgr/smgr.c
src/include/storage/smgr.h

index 8c2a493ad2ecbccdc28924df79b6ecc465c778de..e6ae90c1cac05417538ff5772f30b414e8d4e2d6 100644 (file)
@@ -421,7 +421,7 @@ pg_truncate_visibility_map(PG_FUNCTION_ARGS)
    }
 
    if (BlockNumberIsValid(block))
-       smgrtruncate(RelationGetSmgr(rel), &fork, 1, &old_block, &block);
+       smgrtruncate2(RelationGetSmgr(rel), &fork, 1, &old_block, &block);
 
    END_CRIT_SECTION();
    MyProc->delayChkptFlags &= ~(DELAY_CHKPT_START | DELAY_CHKPT_COMPLETE);
index 740c6f4d921f2ed7fa94a00275283bbc700b6c94..56dc9469843e6a0613f7407c6a0e24237223073d 100644 (file)
@@ -417,7 +417,7 @@ RelationTruncate(Relation rel, BlockNumber nblocks)
     * longer exist after truncation is complete, and then truncate the
     * corresponding files on disk.
     */
-   smgrtruncate(RelationGetSmgr(rel), forks, nforks, old_blocks, blocks);
+   smgrtruncate2(RelationGetSmgr(rel), forks, nforks, old_blocks, blocks);
 
    END_CRIT_SECTION();
 
@@ -1077,7 +1077,7 @@ smgr_redo(XLogReaderState *record)
        if (nforks > 0)
        {
            START_CRIT_SECTION();
-           smgrtruncate(reln, forks, nforks, old_blocks, blocks);
+           smgrtruncate2(reln, forks, nforks, old_blocks, blocks);
            END_CRIT_SECTION();
        }
 
index 7b5d6754bb91cb3ebb278b45b63b470a59d67b78..152545c30205b79aa8ccd5cf7fe7c1403ce2493c 100644 (file)
@@ -647,6 +647,26 @@ smgrnblocks_cached(SMgrRelation reln, ForkNumber forknum)
  * smgrtruncate() -- Truncate the given forks of supplied relation to
  *                  each specified numbers of blocks
  *
+ * Backward-compatible version of smgrtruncate2() for the benefit of external
+ * callers.  This version isn't used in PostgreSQL core code, and can't be
+ * used in a critical section.
+ */
+void
+smgrtruncate(SMgrRelation reln, ForkNumber *forknum, int nforks,
+            BlockNumber *nblocks)
+{
+   BlockNumber old_nblocks[MAX_FORKNUM + 1];
+
+   for (int i = 0; i < nforks; ++i)
+       old_nblocks[i] = smgrnblocks(reln, forknum[i]);
+
+   return smgrtruncate2(reln, forknum, nforks, old_nblocks, nblocks);
+}
+
+/*
+ * smgrtruncate2() -- Truncate the given forks of supplied relation to
+ *                   each specified numbers of blocks
+ *
  * The truncation is done immediately, so this can't be rolled back.
  *
  * The caller must hold AccessExclusiveLock on the relation, to ensure that
@@ -658,8 +678,8 @@ smgrnblocks_cached(SMgrRelation reln, ForkNumber forknum)
  * to this relation should be called in between.
  */
 void
-smgrtruncate(SMgrRelation reln, ForkNumber *forknum, int nforks,
-            BlockNumber *old_nblocks, BlockNumber *nblocks)
+smgrtruncate2(SMgrRelation reln, ForkNumber *forknum, int nforks,
+             BlockNumber *old_nblocks, BlockNumber *nblocks)
 {
    int         i;
 
index 8b1157541afbc0618fbc29e94d36b22ae7d6dd29..b9a5b992f350ee8a22a806544791433fb52c75f2 100644 (file)
@@ -105,8 +105,10 @@ extern void smgrwriteback(SMgrRelation reln, ForkNumber forknum,
 extern BlockNumber smgrnblocks(SMgrRelation reln, ForkNumber forknum);
 extern BlockNumber smgrnblocks_cached(SMgrRelation reln, ForkNumber forknum);
 extern void smgrtruncate(SMgrRelation reln, ForkNumber *forknum, int nforks,
-                        BlockNumber *old_nblocks,
                         BlockNumber *nblocks);
+extern void smgrtruncate2(SMgrRelation reln, ForkNumber *forknum, int nforks,
+                         BlockNumber *old_nblocks,
+                         BlockNumber *nblocks);
 extern void smgrimmedsync(SMgrRelation reln, ForkNumber forknum);
 extern void AtEOXact_SMgr(void);
 extern bool ProcessBarrierSmgrRelease(void);