postgres.git / summary / log / commit / refs

commit    126ec0bc76d044d3a9eb86538b61242bf7da6db4
Author:   Tom Lane <tgl@sss.pgh.pa.us>
Date:     Fri Sep 20 00:58:17 2024 +0000
First released in: 18.0

    Restore relmapper state early enough in parallel workers.
    
    We need to do RestoreRelationMap before loading catalog-derived
    state, else the worker may end up with catalog relcache entries
    containing stale relfilenode data.  Move up RestoreReindexState
    too, on the principle that that should also happen before we
    do much of any catalog access.
    
    I think ideally these things would happen even before InitPostgres,
    but there are various problems standing in the way of that, notably
    that the relmapper thinks "active" mappings should be discarded at
    transaction end.  The implication of this is that InitPostgres and
    RestoreLibraryState will see the same catalog state as an independent
    backend would see, which is probably fine; at least, it's been like
    that all along.
    
    Per report from Justin Pryzby.  There is a case to be made that
    this should be back-patched.  But given the lack of complaints
    before 6e086fa2e and the short amount of time remaining before
    17.0 wraps, I'll just put it in HEAD for now.
    
    Discussion: https://postgr.es/m/ZuoU_8EbSTE14o1U@pryzbyj2023


src/backend/access/transam/parallel.c | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c index 9aba17bd5e9..d4e84aabac7 100644 --- a/src/backend/access/transam/parallel.c +++ b/src/backend/access/transam/parallel.c @@ -1420,6 +1420,17 @@ ParallelWorkerMain(Datum main_arg) tstatespace = shm_toc_lookup(toc, PARALLEL_KEY_TRANSACTION_STATE, false); StartParallelWorkerTransaction(tstatespace); + /* + * Restore relmapper and reindex state early, since these affect catalog + * access. Ideally we'd do this even before calling InitPostgres, but + * that has order-of-initialization problems, and also the relmapper would + * get confused during the CommitTransactionCommand call above. + */ + relmapperspace = shm_toc_lookup(toc, PARALLEL_KEY_RELMAPPER_STATE, false); + RestoreRelationMap(relmapperspace); + reindexspace = shm_toc_lookup(toc, PARALLEL_KEY_REINDEX_STATE, false); + RestoreReindexState(reindexspace); + /* Restore combo CID state. */ combocidspace = shm_toc_lookup(toc, PARALLEL_KEY_COMBO_CID, false); RestoreComboCIDState(combocidspace); @@ -1482,14 +1493,6 @@ ParallelWorkerMain(Datum main_arg) false); RestorePendingSyncs(pendingsyncsspace); - /* Restore reindex state. */ - reindexspace = shm_toc_lookup(toc, PARALLEL_KEY_REINDEX_STATE, false); - RestoreReindexState(reindexspace); - - /* Restore relmapper state. */ - relmapperspace = shm_toc_lookup(toc, PARALLEL_KEY_RELMAPPER_STATE, false); - RestoreRelationMap(relmapperspace); - /* Restore uncommitted enums. */ uncommittedenumsspace = shm_toc_lookup(toc, PARALLEL_KEY_UNCOMMITTEDENUMS, false); [parent: 91287b5f5da3]