@@ -55,7 +55,6 @@ uint32 bootstrap_data_checksum_version = 0; /* No checksum */
5555
5656
5757static void CheckerModeMain (void );
58- static void BootstrapModeMain (void );
5958static void bootstrap_signals (void );
6059static void ShutdownAuxiliaryProcess (int code , Datum arg );
6160static Form_pg_attribute AllocateAttribute (void );
@@ -194,124 +193,11 @@ static IndexList *ILHead = NULL;
194193 * This code is here just because of historical reasons.
195194 */
196195void
197- AuxiliaryProcessMain (int argc , char * argv [] )
196+ AuxiliaryProcessMain (AuxProcType auxtype )
198197{
199- char * progname = argv [0 ];
200- int flag ;
201- char * userDoption = NULL ;
202-
203- /*
204- * Initialize process environment (already done if under postmaster, but
205- * not if standalone).
206- */
207- if (!IsUnderPostmaster )
208- InitStandaloneProcess (argv [0 ]);
209-
210- /*
211- * process command arguments
212- */
213-
214- /* Set defaults, to be overridden by explicit options below */
215- if (!IsUnderPostmaster )
216- InitializeGUCOptions ();
217-
218- /* Ignore the initial --boot argument, if present */
219- if (argc > 1 && strcmp (argv [1 ], "--boot" ) == 0 )
220- {
221- argv ++ ;
222- argc -- ;
223- }
224-
225- /* If no -x argument, we are a CheckerProcess */
226- MyAuxProcType = CheckerProcess ;
227-
228- while ((flag = getopt (argc , argv , "B:c:d:D:Fkr:x:X:-:" )) != -1 )
229- {
230- switch (flag )
231- {
232- case 'B' :
233- SetConfigOption ("shared_buffers" , optarg , PGC_POSTMASTER , PGC_S_ARGV );
234- break ;
235- case 'D' :
236- userDoption = pstrdup (optarg );
237- break ;
238- case 'd' :
239- {
240- /* Turn on debugging for the bootstrap process. */
241- char * debugstr ;
242-
243- debugstr = psprintf ("debug%s" , optarg );
244- SetConfigOption ("log_min_messages" , debugstr ,
245- PGC_POSTMASTER , PGC_S_ARGV );
246- SetConfigOption ("client_min_messages" , debugstr ,
247- PGC_POSTMASTER , PGC_S_ARGV );
248- pfree (debugstr );
249- }
250- break ;
251- case 'F' :
252- SetConfigOption ("fsync" , "false" , PGC_POSTMASTER , PGC_S_ARGV );
253- break ;
254- case 'k' :
255- bootstrap_data_checksum_version = PG_DATA_CHECKSUM_VERSION ;
256- break ;
257- case 'r' :
258- strlcpy (OutputFileName , optarg , MAXPGPATH );
259- break ;
260- case 'x' :
261- MyAuxProcType = atoi (optarg );
262- break ;
263- case 'X' :
264- {
265- int WalSegSz = strtoul (optarg , NULL , 0 );
266-
267- if (!IsValidWalSegSize (WalSegSz ))
268- ereport (ERROR ,
269- (errcode (ERRCODE_INVALID_PARAMETER_VALUE ),
270- errmsg ("-X requires a power of two value between 1 MB and 1 GB" )));
271- SetConfigOption ("wal_segment_size" , optarg , PGC_INTERNAL ,
272- PGC_S_OVERRIDE );
273- }
274- break ;
275- case 'c' :
276- case '-' :
277- {
278- char * name ,
279- * value ;
280-
281- ParseLongOption (optarg , & name , & value );
282- if (!value )
283- {
284- if (flag == '-' )
285- ereport (ERROR ,
286- (errcode (ERRCODE_SYNTAX_ERROR ),
287- errmsg ("--%s requires a value" ,
288- optarg )));
289- else
290- ereport (ERROR ,
291- (errcode (ERRCODE_SYNTAX_ERROR ),
292- errmsg ("-c %s requires a value" ,
293- optarg )));
294- }
295-
296- SetConfigOption (name , value , PGC_POSTMASTER , PGC_S_ARGV );
297- free (name );
298- if (value )
299- free (value );
300- break ;
301- }
302- default :
303- write_stderr ("Try \"%s --help\" for more information.\n" ,
304- progname );
305- proc_exit (1 );
306- break ;
307- }
308- }
198+ Assert (IsUnderPostmaster );
309199
310- if (argc != optind )
311- {
312- write_stderr ("%s: invalid command-line arguments\n" , progname );
313- proc_exit (1 );
314- }
200+ MyAuxProcType = auxtype ;
315201
316202 switch (MyAuxProcType )
317203 {
@@ -334,47 +220,22 @@ AuxiliaryProcessMain(int argc, char *argv[])
334220 MyBackendType = B_WAL_RECEIVER ;
335221 break ;
336222 default :
223+ elog (ERROR , "something has gone wrong" );
337224 MyBackendType = B_INVALID ;
338225 }
339- if (IsUnderPostmaster )
340- init_ps_display (NULL );
341-
342- /* Acquire configuration parameters, unless inherited from postmaster */
343- if (!IsUnderPostmaster )
344- {
345- if (!SelectConfigFiles (userDoption , progname ))
346- proc_exit (1 );
347- }
348226
349- /*
350- * Validate we have been given a reasonable-looking DataDir and change
351- * into it (if under postmaster, should be done already).
352- */
353- if (!IsUnderPostmaster )
354- {
355- checkDataDir ();
356- ChangeToDataDir ();
357- }
358-
359- /* If standalone, create lockfile for data directory */
360- if (!IsUnderPostmaster )
361- CreateDataDirLockFile (false);
227+ init_ps_display (NULL );
362228
363229 SetProcessingMode (BootstrapProcessing );
364230 IgnoreSystemIndexes = true;
365231
366- /* Initialize MaxBackends (if under postmaster, was done already) */
367- if (!IsUnderPostmaster )
368- InitializeMaxBackends ();
369-
370232 BaseInit ();
371233
372234 /*
373- * When we are an auxiliary process, we aren't going to do the full
374- * InitPostgres pushups, but there are a couple of things that need to get
375- * lit up even in an auxiliary process.
235+ * As an auxiliary process, we aren't going to do the full InitPostgres
236+ * pushups, but there are a couple of things that need to get lit up even
237+ * in an auxiliary process.
376238 */
377- if (IsUnderPostmaster )
378239 {
379240 /*
380241 * Create a PGPROC so we can use LWLocks. In the EXEC_BACKEND case,
@@ -423,22 +284,9 @@ AuxiliaryProcessMain(int argc, char *argv[])
423284 switch (MyAuxProcType )
424285 {
425286 case CheckerProcess :
426- /* don't set signals, they're useless here */
427- CheckerModeMain ();
428- proc_exit (1 ); /* should never return */
429-
430287 case BootstrapProcess :
431-
432- /*
433- * There was a brief instant during which mode was Normal; this is
434- * okay. We need to be in bootstrap mode during BootStrapXLOG for
435- * the sake of multixact initialization.
436- */
437- SetProcessingMode (BootstrapProcessing );
438- bootstrap_signals ();
439- BootStrapXLOG ();
440- BootstrapModeMain ();
441- proc_exit (1 ); /* should never return */
288+ pg_unreachable ();
289+ break ;
442290
443291 case StartupProcess :
444292 StartupProcessMain ();
@@ -490,13 +338,159 @@ CheckerModeMain(void)
490338 * The bootstrap backend doesn't speak SQL, but instead expects
491339 * commands in a special bootstrap language.
492340 */
493- static void
494- BootstrapModeMain (void )
341+ void
342+ BootstrapModeMain (int argc , char * argv [] )
495343{
496344 int i ;
345+ char * progname = argv [0 ];
346+ int flag ;
347+ char * userDoption = NULL ;
497348
498349 Assert (!IsUnderPostmaster );
499- Assert (IsBootstrapProcessingMode ());
350+
351+ InitStandaloneProcess (argv [0 ]);
352+
353+ /* Set defaults, to be overridden by explicit options below */
354+ InitializeGUCOptions ();
355+
356+ /* an initial --boot should be present */
357+ Assert (argc == 1
358+ || strcmp (argv [1 ], "--boot" ) != 0 );
359+ argv ++ ;
360+ argc -- ;
361+
362+ /* If no -x argument, we are a CheckerProcess */
363+ MyAuxProcType = CheckerProcess ;
364+
365+ while ((flag = getopt (argc , argv , "B:c:d:D:Fkr:x:X:-:" )) != -1 )
366+ {
367+ switch (flag )
368+ {
369+ case 'B' :
370+ SetConfigOption ("shared_buffers" , optarg , PGC_POSTMASTER , PGC_S_ARGV );
371+ break ;
372+ case 'D' :
373+ userDoption = pstrdup (optarg );
374+ break ;
375+ case 'd' :
376+ {
377+ /* Turn on debugging for the bootstrap process. */
378+ char * debugstr ;
379+
380+ debugstr = psprintf ("debug%s" , optarg );
381+ SetConfigOption ("log_min_messages" , debugstr ,
382+ PGC_POSTMASTER , PGC_S_ARGV );
383+ SetConfigOption ("client_min_messages" , debugstr ,
384+ PGC_POSTMASTER , PGC_S_ARGV );
385+ pfree (debugstr );
386+ }
387+ break ;
388+ case 'F' :
389+ SetConfigOption ("fsync" , "false" , PGC_POSTMASTER , PGC_S_ARGV );
390+ break ;
391+ case 'k' :
392+ bootstrap_data_checksum_version = PG_DATA_CHECKSUM_VERSION ;
393+ break ;
394+ case 'r' :
395+ strlcpy (OutputFileName , optarg , MAXPGPATH );
396+ break ;
397+ case 'x' :
398+ MyAuxProcType = atoi (optarg );
399+ if (MyAuxProcType != CheckerProcess &&
400+ MyAuxProcType != BootstrapProcess )
401+ {
402+ ereport (ERROR ,
403+ (errcode (ERRCODE_INVALID_PARAMETER_VALUE ),
404+ errmsg ("-x %s is invalid" , optarg )));
405+ }
406+ break ;
407+ case 'X' :
408+ {
409+ int WalSegSz = strtoul (optarg , NULL , 0 );
410+
411+ if (!IsValidWalSegSize (WalSegSz ))
412+ ereport (ERROR ,
413+ (errcode (ERRCODE_INVALID_PARAMETER_VALUE ),
414+ errmsg ("-X requires a power of two value between 1 MB and 1 GB" )));
415+ SetConfigOption ("wal_segment_size" , optarg , PGC_INTERNAL ,
416+ PGC_S_OVERRIDE );
417+ }
418+ break ;
419+ case 'c' :
420+ case '-' :
421+ {
422+ char * name ,
423+ * value ;
424+
425+ ParseLongOption (optarg , & name , & value );
426+ if (!value )
427+ {
428+ if (flag == '-' )
429+ ereport (ERROR ,
430+ (errcode (ERRCODE_SYNTAX_ERROR ),
431+ errmsg ("--%s requires a value" ,
432+ optarg )));
433+ else
434+ ereport (ERROR ,
435+ (errcode (ERRCODE_SYNTAX_ERROR ),
436+ errmsg ("-c %s requires a value" ,
437+ optarg )));
438+ }
439+
440+ SetConfigOption (name , value , PGC_POSTMASTER , PGC_S_ARGV );
441+ free (name );
442+ if (value )
443+ free (value );
444+ break ;
445+ }
446+ default :
447+ write_stderr ("Try \"%s --help\" for more information.\n" ,
448+ progname );
449+ proc_exit (1 );
450+ break ;
451+ }
452+ }
453+
454+ if (argc != optind )
455+ {
456+ write_stderr ("%s: invalid command-line arguments\n" , progname );
457+ proc_exit (1 );
458+ }
459+
460+ /* Acquire configuration parameters */
461+ if (!SelectConfigFiles (userDoption , progname ))
462+ proc_exit (1 );
463+
464+ /*
465+ * Validate we have been given a reasonable-looking DataDir and change
466+ * into it
467+ */
468+ checkDataDir ();
469+ ChangeToDataDir ();
470+
471+ CreateDataDirLockFile (false);
472+
473+ SetProcessingMode (BootstrapProcessing );
474+ IgnoreSystemIndexes = true;
475+
476+ InitializeMaxBackends ();
477+
478+ BaseInit ();
479+
480+ /*
481+ * XXX: It might make sense to move this into its own function at some
482+ * point. Right now it seems like it'd cause more code duplication than
483+ * it's worth.
484+ */
485+ if (MyAuxProcType == CheckerProcess )
486+ {
487+ SetProcessingMode (NormalProcessing );
488+ CheckerModeMain ();
489+ abort ();
490+ }
491+
492+ bootstrap_signals ();
493+ BootStrapXLOG ();
500494
501495 /*
502496 * To ensure that src/common/link-canary.c is linked into the backend, we
0 commit comments