]> granicus.if.org Git - postgresql/commitdiff
Use one transaction while reading postgres.bki, not one per line.
authorTom Lane <tgl@sss.pgh.pa.us>
Fri, 14 Apr 2017 21:51:25 +0000 (17:51 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Fri, 14 Apr 2017 21:51:25 +0000 (17:51 -0400)
AFAICT, the only actual benefit of closing a bootstrap transaction
is to reclaim transient memory.  We can do that a lot more cheaply
by just doing a MemoryContextReset on a suitable context.  This
gets the runtime of the "bootstrap" phase of initdb down to the
point where, at least by eyeball, it's quite negligible compared
to the rest of the phases.  Per discussion with Andres Freund.

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

src/backend/bootstrap/bootparse.y
src/backend/bootstrap/bootstrap.c

index 867f77076d074af13215c9c4d8afc15f8bbbcd87..de3695c7e05f3981119afdf9c996856b198ac33e 100644 (file)
@@ -22,7 +22,6 @@
 #include "access/htup.h"
 #include "access/itup.h"
 #include "access/tupdesc.h"
-#include "access/xact.h"
 #include "bootstrap/bootstrap.h"
 #include "catalog/catalog.h"
 #include "catalog/heap.h"
@@ -49,6 +48,7 @@
 #include "storage/off.h"
 #include "storage/smgr.h"
 #include "tcop/dest.h"
+#include "utils/memutils.h"
 #include "utils/rel.h"
 
 
 #define YYMALLOC palloc
 #define YYFREE   pfree
 
+static MemoryContext per_line_ctx = NULL;
+
 static void
 do_start(void)
 {
-       StartTransactionCommand();
-       elog(DEBUG4, "start transaction");
+       Assert(CurrentMemoryContext == CurTransactionContext);
+       /* First time through, create the per-line working context */
+       if (per_line_ctx == NULL)
+               per_line_ctx = AllocSetContextCreate(CurTransactionContext,
+                                                                                        "bootstrap per-line processing",
+                                                                                        ALLOCSET_DEFAULT_SIZES);
+       MemoryContextSwitchTo(per_line_ctx);
 }
 
 
 static void
 do_end(void)
 {
-       CommitTransactionCommand();
-       elog(DEBUG4, "commit transaction");
+       /* Reclaim memory allocated while processing this line */
+       MemoryContextSwitchTo(CurTransactionContext);
+       MemoryContextReset(per_line_ctx);
        CHECK_FOR_INTERRUPTS();         /* allow SIGINT to kill bootstrap run */
        if (isatty(0))
        {
index 46c207c86c8fd6d8feaf7ab36c0f2647bb7d6da8..4c28b2b821a767ef7a262312b6102bc844244f30 100644 (file)
@@ -18,6 +18,7 @@
 #include <signal.h>
 
 #include "access/htup_details.h"
+#include "access/xact.h"
 #include "bootstrap/bootstrap.h"
 #include "catalog/index.h"
 #include "catalog/pg_collation.h"
@@ -496,7 +497,9 @@ BootstrapModeMain(void)
        /*
         * Process bootstrap input.
         */
+       StartTransactionCommand();
        boot_yyparse();
+       CommitTransactionCommand();
 
        /*
         * We should now know about all mapped relations, so it's okay to write