]> granicus.if.org Git - postgresql/commitdiff
Fix identify_locking_dependencies for schema-only dumps.
authorRobert Haas <rhaas@postgresql.org>
Fri, 26 Sep 2014 15:21:35 +0000 (11:21 -0400)
committerRobert Haas <rhaas@postgresql.org>
Fri, 26 Sep 2014 15:23:31 +0000 (11:23 -0400)
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

src/bin/pg_dump/pg_backup_archiver.c

index f6fbf4442da2f8f5af083a5767a50b4c4db5215d..fedd74c5e69d77be043d8e2468d8b7eba2664302 100644 (file)
@@ -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;
        }