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
This commit is contained in:
Robert Haas 2014-09-26 11:21:35 -04:00
parent f9f07411a5
commit 07d46a8963

View File

@ -4152,11 +4152,14 @@ identify_locking_dependencies(ArchiveHandle *AH, TocEntry *te)
return; return;
/* /*
* We assume the item requires exclusive lock on each TABLE DATA item * We assume the entry requires exclusive lock on each TABLE or TABLE DATA
* listed among its dependencies. (This was originally a dependency on * item listed among its dependencies. Originally all of these would have
* the TABLE, but fix_dependencies repointed it to the data item. Note * been TABLE items, but repoint_table_dependencies would have repointed
* that all the entry types we are interested in here are POST_DATA, so * them to the TABLE DATA items if those are present (which they might not
* they will all have been changed this way.) * 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)); lockids = (DumpId *) pg_malloc(te->nDeps * sizeof(DumpId));
nlockids = 0; nlockids = 0;
@ -4165,7 +4168,8 @@ identify_locking_dependencies(ArchiveHandle *AH, TocEntry *te)
DumpId depid = te->dependencies[i]; DumpId depid = te->dependencies[i];
if (depid <= AH->maxDumpId && AH->tocsByDumpId[depid] != NULL && 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; lockids[nlockids++] = depid;
} }