1
0
mirror of https://github.com/postgres/postgres.git synced 2025-06-29 10:41:53 +03:00

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/9244.1492106743@sss.pgh.pa.us
This commit is contained in:
Tom Lane
2017-04-14 17:51:25 -04:00
parent 2040bb4a0b
commit 85a0781334
2 changed files with 16 additions and 5 deletions

View 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"
@ -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))
{

View 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