Obtain table locks as soon as practical during pg_dump.
authorTom Lane <[email protected]>
Fri, 17 Jun 2011 22:19:21 +0000 (18:19 -0400)
committerTom Lane <[email protected]>
Fri, 17 Jun 2011 22:19:21 +0000 (18:19 -0400)
For some reason, when we (I) added table lock acquisition to pg_dump,
we didn't think about making it happen as soon as possible after the
start of the transaction.  What with subsequent additions, there was
actually quite a lot going on before we got around to that; which sort
of defeats the purpose.  Rearrange the order of calls in dumpSchema()
to close the risk window as much as we easily can.  Back-patch to all
supported branches.

src/bin/pg_dump/common.c

index 789638fec454ef2b37b7a2cf9d4981cc28d94baf..7ab6ce889a7ed0880d7e5eb153e7735089cb9c0d 100644 (file)
@@ -113,6 +113,17 @@ getSchemaData(int *numTablesPtr)
        write_msg(NULL, "reading schemas\n");
    nsinfo = getNamespaces(&numNamespaces);
 
+   /*
+    * getTables should be done as soon as possible, so as to minimize the
+    * window between starting our transaction and acquiring per-table locks.
+    * However, we have to do getNamespaces first because the tables get
+    * linked to their containing namespaces during getTables.
+    */
+   if (g_verbose)
+       write_msg(NULL, "reading user-defined tables\n");
+   tblinfo = getTables(&numTables);
+   tblinfoindex = buildIndexArray(tblinfo, numTables, sizeof(TableInfo));
+
    if (g_verbose)
        write_msg(NULL, "reading user-defined functions\n");
    funinfo = getFuncs(&numFuncs);
@@ -174,11 +185,6 @@ getSchemaData(int *numTablesPtr)
        write_msg(NULL, "reading user-defined conversions\n");
    convinfo = getConversions(&numConversions);
 
-   if (g_verbose)
-       write_msg(NULL, "reading user-defined tables\n");
-   tblinfo = getTables(&numTables);
-   tblinfoindex = buildIndexArray(tblinfo, numTables, sizeof(TableInfo));
-
    if (g_verbose)
        write_msg(NULL, "reading table inheritance information\n");
    inhinfo = getInherits(&numInherits);