pgsql: Reduce overhead of cache-clobber testing in LookupOpclassInfo(). - Mailing list pgsql-committers

From Tom Lane
Subject pgsql: Reduce overhead of cache-clobber testing in LookupOpclassInfo().
Date
Msg-id E1m0Vaj-0007Pw-0l@gemulon.postgresql.org
Whole thread Raw
List pgsql-committers
Reduce overhead of cache-clobber testing in LookupOpclassInfo().

Commit 03ffc4d6d added logic to bypass all caching behavior in
LookupOpclassInfo when CLOBBER_CACHE_ALWAYS is enabled.  It doesn't
look like I stopped to think much about what that would cost, but
recent investigation shows that the cost is enormous: it roughly
doubles the time needed for cache-clobber test runs.

There does seem to be value in this behavior when trying to test
the opclass-cache loading logic itself, but for other purposes the
cost is excessive.  Hence, let's back off to doing this only when
debug_invalidate_system_caches_always is at least 3; or in older
branches, when CLOBBER_CACHE_RECURSIVELY is defined.

While here, clean up some other minor issues in LookupOpclassInfo.
Re-order the code so we aren't left with broken cache entries (leading
to later core dumps) in the unlikely case that we suffer OOM while
trying to allocate space for a new entry.  (That seems to be my
oversight in 03ffc4d6d.)  Also, in >= v13, stop allocating one array
entry too many.  That's evidently left over from sloppy reversion in
851b14b0c.

Back-patch to all supported branches, mainly to reduce the runtime
of cache-clobbering buildfarm animals.

Discussion: https://postgr.es/m/1370856.1625428625@sss.pgh.pa.us

Branch
------
REL9_6_STABLE

Details
-------
https://git.postgresql.org/pg/commitdiff/b82eabec300e987e5147c535e93b21f1ef0ea258

Modified Files
--------------
src/backend/utils/cache/relcache.c | 43 ++++++++++++++++++++------------------
1 file changed, 23 insertions(+), 20 deletions(-)


pgsql-committers by date:

Previous
From: Tom Lane
Date:
Subject: pgsql: Reduce overhead of cache-clobber testing in LookupOpclassInfo().
Next
From: Michael Paquier
Date:
Subject: pgsql: Use WaitLatch() instead of pg_usleep() at the end of backups