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:48:01 +0000 (10:48 +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 13d9eb031dcf612ebc7737523936f51e6c27e970..5e41e1a9329a25ad53b4dc598e5b6c6d50ae0a7b 100644 (file)
@@ -429,7 +429,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->delayChkpt = false;
index 0ac91be63dc8013d02269cd635755343cb43991d..f563f2a1690aa013120b79c1e5a9b4946d82b41d 100644 (file)
@@ -409,7 +409,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();
 
@@ -1069,7 +1069,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 9e6500ff981bd3b855ce22b07c046819182844e2..6676e0cae5c22304f1cad70edbff5ecfb2c3c8f6 100644 (file)
@@ -586,6 +586,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
@@ -597,8 +617,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 c7dc19d540766b12014acebdf0cbe6736b35abba..6d4040575610c4a88e0fab278a33a4d478599a96 100644 (file)
@@ -101,8 +101,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);