summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane2017-04-14 21:51:25 +0000
committerTom Lane2017-04-14 21:51:25 +0000
commit85a0781334a204c15c9c6ea9d3e6c75334c2beb6 (patch)
tree165967f8a4ee544ef6e0fb371495287d1c2fbe8e
parent2040bb4a0b50ef0434a1a723f00d040ab4f1c06f (diff)
Use one transaction while reading postgres.bki, not one per line.
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/[email protected]
-rw-r--r--src/backend/bootstrap/bootparse.y18
-rw-r--r--src/backend/bootstrap/bootstrap.c3
2 files changed, 16 insertions, 5 deletions
diff --git a/src/backend/bootstrap/bootparse.y b/src/backend/bootstrap/bootparse.y
index 867f77076d..de3695c7e0 100644
--- a/src/backend/bootstrap/bootparse.y
+++ b/src/backend/bootstrap/bootparse.y
@@ -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"
@@ -63,19 +63,27 @@
#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))
{
diff --git a/src/backend/bootstrap/bootstrap.c b/src/backend/bootstrap/bootstrap.c
index 46c207c86c..4c28b2b821 100644
--- a/src/backend/bootstrap/bootstrap.c
+++ b/src/backend/bootstrap/bootstrap.c
@@ -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