Make smgr access for a BufferManagerRelation safer in relcache inval
authorÁlvaro Herrera <alvherre@kurilemu.de>
Tue, 21 Oct 2025 07:51:55 +0000 (10:51 +0300)
committerÁlvaro Herrera <alvherre@kurilemu.de>
Tue, 21 Oct 2025 07:51:55 +0000 (10:51 +0300)
Currently there's no bug, because we have no code path where we
invalidate relcache entries where it'd cause a problem.  But it's more
robust to do it this way in case we introduce such a path later, as some
Postgres forks reportedly already have.

Author: Daniil Davydov <3danissimo@gmail.com>
Reviewed-by: Stepan Neretin <slpmcf@gmail.com>
Discussion: https://postgr.es/m/CAJDiXgj3FNzAhV+jjPqxMs3jz=OgPohsoXFj_fh-L+nS+13CKQ@mail.gmail.com

src/backend/storage/buffer/bufmgr.c
src/backend/storage/buffer/localbuf.c
src/include/storage/bufmgr.h

index edf17ce3ea14fe46fad38a3cb468d82355c75016..e8544acb7841d86ae577ea032964680e192dc52e 100644 (file)
@@ -883,14 +883,11 @@ ExtendBufferedRelBy(BufferManagerRelation bmr,
                                        uint32 *extended_by)
 {
        Assert((bmr.rel != NULL) != (bmr.smgr != NULL));
-       Assert(bmr.smgr == NULL || bmr.relpersistence != 0);
+       Assert(bmr.smgr == NULL || bmr.relpersistence != '\0');
        Assert(extend_by > 0);
 
-       if (bmr.smgr == NULL)
-       {
-               bmr.smgr = RelationGetSmgr(bmr.rel);
+       if (bmr.relpersistence == '\0')
                bmr.relpersistence = bmr.rel->rd_rel->relpersistence;
-       }
 
        return ExtendBufferedRelCommon(bmr, fork, strategy, flags,
                                                                   extend_by, InvalidBlockNumber,
@@ -919,14 +916,11 @@ ExtendBufferedRelTo(BufferManagerRelation bmr,
        Buffer          buffers[64];
 
        Assert((bmr.rel != NULL) != (bmr.smgr != NULL));
-       Assert(bmr.smgr == NULL || bmr.relpersistence != 0);
+       Assert(bmr.smgr == NULL || bmr.relpersistence != '\0');
        Assert(extend_to != InvalidBlockNumber && extend_to > 0);
 
-       if (bmr.smgr == NULL)
-       {
-               bmr.smgr = RelationGetSmgr(bmr.rel);
+       if (bmr.relpersistence == '\0')
                bmr.relpersistence = bmr.rel->rd_rel->relpersistence;
-       }
 
        /*
         * If desired, create the file if it doesn't exist.  If