diff options
Diffstat (limited to 'src/backend/utils/adt')
-rw-r--r-- | src/backend/utils/adt/ri_triggers.c | 19 |
1 files changed, 8 insertions, 11 deletions
diff --git a/src/backend/utils/adt/ri_triggers.c b/src/backend/utils/adt/ri_triggers.c index 1d503e7e011..61c2eecacaa 100644 --- a/src/backend/utils/adt/ri_triggers.c +++ b/src/backend/utils/adt/ri_triggers.c @@ -176,8 +176,7 @@ typedef struct RI_CompareHashEntry static HTAB *ri_constraint_cache = NULL; static HTAB *ri_query_cache = NULL; static HTAB *ri_compare_cache = NULL; -static dlist_head ri_constraint_cache_valid_list; -static int ri_constraint_cache_valid_count = 0; +static dclist_head ri_constraint_cache_valid_list; /* @@ -2172,10 +2171,9 @@ ri_LoadConstraintInfo(Oid constraintOid) /* * For efficient processing of invalidation messages below, we keep a - * doubly-linked list, and a count, of all currently valid entries. + * doubly-linked count list of all currently valid entries. */ - dlist_push_tail(&ri_constraint_cache_valid_list, &riinfo->valid_link); - ri_constraint_cache_valid_count++; + dclist_push_tail(&ri_constraint_cache_valid_list, &riinfo->valid_link); riinfo->valid = true; @@ -2233,13 +2231,13 @@ InvalidateConstraintCacheCallBack(Datum arg, int cacheid, uint32 hashvalue) * O(N^2) behavior in situations where a session touches many foreign keys * and also does many ALTER TABLEs, such as a restore from pg_dump. */ - if (ri_constraint_cache_valid_count > 1000) + if (dclist_count(&ri_constraint_cache_valid_list) > 1000) hashvalue = 0; /* pretend it's a cache reset */ - dlist_foreach_modify(iter, &ri_constraint_cache_valid_list) + dclist_foreach_modify(iter, &ri_constraint_cache_valid_list) { - RI_ConstraintInfo *riinfo = dlist_container(RI_ConstraintInfo, - valid_link, iter.cur); + RI_ConstraintInfo *riinfo = dclist_container(RI_ConstraintInfo, + valid_link, iter.cur); /* * We must invalidate not only entries directly matching the given @@ -2252,8 +2250,7 @@ InvalidateConstraintCacheCallBack(Datum arg, int cacheid, uint32 hashvalue) { riinfo->valid = false; /* Remove invalidated entries from the list, too */ - dlist_delete(iter.cur); - ri_constraint_cache_valid_count--; + dclist_delete_from(&ri_constraint_cache_valid_list, iter.cur); } } } |