diff options
author | Robert Haas <rhaas@postgresql.org> | 2017-08-17 15:39:17 -0400 |
---|---|---|
committer | Robert Haas <rhaas@postgresql.org> | 2017-08-17 15:43:09 -0400 |
commit | 54cde0c4c05807321d3f4bf96a97c376e3fa91cb (patch) | |
tree | 05581287ba6ec8092fca658e97a233563e2446aa /src/backend/executor/execMain.c | |
parent | ecfe59e50fb8316ab7fc653419cd724c8b7a7dd7 (diff) | |
download | postgresql-54cde0c4c05807321d3f4bf96a97c376e3fa91cb.tar.gz postgresql-54cde0c4c05807321d3f4bf96a97c376e3fa91cb.zip |
Don't lock tables in RelationGetPartitionDispatchInfo.
Instead, lock them in the caller using find_all_inheritors so that
they get locked in the standard order, minimizing deadlock risks.
Also in RelationGetPartitionDispatchInfo, avoid opening tables which
are not partitioned; there's no need.
Amit Langote, reviewed by Ashutosh Bapat and Amit Khandekar
Discussion: http://postgr.es/m/91b36fa1-c197-b72f-ca6e-56c593bae68c@lab.ntt.co.jp
Diffstat (limited to 'src/backend/executor/execMain.c')
-rw-r--r-- | src/backend/executor/execMain.c | 10 |
1 files changed, 7 insertions, 3 deletions
diff --git a/src/backend/executor/execMain.c b/src/backend/executor/execMain.c index 6671a25ffb3..74071eede6e 100644 --- a/src/backend/executor/execMain.c +++ b/src/backend/executor/execMain.c @@ -43,6 +43,7 @@ #include "access/xact.h" #include "catalog/namespace.h" #include "catalog/partition.h" +#include "catalog/pg_inherits_fn.h" #include "catalog/pg_publication.h" #include "commands/matview.h" #include "commands/trigger.h" @@ -3249,9 +3250,12 @@ ExecSetupPartitionTupleRouting(Relation rel, int i; ResultRelInfo *leaf_part_rri; - /* Get the tuple-routing information and lock partitions */ - *pd = RelationGetPartitionDispatchInfo(rel, RowExclusiveLock, num_parted, - &leaf_parts); + /* + * Get the information about the partition tree after locking all the + * partitions. + */ + (void) find_all_inheritors(RelationGetRelid(rel), RowExclusiveLock, NULL); + *pd = RelationGetPartitionDispatchInfo(rel, num_parted, &leaf_parts); *num_partitions = list_length(leaf_parts); *partitions = (ResultRelInfo *) palloc(*num_partitions * sizeof(ResultRelInfo)); |