Refactor PinBufferForBlock() to remove checks about persistence.
authorNoah Misch <[email protected]>
Sat, 20 Jul 2024 11:22:12 +0000 (04:22 -0700)
committerNoah Misch <[email protected]>
Sat, 20 Jul 2024 11:22:12 +0000 (04:22 -0700)
There are checks in PinBufferForBlock() function to set persistence of
the relation.  This function is called for each block in the relation.
Instead, set persistence of the relation before PinBufferForBlock().

Nazir Bilal Yavuz

Discussion: https://postgr.es/m/CAN55FZ0JKL6vk1xQp6rfOXiNFV1u1H0tJDPPGHWoiO3ea2Wc=A@mail.gmail.com

src/backend/storage/aio/read_stream.c
src/backend/storage/buffer/bufmgr.c
src/include/storage/bufmgr.h

index 74b9bae6313918411a2c9b2e1040021d6ff92144..58221649f270c3370cf68519984c6a639324183b 100644 (file)
@@ -551,7 +551,7 @@ read_stream_begin_relation(int flags,
    {
        stream->ios[i].op.rel = rel;
        stream->ios[i].op.smgr = RelationGetSmgr(rel);
-       stream->ios[i].op.smgr_persistence = 0;
+       stream->ios[i].op.persistence = rel->rd_rel->relpersistence;
        stream->ios[i].op.forknum = forknum;
        stream->ios[i].op.strategy = strategy;
    }
index db3eb2cce1ec84f8350a6612cbb45746f1088ef0..bdb36e5a30ec4bc3bc3f6da2043528d77c6f36b1 100644 (file)
@@ -1104,7 +1104,7 @@ ZeroAndLockBuffer(Buffer buffer, ReadBufferMode mode, bool already_valid)
 static pg_attribute_always_inline Buffer
 PinBufferForBlock(Relation rel,
                  SMgrRelation smgr,
-                 char smgr_persistence,
+                 char persistence,
                  ForkNumber forkNum,
                  BlockNumber blockNum,
                  BufferAccessStrategy strategy,
@@ -1113,14 +1113,13 @@ PinBufferForBlock(Relation rel,
    BufferDesc *bufHdr;
    IOContext   io_context;
    IOObject    io_object;
-   char        persistence;
 
    Assert(blockNum != P_NEW);
 
-   if (rel)
-       persistence = rel->rd_rel->relpersistence;
-   else
-       persistence = smgr_persistence;
+   /* Persistence should be set before */
+   Assert((persistence == RELPERSISTENCE_TEMP ||
+           persistence == RELPERSISTENCE_PERMANENT ||
+           persistence == RELPERSISTENCE_UNLOGGED));
 
    if (persistence == RELPERSISTENCE_TEMP)
    {
@@ -1195,6 +1194,7 @@ ReadBuffer_common(Relation rel, SMgrRelation smgr, char smgr_persistence,
    ReadBuffersOperation operation;
    Buffer      buffer;
    int         flags;
+   char        persistence;
 
    /*
     * Backward compatibility path, most code should use ExtendBufferedRel()
@@ -1216,12 +1216,17 @@ ReadBuffer_common(Relation rel, SMgrRelation smgr, char smgr_persistence,
        return ExtendBufferedRel(BMR_REL(rel), forkNum, strategy, flags);
    }
 
+   if (rel)
+       persistence = rel->rd_rel->relpersistence;
+   else
+       persistence = smgr_persistence;
+
    if (unlikely(mode == RBM_ZERO_AND_CLEANUP_LOCK ||
                 mode == RBM_ZERO_AND_LOCK))
    {
        bool        found;
 
-       buffer = PinBufferForBlock(rel, smgr, smgr_persistence,
+       buffer = PinBufferForBlock(rel, smgr, persistence,
                                   forkNum, blockNum, strategy, &found);
        ZeroAndLockBuffer(buffer, mode, found);
        return buffer;
@@ -1233,7 +1238,7 @@ ReadBuffer_common(Relation rel, SMgrRelation smgr, char smgr_persistence,
        flags = 0;
    operation.smgr = smgr;
    operation.rel = rel;
-   operation.smgr_persistence = smgr_persistence;
+   operation.persistence = persistence;
    operation.forknum = forkNum;
    operation.strategy = strategy;
    if (StartReadBuffer(&operation,
@@ -1264,7 +1269,7 @@ StartReadBuffersImpl(ReadBuffersOperation *operation,
 
        buffers[i] = PinBufferForBlock(operation->rel,
                                       operation->smgr,
-                                      operation->smgr_persistence,
+                                      operation->persistence,
                                       operation->forknum,
                                       blockNum + i,
                                       operation->strategy,
@@ -1410,10 +1415,8 @@ WaitReadBuffers(ReadBuffersOperation *operation)
    buffers = &operation->buffers[0];
    blocknum = operation->blocknum;
    forknum = operation->forknum;
+   persistence = operation->persistence;
 
-   persistence = operation->rel
-       ? operation->rel->rd_rel->relpersistence
-       : RELPERSISTENCE_PERMANENT;
    if (persistence == RELPERSISTENCE_TEMP)
    {
        io_context = IOCONTEXT_NORMAL;
index bc26a4536ff07d700bfe17ebb974e8e2c8918aac..c8422571b7f9454b53e93fa368af86721ce77716 100644 (file)
@@ -117,7 +117,7 @@ struct ReadBuffersOperation
    /* The following members should be set by the caller. */
    Relation    rel;            /* optional */
    struct SMgrRelationData *smgr;
-   char        smgr_persistence;   /* optional if rel != NULL */
+   char        persistence;
    ForkNumber  forknum;
    BufferAccessStrategy strategy;