aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRobert Haas <rhaas@postgresql.org>2014-09-26 11:21:35 -0400
committerRobert Haas <rhaas@postgresql.org>2014-09-26 11:23:31 -0400
commit4e23c47a3bb7a198c87940b6e9ac96edfa53962b (patch)
tree0c5e7df036594a41e032cf73b45658f4d9588c59 /src
parentd99d0e60eaa8334b698a070cb919202607660a65 (diff)
downloadpostgresql-4e23c47a3bb7a198c87940b6e9ac96edfa53962b.tar.gz
postgresql-4e23c47a3bb7a198c87940b6e9ac96edfa53962b.zip
Fix identify_locking_dependencies for schema-only dumps.
Without this fix, parallel restore of a schema-only dump can deadlock, because when the dump is schema-only, the dependency will still be pointing at the TABLE item rather than the TABLE DATA item. Robert Haas and Tom Lane
Diffstat (limited to 'src')
-rw-r--r--src/bin/pg_dump/pg_backup_archiver.c16
1 files changed, 10 insertions, 6 deletions
diff --git a/src/bin/pg_dump/pg_backup_archiver.c b/src/bin/pg_dump/pg_backup_archiver.c
index f6fbf4442da..fedd74c5e69 100644
--- a/src/bin/pg_dump/pg_backup_archiver.c
+++ b/src/bin/pg_dump/pg_backup_archiver.c
@@ -4137,11 +4137,14 @@ identify_locking_dependencies(ArchiveHandle *AH, TocEntry *te)
return;
/*
- * We assume the item requires exclusive lock on each TABLE DATA item
- * listed among its dependencies. (This was originally a dependency on
- * the TABLE, but fix_dependencies repointed it to the data item. Note
- * that all the entry types we are interested in here are POST_DATA, so
- * they will all have been changed this way.)
+ * We assume the entry requires exclusive lock on each TABLE or TABLE DATA
+ * item listed among its dependencies. Originally all of these would have
+ * been TABLE items, but repoint_table_dependencies would have repointed
+ * them to the TABLE DATA items if those are present (which they might not
+ * be, eg in a schema-only dump). Note that all of the entries we are
+ * processing here are POST_DATA; otherwise there might be a significant
+ * difference between a dependency on a table and a dependency on its
+ * data, so that closer analysis would be needed here.
*/
lockids = (DumpId *) pg_malloc(te->nDeps * sizeof(DumpId));
nlockids = 0;
@@ -4150,7 +4153,8 @@ identify_locking_dependencies(ArchiveHandle *AH, TocEntry *te)
DumpId depid = te->dependencies[i];
if (depid <= AH->maxDumpId && AH->tocsByDumpId[depid] != NULL &&
- strcmp(AH->tocsByDumpId[depid]->desc, "TABLE DATA") == 0)
+ ((strcmp(AH->tocsByDumpId[depid]->desc, "TABLE DATA") == 0) ||
+ strcmp(AH->tocsByDumpId[depid]->desc, "TABLE") == 0))
lockids[nlockids++] = depid;
}