postgres.git / summary / log / commit / refs

commit    01805b7d16b9a06d5223071215db0337bc8e6d92
Author:   Daniel Gustafsson <dgustafsson@postgresql.org>
Date:     Tue Aug 04 10:16:55 2026 +0000

    Do not reuse rd_smgr in fork loop when enabling data checksums
    
    ProcessSingleRelationByOid called RelationGetSmgr(rel), discarded the
    result, and then read rel->rd_smgr directly when looping over forks.
    Only RelationGetSmgr is authorized to read that field since a relcache
    invalidation resets rd_smgr to NULL.
    
    Backpatch to v19 where online checksums were introduced.
    
    Author: Mihail Nikalayeu <mihailnikalayeu@gmail.com>
    Reviewed-by: ChangAo Chen <cca5507@qq.com>
    Reviewed-by: Fujii Masao <masao.fujii@gmail.com>
    Discussion: https://postgr.es/m/CADzfLwXGvb4Y-mqy8T+O0f_tkXR1sTDBGzP5Z=V_qcGnZ46rWg@mail.gmail.com
    Backpatch-through: 19


src/backend/postmaster/datachecksum_state.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/backend/postmaster/datachecksum_state.c b/src/backend/postmaster/datachecksum_state.c index 122640b0a9a..368df23e967 100644 --- a/src/backend/postmaster/datachecksum_state.c +++ b/src/backend/postmaster/datachecksum_state.c @@ -841,11 +841,10 @@ ProcessSingleRelationByOid(Oid relationId, BufferAccessStrategy strategy) pgstat_report_activity(STATE_IDLE, NULL); return true; } - RelationGetSmgr(rel); for (ForkNumber fnum = 0; fnum <= MAX_FORKNUM; fnum++) { - if (smgrexists(rel->rd_smgr, fnum)) + if (smgrexists(RelationGetSmgr(rel), fnum)) { if (!ProcessSingleRelationFork(rel, fnum, strategy)) { [parent: 1f24c823720d]