]> granicus.if.org Git - postgresql/commit
Avoid potential deadlock in InitCatCachePhase2().
authorTom Lane <tgl@sss.pgh.pa.us>
Tue, 22 Mar 2011 17:00:24 +0000 (13:00 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Tue, 22 Mar 2011 17:00:48 +0000 (13:00 -0400)
commit1192ba8b67df1446973c71aafde5f6f613dce0af
treec5b0fbfa7b43cf1f4ed47b8ef3235b2eb24b378e
parent6e8e7cc580665ddd43c8ca2acc6d60f345570a57
Avoid potential deadlock in InitCatCachePhase2().

Opening a catcache's index could require reading from that cache's own
catalog, which of course would acquire AccessShareLock on the catalog.
So the original coding here risks locking index before heap, which could
deadlock against another backend trying to get exclusive locks in the
normal order.  Because InitCatCachePhase2 is only called when a backend
has to start up without a relcache init file, the deadlock was seldom seen
in the field.  (And by the same token, there's no need to worry about any
performance disadvantage; so not much point in trying to distinguish
exactly which catalogs have the risk.)

Bug report, diagnosis, and patch by Nikhil Sontakke.  Additional commentary
by me.  Back-patch to all supported branches.
src/backend/utils/cache/catcache.c
src/backend/utils/cache/relcache.c