Re: pg_restore causing deadlocks on partitioned tables
Tom Lane <tgl@sss.pgh.pa.us>
From: Tom Lane <tgl@sss.pgh.pa.us>
To: Alvaro Herrera <alvherre@2ndquadrant.com>
Cc: Domagoj Smoljanovic <domagoj.smoljanovic@oradian.com>,
"pgsql-hackers@postgresql.org" <pgsql-hackers@postgresql.org>
Date: 2020-09-15T00:08:58Z
Lists: pgsql-hackers
Attachments
- avoid-useless-recursion-for-SET-NOT-NULL.patch (text/x-diff) patch
I wrote: >> (2) ALTER TABLE ONLY ... ADD CONSTRAINT on a partition root tries to get >> AccessExclusiveLock on all child partitions, despite the ONLY. > The cause of this seems to be that ATPrepSetNotNull is too dumb to > avoid recursing to all the child tables when the parent is already > attnotnull. Or is there a reason we have to recurse anyway? I wrote a quick patch for this part. It seems pretty safe and probably could be back-patched without fear. (I also noticed that ATSimpleRecursion is being unnecessarily stupid: instead of the demonstrably not-future-proof relkind check, it could test relhassubclass, which is not only simpler and less likely to need future changes, but is able to save a scan of pg_inherits in a lot more cases.) As far as I can tell in some quick testing, this fix is sufficient to resolve the complained-of deadlock. It'd still be a good idea to fix the TRUNCATE side of things as well. But that would be hard to back-patch because removing ri_PartitionCheck, or even just failing to fill it, seems like a potential ABI break for extensions. So my proposal is to back-patch this, but address the ResultRelInfo change only in HEAD. regards, tom lane
Commits
-
Don't fetch partition check expression during InitResultRelInfo.
- 2000b6c10aa6 14.0 landed
-
Avoid unnecessary recursion to child tables in ALTER TABLE SET NOT NULL.
- e5fac1cb1941 14.0 landed
- 511690ec5dcc 12.5 landed
- 17280b31c2f2 13.0 landed