mirror of
https://github.com/postgres/postgres.git
synced 2026-04-04 08:45:52 -04:00
Fix two issues in fast-path FK check introduced by commit 2da86c1ef9
First, under CLOBBER_CACHE_ALWAYS, the RI_ConstraintInfo entry can be invalidated by relcache callbacks triggered inside table_open() or index_open(), leaving ri_FastPathCheck() calling ri_populate_fastpath_metadata() with a stale entry whose valid flag is false. Fix by moving the fpmeta initialization to after ri_CheckPermissions(), reloading riinfo first to ensure it is valid, then calling ri_ExtractValues() and build_index_scankeys() immediately after before any further operations that could trigger invalidation. Second, fpmeta allocated in TopMemoryContext was not freed when the entry was invalidated in InvalidateConstraintCacheCallBack(), leaking memory each time the constraint cache entry was recycled. Fix by freeing and NULLing fpmeta at invalidation time. Noticed locally when testing with CLOBBER_CACHE_ALWAYS. Discussion: https://postgr.es/m/CA+HiwqGBU__7-VZZhQWQ3EQuwLYNPd9==ngnzduhGWKHMj9mvw@mail.gmail.com
This commit is contained in:
parent
f6bd9f0fe2
commit
e484b0eea6
1 changed files with 13 additions and 5 deletions
|
|
@ -2488,6 +2488,11 @@ InvalidateConstraintCacheCallBack(Datum arg, SysCacheIdentifier cacheid,
|
|||
riinfo->rootHashValue == hashvalue)
|
||||
{
|
||||
riinfo->valid = false;
|
||||
if (riinfo->fpmeta)
|
||||
{
|
||||
pfree(riinfo->fpmeta);
|
||||
riinfo->fpmeta = NULL;
|
||||
}
|
||||
/* Remove invalidated entries from the list, too */
|
||||
dclist_delete_from(&ri_constraint_cache_valid_list, iter.cur);
|
||||
}
|
||||
|
|
@ -2722,11 +2727,6 @@ ri_FastPathCheck(const RI_ConstraintInfo *riinfo,
|
|||
riinfo->nkeys, 0,
|
||||
SO_NONE);
|
||||
|
||||
if (riinfo->fpmeta == NULL)
|
||||
ri_populate_fastpath_metadata((RI_ConstraintInfo *) riinfo,
|
||||
fk_rel, idx_rel);
|
||||
Assert(riinfo->fpmeta);
|
||||
|
||||
GetUserIdAndSecContext(&saved_userid, &saved_sec_context);
|
||||
SetUserIdAndSecContext(RelationGetForm(pk_rel)->relowner,
|
||||
saved_sec_context |
|
||||
|
|
@ -2734,6 +2734,14 @@ ri_FastPathCheck(const RI_ConstraintInfo *riinfo,
|
|||
SECURITY_NOFORCE_RLS);
|
||||
ri_CheckPermissions(pk_rel);
|
||||
|
||||
if (riinfo->fpmeta == NULL)
|
||||
{
|
||||
/* Reload to ensure it's valid. */
|
||||
riinfo = ri_LoadConstraintInfo(riinfo->constraint_id);
|
||||
ri_populate_fastpath_metadata((RI_ConstraintInfo *) riinfo,
|
||||
fk_rel, idx_rel);
|
||||
}
|
||||
Assert(riinfo->fpmeta);
|
||||
ri_ExtractValues(fk_rel, newslot, riinfo, false, pk_vals, pk_nulls);
|
||||
build_index_scankeys(riinfo, idx_rel, pk_vals, pk_nulls, skey);
|
||||
found = ri_FastPathProbeOne(pk_rel, idx_rel, scandesc, slot,
|
||||
|
|
|
|||
Loading…
Reference in a new issue