88 * Portions Copyright (c) 1994, Regents of the University of California
99 *
1010 * IDENTIFICATION
11- * $PostgreSQL: pgsql/src/backend/bootstrap/bootstrap.c,v 1.232 2007/02/16 02:10:07 alvherre Exp $
11+ * $PostgreSQL: pgsql/src/backend/bootstrap/bootstrap.c,v 1.233 2007/03/07 13:35:02 alvherre Exp $
1212 *
1313 *-------------------------------------------------------------------------
1414 */
2020#include <getopt.h>
2121#endif
2222
23- #define BOOTSTRAP_INCLUDE /* mask out stuff in tcop/tcopprot.h */
24-
2523#include "access/genam.h"
2624#include "access/heapam.h"
2725#include "access/xact.h"
@@ -48,8 +46,10 @@ extern char *optarg;
4846
4947#define ALLOC (t , c ) ((t *) calloc((unsigned)(c), sizeof(t)))
5048
49+ static void CheckerModeMain (void );
50+ static void BootstrapModeMain (void );
5151static void bootstrap_signals (void );
52- static void ShutdownDummyProcess (int code , Datum arg );
52+ static void ShutdownAuxiliaryProcess (int code , Datum arg );
5353static hashnode * AddStr (char * str , int strlength , int mderef );
5454static Form_pg_attribute AllocateAttribute (void );
5555static int CompHash (char * str , int len );
@@ -166,7 +166,6 @@ struct typmap
166166static struct typmap * * Typ = NULL ;
167167static struct typmap * Ap = NULL ;
168168
169- static int Warnings = 0 ;
170169static char Blanks [MAXATTR ];
171170
172171Form_pg_attribute attrtypes [MAXATTR ]; /* points to attribute info */
@@ -193,23 +192,19 @@ static IndexList *ILHead = NULL;
193192
194193
195194/*
196- * The main entry point for running the backend in bootstrap mode
195+ * AuxiliaryProcessMain
197196 *
198- * The bootstrap mode is used to initialize the template database.
199- * The bootstrap backend doesn't speak SQL, but instead expects
200- * commands in a special bootstrap language.
197+ * The main entry point for auxiliary processes, such as the bgwriter,
198+ * bootstrapper and the shared memory checker code.
201199 *
202- * For historical reasons, BootstrapMain is also used as the control
203- * routine for non-backend subprocesses launched by the postmaster,
204- * such as startup and shutdown.
200+ * This code is here just because of historical reasons.
205201 */
206- int
207- BootstrapMain (int argc , char * argv [])
202+ void
203+ AuxiliaryProcessMain (int argc , char * argv [])
208204{
209205 char * progname = argv [0 ];
210- int i ;
211206 int flag ;
212- int xlogop = BS_XLOG_NOP ;
207+ AuxProcType auxType = CheckerProcess ;
213208 char * userDoption = NULL ;
214209
215210 /*
@@ -278,7 +273,7 @@ BootstrapMain(int argc, char *argv[])
278273 strlcpy (OutputFileName , optarg , MAXPGPATH );
279274 break ;
280275 case 'x' :
281- xlogop = atoi (optarg );
276+ auxType = atoi (optarg );
282277 break ;
283278 case 'c' :
284279 case '-' :
@@ -328,12 +323,12 @@ BootstrapMain(int argc, char *argv[])
328323 {
329324 const char * statmsg ;
330325
331- switch (xlogop )
326+ switch (auxType )
332327 {
333- case BS_XLOG_STARTUP :
328+ case StartupProcess :
334329 statmsg = "startup process" ;
335330 break ;
336- case BS_XLOG_BGWRITER :
331+ case BgWriterProcess :
337332 statmsg = "writer process" ;
338333 break ;
339334 default :
@@ -372,9 +367,9 @@ BootstrapMain(int argc, char *argv[])
372367 BaseInit ();
373368
374369 /*
375- * When we are a dummy process, we aren't going to do the full
370+ * When we are an auxiliary process, we aren't going to do the full
376371 * InitPostgres pushups, but there are a couple of things that need to get
377- * lit up even in a dummy process.
372+ * lit up even in an auxiliary process.
378373 */
379374 if (IsUnderPostmaster )
380375 {
@@ -383,51 +378,62 @@ BootstrapMain(int argc, char *argv[])
383378 * this was already done by SubPostmasterMain().
384379 */
385380#ifndef EXEC_BACKEND
386- InitDummyProcess ();
381+ InitAuxiliaryProcess ();
387382#endif
388383
389384 /* finish setting up bufmgr.c */
390385 InitBufferPoolBackend ();
391386
392387 /* register a shutdown callback for LWLock cleanup */
393- on_shmem_exit (ShutdownDummyProcess , 0 );
388+ on_shmem_exit (ShutdownAuxiliaryProcess , 0 );
394389 }
395390
396391 /*
397392 * XLOG operations
398393 */
399394 SetProcessingMode (NormalProcessing );
400395
401- switch (xlogop )
396+ switch (auxType )
402397 {
403- case BS_XLOG_NOP :
398+ case CheckerProcess :
404399 bootstrap_signals ();
405- break ;
400+ CheckerModeMain ();
401+ proc_exit (1 ); /* should never return */
406402
407- case BS_XLOG_BOOTSTRAP :
403+ case BootstrapProcess :
408404 bootstrap_signals ();
409405 BootStrapXLOG ();
410406 StartupXLOG ();
411- break ;
407+ BootstrapModeMain ();
408+ proc_exit (1 ); /* should never return */
412409
413- case BS_XLOG_STARTUP :
410+ case StartupProcess :
414411 bootstrap_signals ();
415412 StartupXLOG ();
416413 LoadFreeSpaceMap ();
417414 BuildFlatFiles (false);
418415 proc_exit (0 ); /* startup done */
419416
420- case BS_XLOG_BGWRITER :
417+ case BgWriterProcess :
421418 /* don't set signals, bgwriter has its own agenda */
422419 InitXLOGAccess ();
423420 BackgroundWriterMain ();
424421 proc_exit (1 ); /* should never return */
425-
422+
426423 default :
427- elog (PANIC , "unrecognized XLOG op : %d" , xlogop );
424+ elog (PANIC , "unrecognized process type : %d" , auxType );
428425 proc_exit (1 );
429426 }
427+ }
430428
429+ /*
430+ * In shared memory checker mode, all we really want to do is create shared
431+ * memory and semaphores (just to prove we can do it with the current GUC
432+ * settings).
433+ */
434+ static void
435+ CheckerModeMain (void )
436+ {
431437 /*
432438 * We must be getting invoked for bootstrap mode
433439 */
@@ -439,15 +445,31 @@ BootstrapMain(int argc, char *argv[])
439445 * Do backend-like initialization for bootstrap mode
440446 */
441447 InitProcess ();
442- (void ) InitPostgres (NULL , InvalidOid , NULL , NULL );
448+ InitPostgres (NULL , InvalidOid , NULL , NULL );
449+ proc_exit (0 );
450+ }
451+
452+ /*
453+ * The main entry point for running the backend in bootstrap mode
454+ *
455+ * The bootstrap mode is used to initialize the template database.
456+ * The bootstrap backend doesn't speak SQL, but instead expects
457+ * commands in a special bootstrap language.
458+ */
459+ static void
460+ BootstrapModeMain (void )
461+ {
462+ int i ;
463+
464+ Assert (!IsUnderPostmaster );
465+
466+ SetProcessingMode (BootstrapProcessing );
443467
444468 /*
445- * In NOP mode, all we really want to do is create shared memory and
446- * semaphores (just to prove we can do it with the current GUC settings).
447- * So, quit now.
469+ * Do backend-like initialization for bootstrap mode
448470 */
449- if ( xlogop == BS_XLOG_NOP )
450- proc_exit ( 0 );
471+ InitProcess ();
472+ InitPostgres ( NULL , InvalidOid , NULL , NULL );
451473
452474 /* Initialize stuff for bootstrap-file processing */
453475 for (i = 0 ; i < MAXATTR ; i ++ )
@@ -468,14 +490,10 @@ BootstrapMain(int argc, char *argv[])
468490 /* Perform a checkpoint to ensure everything's down to disk */
469491 SetProcessingMode (NormalProcessing );
470492 CreateCheckPoint (true, true);
471- SetProcessingMode (BootstrapProcessing );
472493
473494 /* Clean up and exit */
474- StartTransactionCommand ();
475495 cleanup ();
476-
477- /* not reached, here to make compiler happy */
478- return 0 ;
496+ proc_exit (0 );
479497}
480498
481499
@@ -538,30 +556,18 @@ bootstrap_signals(void)
538556}
539557
540558/*
541- * Begin shutdown of a dummy process. This is approximately the equivalent
542- * of ShutdownPostgres() in postinit.c. We can't run transactions in a
543- * dummy process, so most of the work of AbortTransaction() is not needed,
559+ * Begin shutdown of an auxiliary process. This is approximately the equivalent
560+ * of ShutdownPostgres() in postinit.c. We can't run transactions in an
561+ * auxiliary process, so most of the work of AbortTransaction() is not needed,
544562 * but we do need to make sure we've released any LWLocks we are holding.
545563 * (This is only critical during an error exit.)
546564 */
547565static void
548- ShutdownDummyProcess (int code , Datum arg )
566+ ShutdownAuxiliaryProcess (int code , Datum arg )
549567{
550568 LWLockReleaseAll ();
551569}
552570
553- /* ----------------
554- * error handling / abort routines
555- * ----------------
556- */
557- void
558- err_out (void )
559- {
560- Warnings ++ ;
561- cleanup ();
562- }
563-
564-
565571/* ----------------------------------------------------------------
566572 * MANUAL BACKEND INTERACTIVE INTERFACE COMMANDS
567573 * ----------------------------------------------------------------
@@ -815,15 +821,7 @@ InsertOneValue(char *value, int i)
815821
816822 elog (DEBUG4 , "inserting column %d value \"%s\"" , i , value );
817823
818- if (Typ != NULL )
819- {
820- typoid = boot_reldesc -> rd_att -> attrs [i ]-> atttypid ;
821- }
822- else
823- {
824- /* XXX why is typoid determined differently in this case? */
825- typoid = attrtypes [i ]-> atttypid ;
826- }
824+ typoid = boot_reldesc -> rd_att -> attrs [i ]-> atttypid ;
827825
828826 boot_get_type_io_data (typoid ,
829827 & typlen , & typbyval , & typalign ,
@@ -856,19 +854,8 @@ InsertOneNull(int i)
856854static void
857855cleanup (void )
858856{
859- static int beenhere = 0 ;
860-
861- if (!beenhere )
862- beenhere = 1 ;
863- else
864- {
865- elog (FATAL , "cleanup called twice" );
866- proc_exit (1 );
867- }
868857 if (boot_reldesc != NULL )
869858 closerel (NULL );
870- CommitTransactionCommand ();
871- proc_exit (Warnings ? 1 : 0 );
872859}
873860
874861/* ----------------
@@ -934,7 +921,6 @@ gettype(char *type)
934921 return gettype (type );
935922 }
936923 elog (ERROR , "unrecognized type \"%s\"" , type );
937- err_out ();
938924 /* not reached, here to make compiler happy */
939925 return 0 ;
940926}
0 commit comments