]> granicus.if.org Git - postgresql/commitdiff
Code review for pg_dump's handling of ALTER INDEX ATTACH PARTITION.
authorTom Lane <tgl@sss.pgh.pa.us>
Tue, 28 Aug 2018 23:33:04 +0000 (19:33 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Tue, 28 Aug 2018 23:33:04 +0000 (19:33 -0400)
Ensure the TOC entry is marked with the correct schema, so that its
name is as unique as the index's is.

Fix the dependencies: we want dependencies from this TOC entry to the
two indexes it depends on, and we don't care (at least not for this
purpose) what order the indexes are created in.  Also, add dependencies
on the indexes' underlying tables.  Those might seem pointless given
the index dependencies, but they are helpful to cue parallel restore
to avoid running the ATTACH PARTITION in parallel with other DDL on
the same tables.

Discussion: https://postgr.es/m/10817.1535494963@sss.pgh.pa.us

src/bin/pg_dump/common.c
src/bin/pg_dump/pg_dump.c

index 0d147cb08d1d18ef7dc3e05e93e852bdba7080e2..9b5869add8b3987af12ac1a5e53381033a757f65 100644 (file)
@@ -425,17 +425,31 @@ flagInhIndexes(Archive *fout, TableInfo tblinfo[], int numTables)
                        attachinfo[k].dobj.catId.oid = 0;
                        AssignDumpId(&attachinfo[k].dobj);
                        attachinfo[k].dobj.name = pg_strdup(index->dobj.name);
+                       attachinfo[k].dobj.namespace = index->indextable->dobj.namespace;
                        attachinfo[k].parentIdx = parentidx;
                        attachinfo[k].partitionIdx = index;
 
                        /*
-                        * We want dependencies from parent to partition (so that the
-                        * partition index is created first), and another one from attach
-                        * object to parent (so that the partition index is attached once
-                        * the parent index has been created).
+                        * We must state the DO_INDEX_ATTACH object's dependencies
+                        * explicitly, since it will not match anything in pg_depend.
+                        *
+                        * Give it dependencies on both the partition index and the parent
+                        * index, so that it will not be executed till both of those
+                        * exist.  (There's no need to care what order those are created
+                        * in.)
+                        *
+                        * In addition, give it dependencies on the indexes' underlying
+                        * tables.  This does nothing of great value so far as serial
+                        * restore ordering goes, but it ensures that a parallel restore
+                        * will not try to run the ATTACH concurrently with other
+                        * operations on those tables.
                         */
-                       addObjectDependency(&parentidx->dobj, index->dobj.dumpId);
+                       addObjectDependency(&attachinfo[k].dobj, index->dobj.dumpId);
                        addObjectDependency(&attachinfo[k].dobj, parentidx->dobj.dumpId);
+                       addObjectDependency(&attachinfo[k].dobj,
+                                                               index->indextable->dobj.dumpId);
+                       addObjectDependency(&attachinfo[k].dobj,
+                                                               parentidx->indextable->dobj.dumpId);
 
                        k++;
                }
index 6763a899d81d1bcf0bbdc5f16c970d7024ef7146..d833c41147a16cfb4b29db482efc6be0147e149b 100644 (file)
@@ -16326,14 +16326,15 @@ dumpIndexAttach(Archive *fout, IndexAttachInfo *attachinfo)
        {
                PQExpBuffer q = createPQExpBuffer();
 
-               appendPQExpBuffer(q, "\nALTER INDEX %s ",
+               appendPQExpBuffer(q, "ALTER INDEX %s ",
                                                  fmtQualifiedDumpable(attachinfo->parentIdx));
                appendPQExpBuffer(q, "ATTACH PARTITION %s;\n",
                                                  fmtQualifiedDumpable(attachinfo->partitionIdx));
 
                ArchiveEntry(fout, attachinfo->dobj.catId, attachinfo->dobj.dumpId,
                                         attachinfo->dobj.name,
-                                        NULL, NULL,
+                                        attachinfo->dobj.namespace->dobj.name,
+                                        NULL,
                                         "",
                                         false, "INDEX ATTACH", SECTION_POST_DATA,
                                         q->data, "", NULL,