Re: ALTER TABLE .. DETACH PARTITION CONCURRENTLY
Alvaro Herrera <alvherre@alvh.no-ip.org>
From: Alvaro Herrera <alvherre@alvh.no-ip.org>
To: Amit Langote <amitlangote09@gmail.com>
Cc: Justin Pryzby <pryzby@telsasoft.com>, Tom Lane <tgl@sss.pgh.pa.us>, PostgreSQL Hackers <pgsql-hackers@lists.postgresql.org>
Date: 2021-04-22T19:26:02Z
Lists: pgsql-hackers
On 2021-Apr-22, Amit Langote wrote: > On Thu, Apr 22, 2021 at 5:39 AM Alvaro Herrera <alvherre@alvh.no-ip.org> wrote: > Reading through the latest one, seeing both include_detached and > omit_detached being used in different parts of the code makes it a bit > hard to keep in mind what a given code path is doing wrt detached > partitions. How about making it all omit_detached? Yeah, I hesitated but wanted to do that too. Done. > * Cope with partitions concurrently being detached. When we see a > - * partition marked "detach pending", we only include it in the set of > - * visible partitions if caller requested all detached partitions, or > - * if its pg_inherits tuple's xmin is still visible to the active > - * snapshot. > + * partition marked "detach pending", we omit it from the returned > + * descriptor if caller requested that and the tuple's xmin does not > + * appear in progress to the active snapshot. > > It seems odd for a comment in find_inheritance_children() to talk > about the "descriptor". Maybe the earlier "set of visible > partitions" wording was fine? Absolutely -- done that way. > - * The reason for this check is that we want to avoid seeing the > + * The reason for this hack is that we want to avoid seeing the > * partition as alive in RI queries during REPEATABLE READ or > <snip> > + * SERIALIZABLE transactions. > > The comment doesn't quite make it clear why it is the RI query case > that necessitates this hack in the first case. I added "such queries use a different snapshot than the one used by regular (user) queries." I hope that's sufficient. > Maybe the relation to what's going on with the partdesc > > + if (likely(rel->rd_partdesc && > + (!rel->rd_partdesc->detached_exist || include_detached))) > + return rel->rd_partdesc; > > I think it would help to have a comment about what's going here, in > addition to the description you already wrote for > PartitionDescData.detached_exist. Maybe something along the lines of: > > === > Under normal circumstances, we just return the partdesc that was > already built. However, if the partdesc was built at a time when > there existed detach-pending partition(s), which the current caller > would rather not see (omit_detached), then we build one afresh > omitting any such partitions and return that one. > RelationBuildPartitionDesc() makes sure that any such partdescs will > disappear when the query finishes. > === > > That's maybe a bit verbose but I am sure you will find a way to write > it more succinctly. I added some text in this spot, and also wrote some more in the comment above RelationGetPartitionDesc and RelationBuildPartitionDesc. > BTW, I do feel a bit alarmed by the potential performance impact of > this. If detached_exist of a cached partdesc is true, then RI queries > invoked during a bulk DML operation would have to rebuild one for > every tuple to be checked, right? I haven't tried an actual example > yet though. Yeah, I was scared about that too (which is why I insisted on trying to add a cached copy of the partdesc omitting detached partitions). But AFAICS what happens is that the plan for the RI query gets cached after a few tries; so we do build the partdesc a few times at first, but later we use the cached plan and so we no longer use that one. So at least in the normal cases this isn't a serious problem that I can see. I pushed it now. Thanks for your help, -- Álvaro Herrera Valdivia, Chile "How strange it is to find the words "Perl" and "saner" in such close proximity, with no apparent sense of irony. I doubt that Larry himself could have managed it." (ncm, http://lwn.net/Articles/174769/)
Commits
-
Make detach-partition-concurrently-4 less timing sensitive
- eb43bdbf5104 14.0 landed
-
Improve documentation on DETACH PARTITION lock levels
- db6e1aeb952e 14.0 landed
-
Track detached partitions more accurately in partdescs
- 3fe773b14975 14.0 landed
-
Allow a partdesc-omitting-partitions to be cached
- d6b8d29419df 14.0 landed
-
Fix relcache inconsistency hazard in partition detach
- 8aba9322511f 14.0 landed
-
Don't add a redundant constraint when detaching a partition
- 7b357cc6ae55 14.0 landed
-
ALTER TABLE ... DETACH PARTITION ... CONCURRENTLY
- 71f4c8c6f74b 14.0 landed
-
Let ALTER TABLE Phase 2 routines manage the relation pointer
- cd03c6e94b09 14.0 landed
-
Check default partitions constraints while descending
- f481d2823297 14.0 landed
- ef1e1250e716 12.5 landed
- d0230a43fcae 13.0 landed