aboutsummaryrefslogtreecommitdiff
path: root/src/backend/bootstrap/bootstrap.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/bootstrap/bootstrap.c')
-rw-r--r--src/backend/bootstrap/bootstrap.c148
1 files changed, 67 insertions, 81 deletions
diff --git a/src/backend/bootstrap/bootstrap.c b/src/backend/bootstrap/bootstrap.c
index d9a486f7715..0074f707382 100644
--- a/src/backend/bootstrap/bootstrap.c
+++ b/src/backend/bootstrap/bootstrap.c
@@ -8,7 +8,7 @@
* Portions Copyright (c) 1994, Regents of the University of California
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/bootstrap/bootstrap.c,v 1.232 2007/02/16 02:10:07 alvherre Exp $
+ * $PostgreSQL: pgsql/src/backend/bootstrap/bootstrap.c,v 1.233 2007/03/07 13:35:02 alvherre Exp $
*
*-------------------------------------------------------------------------
*/
@@ -20,8 +20,6 @@
#include <getopt.h>
#endif
-#define BOOTSTRAP_INCLUDE /* mask out stuff in tcop/tcopprot.h */
-
#include "access/genam.h"
#include "access/heapam.h"
#include "access/xact.h"
@@ -48,8 +46,10 @@ extern char *optarg;
#define ALLOC(t, c) ((t *) calloc((unsigned)(c), sizeof(t)))
+static void CheckerModeMain(void);
+static void BootstrapModeMain(void);
static void bootstrap_signals(void);
-static void ShutdownDummyProcess(int code, Datum arg);
+static void ShutdownAuxiliaryProcess(int code, Datum arg);
static hashnode *AddStr(char *str, int strlength, int mderef);
static Form_pg_attribute AllocateAttribute(void);
static int CompHash(char *str, int len);
@@ -166,7 +166,6 @@ struct typmap
static struct typmap **Typ = NULL;
static struct typmap *Ap = NULL;
-static int Warnings = 0;
static char Blanks[MAXATTR];
Form_pg_attribute attrtypes[MAXATTR]; /* points to attribute info */
@@ -193,23 +192,19 @@ static IndexList *ILHead = NULL;
/*
- * The main entry point for running the backend in bootstrap mode
+ * AuxiliaryProcessMain
*
- * The bootstrap mode is used to initialize the template database.
- * The bootstrap backend doesn't speak SQL, but instead expects
- * commands in a special bootstrap language.
+ * The main entry point for auxiliary processes, such as the bgwriter,
+ * bootstrapper and the shared memory checker code.
*
- * For historical reasons, BootstrapMain is also used as the control
- * routine for non-backend subprocesses launched by the postmaster,
- * such as startup and shutdown.
+ * This code is here just because of historical reasons.
*/
-int
-BootstrapMain(int argc, char *argv[])
+void
+AuxiliaryProcessMain(int argc, char *argv[])
{
char *progname = argv[0];
- int i;
int flag;
- int xlogop = BS_XLOG_NOP;
+ AuxProcType auxType = CheckerProcess;
char *userDoption = NULL;
/*
@@ -278,7 +273,7 @@ BootstrapMain(int argc, char *argv[])
strlcpy(OutputFileName, optarg, MAXPGPATH);
break;
case 'x':
- xlogop = atoi(optarg);
+ auxType = atoi(optarg);
break;
case 'c':
case '-':
@@ -328,12 +323,12 @@ BootstrapMain(int argc, char *argv[])
{
const char *statmsg;
- switch (xlogop)
+ switch (auxType)
{
- case BS_XLOG_STARTUP:
+ case StartupProcess:
statmsg = "startup process";
break;
- case BS_XLOG_BGWRITER:
+ case BgWriterProcess:
statmsg = "writer process";
break;
default:
@@ -372,9 +367,9 @@ BootstrapMain(int argc, char *argv[])
BaseInit();
/*
- * When we are a dummy process, we aren't going to do the full
+ * When we are an auxiliary process, we aren't going to do the full
* InitPostgres pushups, but there are a couple of things that need to get
- * lit up even in a dummy process.
+ * lit up even in an auxiliary process.
*/
if (IsUnderPostmaster)
{
@@ -383,14 +378,14 @@ BootstrapMain(int argc, char *argv[])
* this was already done by SubPostmasterMain().
*/
#ifndef EXEC_BACKEND
- InitDummyProcess();
+ InitAuxiliaryProcess();
#endif
/* finish setting up bufmgr.c */
InitBufferPoolBackend();
/* register a shutdown callback for LWLock cleanup */
- on_shmem_exit(ShutdownDummyProcess, 0);
+ on_shmem_exit(ShutdownAuxiliaryProcess, 0);
}
/*
@@ -398,36 +393,47 @@ BootstrapMain(int argc, char *argv[])
*/
SetProcessingMode(NormalProcessing);
- switch (xlogop)
+ switch (auxType)
{
- case BS_XLOG_NOP:
+ case CheckerProcess:
bootstrap_signals();
- break;
+ CheckerModeMain();
+ proc_exit(1); /* should never return */
- case BS_XLOG_BOOTSTRAP:
+ case BootstrapProcess:
bootstrap_signals();
BootStrapXLOG();
StartupXLOG();
- break;
+ BootstrapModeMain();
+ proc_exit(1); /* should never return */
- case BS_XLOG_STARTUP:
+ case StartupProcess:
bootstrap_signals();
StartupXLOG();
LoadFreeSpaceMap();
BuildFlatFiles(false);
proc_exit(0); /* startup done */
- case BS_XLOG_BGWRITER:
+ case BgWriterProcess:
/* don't set signals, bgwriter has its own agenda */
InitXLOGAccess();
BackgroundWriterMain();
proc_exit(1); /* should never return */
-
+
default:
- elog(PANIC, "unrecognized XLOG op: %d", xlogop);
+ elog(PANIC, "unrecognized process type: %d", auxType);
proc_exit(1);
}
+}
+/*
+ * In shared memory checker mode, all we really want to do is create shared
+ * memory and semaphores (just to prove we can do it with the current GUC
+ * settings).
+ */
+static void
+CheckerModeMain(void)
+{
/*
* We must be getting invoked for bootstrap mode
*/
@@ -439,15 +445,31 @@ BootstrapMain(int argc, char *argv[])
* Do backend-like initialization for bootstrap mode
*/
InitProcess();
- (void) InitPostgres(NULL, InvalidOid, NULL, NULL);
+ InitPostgres(NULL, InvalidOid, NULL, NULL);
+ proc_exit(0);
+}
+
+/*
+ * The main entry point for running the backend in bootstrap mode
+ *
+ * The bootstrap mode is used to initialize the template database.
+ * The bootstrap backend doesn't speak SQL, but instead expects
+ * commands in a special bootstrap language.
+ */
+static void
+BootstrapModeMain(void)
+{
+ int i;
+
+ Assert(!IsUnderPostmaster);
+
+ SetProcessingMode(BootstrapProcessing);
/*
- * In NOP mode, all we really want to do is create shared memory and
- * semaphores (just to prove we can do it with the current GUC settings).
- * So, quit now.
+ * Do backend-like initialization for bootstrap mode
*/
- if (xlogop == BS_XLOG_NOP)
- proc_exit(0);
+ InitProcess();
+ InitPostgres(NULL, InvalidOid, NULL, NULL);
/* Initialize stuff for bootstrap-file processing */
for (i = 0; i < MAXATTR; i++)
@@ -468,14 +490,10 @@ BootstrapMain(int argc, char *argv[])
/* Perform a checkpoint to ensure everything's down to disk */
SetProcessingMode(NormalProcessing);
CreateCheckPoint(true, true);
- SetProcessingMode(BootstrapProcessing);
/* Clean up and exit */
- StartTransactionCommand();
cleanup();
-
- /* not reached, here to make compiler happy */
- return 0;
+ proc_exit(0);
}
@@ -538,30 +556,18 @@ bootstrap_signals(void)
}
/*
- * Begin shutdown of a dummy process. This is approximately the equivalent
- * of ShutdownPostgres() in postinit.c. We can't run transactions in a
- * dummy process, so most of the work of AbortTransaction() is not needed,
+ * Begin shutdown of an auxiliary process. This is approximately the equivalent
+ * of ShutdownPostgres() in postinit.c. We can't run transactions in an
+ * auxiliary process, so most of the work of AbortTransaction() is not needed,
* but we do need to make sure we've released any LWLocks we are holding.
* (This is only critical during an error exit.)
*/
static void
-ShutdownDummyProcess(int code, Datum arg)
+ShutdownAuxiliaryProcess(int code, Datum arg)
{
LWLockReleaseAll();
}
-/* ----------------
- * error handling / abort routines
- * ----------------
- */
-void
-err_out(void)
-{
- Warnings++;
- cleanup();
-}
-
-
/* ----------------------------------------------------------------
* MANUAL BACKEND INTERACTIVE INTERFACE COMMANDS
* ----------------------------------------------------------------
@@ -815,15 +821,7 @@ InsertOneValue(char *value, int i)
elog(DEBUG4, "inserting column %d value \"%s\"", i, value);
- if (Typ != NULL)
- {
- typoid = boot_reldesc->rd_att->attrs[i]->atttypid;
- }
- else
- {
- /* XXX why is typoid determined differently in this case? */
- typoid = attrtypes[i]->atttypid;
- }
+ typoid = boot_reldesc->rd_att->attrs[i]->atttypid;
boot_get_type_io_data(typoid,
&typlen, &typbyval, &typalign,
@@ -856,19 +854,8 @@ InsertOneNull(int i)
static void
cleanup(void)
{
- static int beenhere = 0;
-
- if (!beenhere)
- beenhere = 1;
- else
- {
- elog(FATAL, "cleanup called twice");
- proc_exit(1);
- }
if (boot_reldesc != NULL)
closerel(NULL);
- CommitTransactionCommand();
- proc_exit(Warnings ? 1 : 0);
}
/* ----------------
@@ -934,7 +921,6 @@ gettype(char *type)
return gettype(type);
}
elog(ERROR, "unrecognized type \"%s\"", type);
- err_out();
/* not reached, here to make compiler happy */
return 0;
}