@ -55,7 +55,6 @@ uint32 bootstrap_data_checksum_version = 0; /* No checksum */
static void CheckerModeMain ( void ) ;
static void BootstrapModeMain ( void ) ;
static void bootstrap_signals ( void ) ;
static void ShutdownAuxiliaryProcess ( int code , Datum arg ) ;
static Form_pg_attribute AllocateAttribute ( void ) ;
@ -194,124 +193,11 @@ static IndexList *ILHead = NULL;
* This code is here just because of historical reasons .
*/
void
AuxiliaryProcessMain ( int argc , char * argv [ ] )
AuxiliaryProcessMain ( AuxProcType auxtype )
{
char * progname = argv [ 0 ] ;
int flag ;
char * userDoption = NULL ;
/*
* Initialize process environment ( already done if under postmaster , but
* not if standalone ) .
*/
if ( ! IsUnderPostmaster )
InitStandaloneProcess ( argv [ 0 ] ) ;
/*
* process command arguments
*/
/* Set defaults, to be overridden by explicit options below */
if ( ! IsUnderPostmaster )
InitializeGUCOptions ( ) ;
/* Ignore the initial --boot argument, if present */
if ( argc > 1 & & strcmp ( argv [ 1 ] , " --boot " ) = = 0 )
{
argv + + ;
argc - - ;
}
/* If no -x argument, we are a CheckerProcess */
MyAuxProcType = CheckerProcess ;
while ( ( flag = getopt ( argc , argv , " B:c:d:D:Fkr:x:X:-: " ) ) ! = - 1 )
{
switch ( flag )
{
case ' B ' :
SetConfigOption ( " shared_buffers " , optarg , PGC_POSTMASTER , PGC_S_ARGV ) ;
break ;
case ' D ' :
userDoption = pstrdup ( optarg ) ;
break ;
case ' d ' :
{
/* Turn on debugging for the bootstrap process. */
char * debugstr ;
debugstr = psprintf ( " debug%s " , optarg ) ;
SetConfigOption ( " log_min_messages " , debugstr ,
PGC_POSTMASTER , PGC_S_ARGV ) ;
SetConfigOption ( " client_min_messages " , debugstr ,
PGC_POSTMASTER , PGC_S_ARGV ) ;
pfree ( debugstr ) ;
}
break ;
case ' F ' :
SetConfigOption ( " fsync " , " false " , PGC_POSTMASTER , PGC_S_ARGV ) ;
break ;
case ' k ' :
bootstrap_data_checksum_version = PG_DATA_CHECKSUM_VERSION ;
break ;
case ' r ' :
strlcpy ( OutputFileName , optarg , MAXPGPATH ) ;
break ;
case ' x ' :
MyAuxProcType = atoi ( optarg ) ;
break ;
case ' X ' :
{
int WalSegSz = strtoul ( optarg , NULL , 0 ) ;
if ( ! IsValidWalSegSize ( WalSegSz ) )
ereport ( ERROR ,
( errcode ( ERRCODE_INVALID_PARAMETER_VALUE ) ,
errmsg ( " -X requires a power of two value between 1 MB and 1 GB " ) ) ) ;
SetConfigOption ( " wal_segment_size " , optarg , PGC_INTERNAL ,
PGC_S_OVERRIDE ) ;
}
break ;
case ' c ' :
case ' - ' :
{
char * name ,
* value ;
ParseLongOption ( optarg , & name , & value ) ;
if ( ! value )
{
if ( flag = = ' - ' )
ereport ( ERROR ,
( errcode ( ERRCODE_SYNTAX_ERROR ) ,
errmsg ( " --%s requires a value " ,
optarg ) ) ) ;
else
ereport ( ERROR ,
( errcode ( ERRCODE_SYNTAX_ERROR ) ,
errmsg ( " -c %s requires a value " ,
optarg ) ) ) ;
}
SetConfigOption ( name , value , PGC_POSTMASTER , PGC_S_ARGV ) ;
free ( name ) ;
if ( value )
free ( value ) ;
break ;
}
default :
write_stderr ( " Try \" %s --help \" for more information. \n " ,
progname ) ;
proc_exit ( 1 ) ;
break ;
}
}
Assert ( IsUnderPostmaster ) ;
if ( argc ! = optind )
{
write_stderr ( " %s: invalid command-line arguments \n " , progname ) ;
proc_exit ( 1 ) ;
}
MyAuxProcType = auxtype ;
switch ( MyAuxProcType )
{
@ -334,47 +220,22 @@ AuxiliaryProcessMain(int argc, char *argv[])
MyBackendType = B_WAL_RECEIVER ;
break ;
default :
elog ( ERROR , " something has gone wrong " ) ;
MyBackendType = B_INVALID ;
}
if ( IsUnderPostmaster )
init_ps_display ( NULL ) ;
/* Acquire configuration parameters, unless inherited from postmaster */
if ( ! IsUnderPostmaster )
{
if ( ! SelectConfigFiles ( userDoption , progname ) )
proc_exit ( 1 ) ;
}
/*
* Validate we have been given a reasonable - looking DataDir and change
* into it ( if under postmaster , should be done already ) .
*/
if ( ! IsUnderPostmaster )
{
checkDataDir ( ) ;
ChangeToDataDir ( ) ;
}
/* If standalone, create lockfile for data directory */
if ( ! IsUnderPostmaster )
CreateDataDirLockFile ( false ) ;
init_ps_display ( NULL ) ;
SetProcessingMode ( BootstrapProcessing ) ;
IgnoreSystemIndexes = true ;
/* Initialize MaxBackends (if under postmaster, was done already) */
if ( ! IsUnderPostmaster )
InitializeMaxBackends ( ) ;
BaseInit ( ) ;
/*
* 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 an auxiliary process .
* As 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 an auxiliary process .
*/
if ( IsUnderPostmaster )
{
/*
* Create a PGPROC so we can use LWLocks . In the EXEC_BACKEND case ,
@ -423,22 +284,9 @@ AuxiliaryProcessMain(int argc, char *argv[])
switch ( MyAuxProcType )
{
case CheckerProcess :
/* don't set signals, they're useless here */
CheckerModeMain ( ) ;
proc_exit ( 1 ) ; /* should never return */
case BootstrapProcess :
/*
* There was a brief instant during which mode was Normal ; this is
* okay . We need to be in bootstrap mode during BootStrapXLOG for
* the sake of multixact initialization .
*/
SetProcessingMode ( BootstrapProcessing ) ;
bootstrap_signals ( ) ;
BootStrapXLOG ( ) ;
BootstrapModeMain ( ) ;
proc_exit ( 1 ) ; /* should never return */
pg_unreachable ( ) ;
break ;
case StartupProcess :
StartupProcessMain ( ) ;
@ -490,13 +338,159 @@ CheckerModeMain(void)
* The bootstrap backend doesn ' t speak SQL , but instead expects
* commands in a special bootstrap language .
*/
static void
BootstrapModeMain ( void )
void
BootstrapModeMain ( int argc , char * argv [ ] )
{
int i ;
char * progname = argv [ 0 ] ;
int flag ;
char * userDoption = NULL ;
Assert ( ! IsUnderPostmaster ) ;
Assert ( IsBootstrapProcessingMode ( ) ) ;
InitStandaloneProcess ( argv [ 0 ] ) ;
/* Set defaults, to be overridden by explicit options below */
InitializeGUCOptions ( ) ;
/* an initial --boot should be present */
Assert ( argc = = 1
| | strcmp ( argv [ 1 ] , " --boot " ) ! = 0 ) ;
argv + + ;
argc - - ;
/* If no -x argument, we are a CheckerProcess */
MyAuxProcType = CheckerProcess ;
while ( ( flag = getopt ( argc , argv , " B:c:d:D:Fkr:x:X:-: " ) ) ! = - 1 )
{
switch ( flag )
{
case ' B ' :
SetConfigOption ( " shared_buffers " , optarg , PGC_POSTMASTER , PGC_S_ARGV ) ;
break ;
case ' D ' :
userDoption = pstrdup ( optarg ) ;
break ;
case ' d ' :
{
/* Turn on debugging for the bootstrap process. */
char * debugstr ;
debugstr = psprintf ( " debug%s " , optarg ) ;
SetConfigOption ( " log_min_messages " , debugstr ,
PGC_POSTMASTER , PGC_S_ARGV ) ;
SetConfigOption ( " client_min_messages " , debugstr ,
PGC_POSTMASTER , PGC_S_ARGV ) ;
pfree ( debugstr ) ;
}
break ;
case ' F ' :
SetConfigOption ( " fsync " , " false " , PGC_POSTMASTER , PGC_S_ARGV ) ;
break ;
case ' k ' :
bootstrap_data_checksum_version = PG_DATA_CHECKSUM_VERSION ;
break ;
case ' r ' :
strlcpy ( OutputFileName , optarg , MAXPGPATH ) ;
break ;
case ' x ' :
MyAuxProcType = atoi ( optarg ) ;
if ( MyAuxProcType ! = CheckerProcess & &
MyAuxProcType ! = BootstrapProcess )
{
ereport ( ERROR ,
( errcode ( ERRCODE_INVALID_PARAMETER_VALUE ) ,
errmsg ( " -x %s is invalid " , optarg ) ) ) ;
}
break ;
case ' X ' :
{
int WalSegSz = strtoul ( optarg , NULL , 0 ) ;
if ( ! IsValidWalSegSize ( WalSegSz ) )
ereport ( ERROR ,
( errcode ( ERRCODE_INVALID_PARAMETER_VALUE ) ,
errmsg ( " -X requires a power of two value between 1 MB and 1 GB " ) ) ) ;
SetConfigOption ( " wal_segment_size " , optarg , PGC_INTERNAL ,
PGC_S_OVERRIDE ) ;
}
break ;
case ' c ' :
case ' - ' :
{
char * name ,
* value ;
ParseLongOption ( optarg , & name , & value ) ;
if ( ! value )
{
if ( flag = = ' - ' )
ereport ( ERROR ,
( errcode ( ERRCODE_SYNTAX_ERROR ) ,
errmsg ( " --%s requires a value " ,
optarg ) ) ) ;
else
ereport ( ERROR ,
( errcode ( ERRCODE_SYNTAX_ERROR ) ,
errmsg ( " -c %s requires a value " ,
optarg ) ) ) ;
}
SetConfigOption ( name , value , PGC_POSTMASTER , PGC_S_ARGV ) ;
free ( name ) ;
if ( value )
free ( value ) ;
break ;
}
default :
write_stderr ( " Try \" %s --help \" for more information. \n " ,
progname ) ;
proc_exit ( 1 ) ;
break ;
}
}
if ( argc ! = optind )
{
write_stderr ( " %s: invalid command-line arguments \n " , progname ) ;
proc_exit ( 1 ) ;
}
/* Acquire configuration parameters */
if ( ! SelectConfigFiles ( userDoption , progname ) )
proc_exit ( 1 ) ;
/*
* Validate we have been given a reasonable - looking DataDir and change
* into it
*/
checkDataDir ( ) ;
ChangeToDataDir ( ) ;
CreateDataDirLockFile ( false ) ;
SetProcessingMode ( BootstrapProcessing ) ;
IgnoreSystemIndexes = true ;
InitializeMaxBackends ( ) ;
BaseInit ( ) ;
/*
* XXX : It might make sense to move this into its own function at some
* point . Right now it seems like it ' d cause more code duplication than
* it ' s worth .
*/
if ( MyAuxProcType = = CheckerProcess )
{
SetProcessingMode ( NormalProcessing ) ;
CheckerModeMain ( ) ;
abort ( ) ;
}
bootstrap_signals ( ) ;
BootStrapXLOG ( ) ;
/*
* To ensure that src / common / link - canary . c is linked into the backend , we