mirror of
https://github.com/postgres/postgres.git
synced 2025-07-27 12:41:57 +03:00
Don't destroy SMgrRelations at relcache invalidation
With commit21d9c3ee4e
, SMgrRelations remain valid until end of transaction (or longer if they're "pinned"). Relcache invalidation can happen in the middle of a transaction, so we must not destroy them at relcache invalidation anymore. This was revealed by failures in the 'constraints' test in buildfarm animals using -DCLOBBER_CACHE_ALWAYS. That started failing with commit8af2565248
, which was the first commit that started to rely on an SMgrRelation living until end of transaction. Diagnosed-by: Tomas Vondra, Thomas Munro Reviewed-by: Thomas Munro Discussion: https://www.postgresql.org/message-id/CA%2BhUKGK%2B5DOmLaBp3Z7C4S-Yv6yoROvr1UncjH2S1ZbPT8D%2BZg%40mail.gmail.com
This commit is contained in:
@ -348,8 +348,6 @@ smgrdestroyall(void)
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* smgrreleaseall() -- Release resources used by all objects.
|
* smgrreleaseall() -- Release resources used by all objects.
|
||||||
*
|
|
||||||
* This is called for PROCSIGNAL_BARRIER_SMGRRELEASE.
|
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
smgrreleaseall(void)
|
smgrreleaseall(void)
|
||||||
|
10
src/backend/utils/cache/relcache.c
vendored
10
src/backend/utils/cache/relcache.c
vendored
@ -2985,9 +2985,6 @@ RelationCacheInvalidate(bool debug_discard)
|
|||||||
{
|
{
|
||||||
relation = idhentry->reldesc;
|
relation = idhentry->reldesc;
|
||||||
|
|
||||||
/* Must close all smgr references to avoid leaving dangling ptrs */
|
|
||||||
RelationCloseSmgr(relation);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Ignore new relations; no other backend will manipulate them before
|
* Ignore new relations; no other backend will manipulate them before
|
||||||
* we commit. Likewise, before replacing a relation's relfilelocator,
|
* we commit. Likewise, before replacing a relation's relfilelocator,
|
||||||
@ -3039,11 +3036,10 @@ RelationCacheInvalidate(bool debug_discard)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Now zap any remaining smgr cache entries. This must happen before we
|
* We cannot destroy the SMgrRelations as there might still be references
|
||||||
* start to rebuild entries, since that may involve catalog fetches which
|
* to them, but close the underlying file descriptors.
|
||||||
* will re-open catalog files.
|
|
||||||
*/
|
*/
|
||||||
smgrdestroyall();
|
smgrreleaseall();
|
||||||
|
|
||||||
/* Phase 2: rebuild the items found to need rebuild in phase 1 */
|
/* Phase 2: rebuild the items found to need rebuild in phase 1 */
|
||||||
foreach(l, rebuildFirstList)
|
foreach(l, rebuildFirstList)
|
||||||
|
Reference in New Issue
Block a user