mirror of
https://git.postgresql.org/git/postgresql.git
synced 2024-12-21 08:29:39 +08:00
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:
parent
f9f07411a5
commit
07d46a8963
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user