sequences: Lock buffer before initializing page
authorAndres Freund <[email protected]>
Tue, 4 Apr 2023 23:38:06 +0000 (16:38 -0700)
committerAndres Freund <[email protected]>
Tue, 4 Apr 2023 23:42:52 +0000 (16:42 -0700)
fill_seq_fork_with_data(), used to initialize a new sequence relation, only
locked the buffer after calling PageInit(), even though PageInit() modifies
page contents.

This is unlikely to cause real-world issues, as the relation is exclusively
locked at that point, and the buffer not yet marked dirty, so other processes
should not access the buffer.

This issue looks to have been present since the introduction of sequences in
e8647c45d66a.

Given the low risk, it does not seem worth backpatching the fix.

Discussion: https://postgr.es/m/20230404185501[email protected]

src/backend/commands/sequence.c

index bfe279cddf1532f8b4ab4fddae1a2f6e3c2ab632..f3d1779655b9e35c71541a4675df636ea8d88dc8 100644 (file)
@@ -377,7 +377,7 @@ fill_seq_fork_with_data(Relation rel, HeapTuple tuple, ForkNumber forkNum)
 
    /* Initialize first page of relation with special magic number */
 
-   buf = ReadBufferExtended(rel, forkNum, P_NEW, RBM_NORMAL, NULL);
+   buf = ReadBufferExtended(rel, forkNum, P_NEW, RBM_ZERO_AND_LOCK, NULL);
    Assert(BufferGetBlockNumber(buf) == 0);
 
    page = BufferGetPage(buf);
@@ -388,8 +388,6 @@ fill_seq_fork_with_data(Relation rel, HeapTuple tuple, ForkNumber forkNum)
 
    /* Now insert sequence tuple */
 
-   LockBuffer(buf, BUFFER_LOCK_EXCLUSIVE);
-
    /*
     * Since VACUUM does not process sequences, we have to force the tuple to
     * have xmin = FrozenTransactionId now.  Otherwise it would become