]> granicus.if.org Git - postgresql/commitdiff
Obtain table locks as soon as practical during pg_dump.
authorTom Lane <tgl@sss.pgh.pa.us>
Fri, 17 Jun 2011 22:19:09 +0000 (18:19 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Fri, 17 Jun 2011 22:19:09 +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 c419c2d18063a08d6b3c3c8a922c643a592ae795..a631f64c36f4768031b5beb3198a03921939f3c4 100644 (file)
@@ -105,6 +105,17 @@ getSchemaData(int *numTablesPtr)
                write_msg(NULL, "reading schemas\n");
        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 extensions\n");
        extinfo = getExtensions(&numExtensions);
@@ -183,11 +194,6 @@ getSchemaData(int *numTablesPtr)
                write_msg(NULL, "reading type casts\n");
        getCasts(&numCasts);
 
-       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);