PostgreSQL Source Code  git master
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros
postmaster.h File Reference
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Macros

#define POSTMASTER_FD_WATCH
 
#define POSTMASTER_FD_OWN   1 /* kept open by postmaster only */
 
#define MAX_BACKENDS   0x3FFFF
 

Functions

void PostmasterMain (int argc, char *argv[]) pg_attribute_noreturn()
 
void ClosePostmasterPorts (bool am_syslogger)
 
int MaxLivePostmasterChildren (void)
 
int GetNumShmemAttachedBgworkers (void)
 
bool PostmasterMarkPIDForWorkerNotify (int)
 

Variables

bool EnableSSL
 
int ReservedBackends
 
int PostPortNumber
 
int Unix_socket_permissions
 
char * Unix_socket_group
 
char * Unix_socket_directories
 
char * ListenAddresses
 
bool ClientAuthInProgress
 
int PreAuthDelay
 
int AuthenticationTimeout
 
bool Log_connections
 
bool log_hostname
 
bool enable_bonjour
 
char * bonjour_name
 
bool restart_after_crash
 
int postmaster_alive_fds [2]
 
const char * progname
 

Macro Definition Documentation

#define POSTMASTER_FD_OWN   1 /* kept open by postmaster only */

Definition at line 44 of file postmaster.h.

Referenced by ClosePostmasterPorts().

#define POSTMASTER_FD_WATCH
Value:
0 /* used in children to check for
* postmaster death */

Definition at line 42 of file postmaster.h.

Referenced by AddWaitEventToSet(), InitPostmasterDeathWatchHandle(), and PostmasterIsAlive().

Function Documentation

void ClosePostmasterPorts ( bool  am_syslogger)

Definition at line 2449 of file postmaster.c.

References close, ereport, errcode_for_file_access(), errmsg_internal(), FATAL, i, ListenSocket, MAXLISTEN, PGINVALID_SOCKET, postmaster_alive_fds, POSTMASTER_FD_OWN, StreamClose(), and syslogPipe.

Referenced by BackendStartup(), do_start_bgworker(), pgarch_start(), pgstat_start(), StartAutoVacLauncher(), StartAutoVacWorker(), StartChildProcess(), and SysLogger_Start().

2450 {
2451  int i;
2452 
2453 #ifndef WIN32
2454 
2455  /*
2456  * Close the write end of postmaster death watch pipe. It's important to
2457  * do this as early as possible, so that if postmaster dies, others won't
2458  * think that it's still running because we're holding the pipe open.
2459  */
2461  ereport(FATAL,
2463  errmsg_internal("could not close postmaster death monitoring pipe in child process: %m")));
2465 #endif
2466 
2467  /* Close the listen sockets */
2468  for (i = 0; i < MAXLISTEN; i++)
2469  {
2470  if (ListenSocket[i] != PGINVALID_SOCKET)
2471  {
2474  }
2475  }
2476 
2477  /* If using syslogger, close the read side of the pipe */
2478  if (!am_syslogger)
2479  {
2480 #ifndef WIN32
2481  if (syslogPipe[0] >= 0)
2482  close(syslogPipe[0]);
2483  syslogPipe[0] = -1;
2484 #else
2485  if (syslogPipe[0])
2486  CloseHandle(syslogPipe[0]);
2487  syslogPipe[0] = 0;
2488 #endif
2489  }
2490 
2491 #ifdef USE_BONJOUR
2492  /* If using Bonjour, close the connection to the mDNS daemon */
2493  if (bonjour_sdref)
2494  close(DNSServiceRefSockFD(bonjour_sdref));
2495 #endif
2496 }
void StreamClose(pgsocket sock)
Definition: pqcomm.c:844
#define FATAL
Definition: elog.h:52
bool am_syslogger
Definition: syslogger.c:74
#define POSTMASTER_FD_OWN
Definition: postmaster.h:44
int errcode_for_file_access(void)
Definition: elog.c:598
#define ereport(elevel, rest)
Definition: elog.h:122
int postmaster_alive_fds[2]
Definition: postmaster.c:563
static pgsocket ListenSocket[MAXLISTEN]
Definition: postmaster.c:216
#define PGINVALID_SOCKET
Definition: port.h:24
int errmsg_internal(const char *fmt,...)
Definition: elog.c:827
int i
#define close(a)
Definition: win32.h:12
#define MAXLISTEN
Definition: postmaster.c:215
int syslogPipe[2]
Definition: syslogger.c:112
int GetNumShmemAttachedBgworkers ( void  )
int MaxLivePostmasterChildren ( void  )

Definition at line 5517 of file postmaster.c.

References autovacuum_max_workers, max_worker_processes, and MaxConnections.

Referenced by canAcceptConnections(), PMSignalShmemInit(), PMSignalShmemSize(), and processCancelRequest().

5518 {
5519  return 2 * (MaxConnections + autovacuum_max_workers + 1 +
5521 }
int MaxConnections
Definition: globals.c:124
int autovacuum_max_workers
Definition: autovacuum.c:114
int max_worker_processes
Definition: globals.c:125
void PostmasterMain ( int  argc,
char *  argv[] 
)

Definition at line 573 of file postmaster.c.

References AddToDataDirLockFile(), ALLOCSET_DEFAULT_SIZES, AllocSetContextCreate(), ApplyLauncherRegister(), ARCHIVE_MODE_OFF, Assert, autovac_init(), BlockSig, bonjour_name, ChangeToDataDir(), checkDataDir(), CheckDateTokenTables(), CloseServerPorts(), CreateDataDirLockFile(), CreateOptsFile(), DEBUG3, DestNone, dummy_handler(), elog, enable_bonjour, EnableSSL, environ, ereport, errcode(), errcode_for_file_access(), errhint(), errmsg(), errmsg_internal(), ERROR, ExitPostmaster(), external_pid_file, ExtraOptions, FATAL, free, get_stats_option_name(), GetConfigOption(), GetCurrentTimestamp(), getInstallationPaths(), getopt(), gettimeofday(), i, InitializeGUCOptions(), InitializeMaxBackends(), InitPostmasterDeathWatchHandle(), IsBinaryUpgrade, IsPostmasterEnvironment, lfirst, list_free(), list_free_deep(), ListenAddresses, ListenSocket, load_hba(), load_ident(), LOCK_FILE_LINE_LISTEN_ADDR, LOCK_FILE_LINE_PM_STATUS, LOCK_FILE_LINE_SOCKET_DIR, LOG, Log_destination, LOG_DESTINATION_STDERR, Log_destination_string, LOG_METAINFO_DATAFILE, max_wal_senders, MaxConnections, MAXLISTEN, maybe_start_bgworkers(), MemoryContextSwitchTo(), my_exec_path, MyProcPid, MyStartTime, name, NIL, NULL, on_proc_exit(), optarg, opterr, optind, ParseLongOption(), pfree(), PG_SETMASK, PGC_POSTMASTER, PGC_S_ARGV, PGINVALID_SOCKET, PgStartTime, pgstat_init(), PM_STARTUP, PM_STATUS_STARTING, pmdie(), pmState, PostmasterContext, PostmasterPid, PostPortNumber, pqinitmask(), pqsignal(), pqsignal_no_restart(), process_shared_preload_libraries(), progname, pstrdup(), random_start_time, reaper(), Reinit, RemovePgTempFiles(), RemovePromoteSignalFiles(), ReservedBackends, reset_shared(), S_IRGRP, S_IROTH, S_IRWXG, S_IRWXO, secure_initialize(), SelectConfigFiles(), SendStop, ServerLoop(), set_debug_options(), set_max_safe_fds(), set_plan_disabling_options(), set_stack_base(), SetConfigOption(), SIG_IGN, SIGALRM, SIGCHLD, SIGHUP, SIGHUP_handler(), SIGPIPE, SIGQUIT, SIGTTIN, SIGTTOU, SIGUSR1, sigusr1_handler(), SIGUSR2, snprintf(), SplitDirectoriesString(), SplitIdentifierString(), srandom(), STARTUP_RUNNING, StartupDataBase, StartupPID, StartupStatus, status(), STATUS_OK, StreamServerPort(), strerror(), success, SysLogger_Start(), SysLoggerPID, TopMemoryContext, Unix_socket_directories, unlink(), unlink_external_pid_file(), userDoption, value, wal_level, WAL_LEVEL_MINIMAL, WARNING, whereToSendOutput, write_stderr, and XLogArchiveMode.

Referenced by main().

574 {
575  int opt;
576  int status;
577  char *userDoption = NULL;
578  bool listen_addr_saved = false;
579  int i;
580  char *output_config_variable = NULL;
581 
582  MyProcPid = PostmasterPid = getpid();
583 
584  MyStartTime = time(NULL);
585 
587 
588  /*
589  * for security, no dir or file created can be group or other accessible
590  */
591  umask(S_IRWXG | S_IRWXO);
592 
593  /*
594  * Initialize random(3) so we don't get the same values in every run.
595  *
596  * Note: the seed is pretty predictable from externally-visible facts such
597  * as postmaster start time, so avoid using random() for security-critical
598  * random values during postmaster startup. At the time of first
599  * connection, PostmasterRandom will select a hopefully-more-random seed.
600  */
601  srandom((unsigned int) (MyProcPid ^ MyStartTime));
602 
603  /*
604  * By default, palloc() requests in the postmaster will be allocated in
605  * the PostmasterContext, which is space that can be recycled by backends.
606  * Allocated data that needs to be available to backends should be
607  * allocated in TopMemoryContext.
608  */
610  "Postmaster",
613 
614  /* Initialize paths to installation files */
615  getInstallationPaths(argv[0]);
616 
617  /*
618  * Set up signal handlers for the postmaster process.
619  *
620  * In the postmaster, we want to install non-ignored handlers *without*
621  * SA_RESTART. This is because they'll be blocked at all times except
622  * when ServerLoop is waiting for something to happen, and during that
623  * window, we want signals to exit the select(2) wait so that ServerLoop
624  * can respond if anything interesting happened. On some platforms,
625  * signals marked SA_RESTART would not cause the select() wait to end.
626  * Child processes will generally want SA_RESTART, but we expect them to
627  * set up their own handlers before unblocking signals.
628  *
629  * CAUTION: when changing this list, check for side-effects on the signal
630  * handling setup of child processes. See tcop/postgres.c,
631  * bootstrap/bootstrap.c, postmaster/bgwriter.c, postmaster/walwriter.c,
632  * postmaster/autovacuum.c, postmaster/pgarch.c, postmaster/pgstat.c,
633  * postmaster/syslogger.c, postmaster/bgworker.c and
634  * postmaster/checkpointer.c.
635  */
636  pqinitmask();
638 
639  pqsignal_no_restart(SIGHUP, SIGHUP_handler); /* reread config file and
640  * have children do same */
641  pqsignal_no_restart(SIGINT, pmdie); /* send SIGTERM and shut down */
642  pqsignal_no_restart(SIGQUIT, pmdie); /* send SIGQUIT and die */
643  pqsignal_no_restart(SIGTERM, pmdie); /* wait for children and shut down */
644  pqsignal(SIGALRM, SIG_IGN); /* ignored */
645  pqsignal(SIGPIPE, SIG_IGN); /* ignored */
646  pqsignal_no_restart(SIGUSR1, sigusr1_handler); /* message from child
647  * process */
648  pqsignal_no_restart(SIGUSR2, dummy_handler); /* unused, reserve for
649  * children */
650  pqsignal_no_restart(SIGCHLD, reaper); /* handle child termination */
651  pqsignal(SIGTTIN, SIG_IGN); /* ignored */
652  pqsignal(SIGTTOU, SIG_IGN); /* ignored */
653  /* ignore SIGXFSZ, so that ulimit violations work like disk full */
654 #ifdef SIGXFSZ
655  pqsignal(SIGXFSZ, SIG_IGN); /* ignored */
656 #endif
657 
658  /*
659  * Options setup
660  */
662 
663  opterr = 1;
664 
665  /*
666  * Parse command-line options. CAUTION: keep this in sync with
667  * tcop/postgres.c (the option sets should not conflict) and with the
668  * common help() function in main/main.c.
669  */
670  while ((opt = getopt(argc, argv, "B:bc:C:D:d:EeFf:h:ijk:lN:nOo:Pp:r:S:sTt:W:-:")) != -1)
671  {
672  switch (opt)
673  {
674  case 'B':
675  SetConfigOption("shared_buffers", optarg, PGC_POSTMASTER, PGC_S_ARGV);
676  break;
677 
678  case 'b':
679  /* Undocumented flag used for binary upgrades */
680  IsBinaryUpgrade = true;
681  break;
682 
683  case 'C':
684  output_config_variable = strdup(optarg);
685  break;
686 
687  case 'D':
688  userDoption = strdup(optarg);
689  break;
690 
691  case 'd':
693  break;
694 
695  case 'E':
696  SetConfigOption("log_statement", "all", PGC_POSTMASTER, PGC_S_ARGV);
697  break;
698 
699  case 'e':
700  SetConfigOption("datestyle", "euro", PGC_POSTMASTER, PGC_S_ARGV);
701  break;
702 
703  case 'F':
704  SetConfigOption("fsync", "false", PGC_POSTMASTER, PGC_S_ARGV);
705  break;
706 
707  case 'f':
709  {
710  write_stderr("%s: invalid argument for option -f: \"%s\"\n",
711  progname, optarg);
712  ExitPostmaster(1);
713  }
714  break;
715 
716  case 'h':
717  SetConfigOption("listen_addresses", optarg, PGC_POSTMASTER, PGC_S_ARGV);
718  break;
719 
720  case 'i':
721  SetConfigOption("listen_addresses", "*", PGC_POSTMASTER, PGC_S_ARGV);
722  break;
723 
724  case 'j':
725  /* only used by interactive backend */
726  break;
727 
728  case 'k':
729  SetConfigOption("unix_socket_directories", optarg, PGC_POSTMASTER, PGC_S_ARGV);
730  break;
731 
732  case 'l':
733  SetConfigOption("ssl", "true", PGC_POSTMASTER, PGC_S_ARGV);
734  break;
735 
736  case 'N':
737  SetConfigOption("max_connections", optarg, PGC_POSTMASTER, PGC_S_ARGV);
738  break;
739 
740  case 'n':
741  /* Don't reinit shared mem after abnormal exit */
742  Reinit = false;
743  break;
744 
745  case 'O':
746  SetConfigOption("allow_system_table_mods", "true", PGC_POSTMASTER, PGC_S_ARGV);
747  break;
748 
749  case 'o':
750  /* Other options to pass to the backend on the command line */
752  sizeof(ExtraOptions) - strlen(ExtraOptions),
753  " %s", optarg);
754  break;
755 
756  case 'P':
757  SetConfigOption("ignore_system_indexes", "true", PGC_POSTMASTER, PGC_S_ARGV);
758  break;
759 
760  case 'p':
762  break;
763 
764  case 'r':
765  /* only used by single-user backend */
766  break;
767 
768  case 'S':
770  break;
771 
772  case 's':
773  SetConfigOption("log_statement_stats", "true", PGC_POSTMASTER, PGC_S_ARGV);
774  break;
775 
776  case 'T':
777 
778  /*
779  * In the event that some backend dumps core, send SIGSTOP,
780  * rather than SIGQUIT, to all its peers. This lets the wily
781  * post_hacker collect core dumps from everyone.
782  */
783  SendStop = true;
784  break;
785 
786  case 't':
787  {
788  const char *tmp = get_stats_option_name(optarg);
789 
790  if (tmp)
791  {
793  }
794  else
795  {
796  write_stderr("%s: invalid argument for option -t: \"%s\"\n",
797  progname, optarg);
798  ExitPostmaster(1);
799  }
800  break;
801  }
802 
803  case 'W':
804  SetConfigOption("post_auth_delay", optarg, PGC_POSTMASTER, PGC_S_ARGV);
805  break;
806 
807  case 'c':
808  case '-':
809  {
810  char *name,
811  *value;
812 
813  ParseLongOption(optarg, &name, &value);
814  if (!value)
815  {
816  if (opt == '-')
817  ereport(ERROR,
818  (errcode(ERRCODE_SYNTAX_ERROR),
819  errmsg("--%s requires a value",
820  optarg)));
821  else
822  ereport(ERROR,
823  (errcode(ERRCODE_SYNTAX_ERROR),
824  errmsg("-c %s requires a value",
825  optarg)));
826  }
827 
829  free(name);
830  if (value)
831  free(value);
832  break;
833  }
834 
835  default:
836  write_stderr("Try \"%s --help\" for more information.\n",
837  progname);
838  ExitPostmaster(1);
839  }
840  }
841 
842  /*
843  * Postmaster accepts no non-option switch arguments.
844  */
845  if (optind < argc)
846  {
847  write_stderr("%s: invalid argument: \"%s\"\n",
848  progname, argv[optind]);
849  write_stderr("Try \"%s --help\" for more information.\n",
850  progname);
851  ExitPostmaster(1);
852  }
853 
854  /*
855  * Locate the proper configuration files and data directory, and read
856  * postgresql.conf for the first time.
857  */
858  if (!SelectConfigFiles(userDoption, progname))
859  ExitPostmaster(2);
860 
861  if (output_config_variable != NULL)
862  {
863  /*
864  * "-C guc" was specified, so print GUC's value and exit. No extra
865  * permission check is needed because the user is reading inside the
866  * data dir.
867  */
868  const char *config_val = GetConfigOption(output_config_variable,
869  false, false);
870 
871  puts(config_val ? config_val : "");
872  ExitPostmaster(0);
873  }
874 
875  /* Verify that DataDir looks reasonable */
876  checkDataDir();
877 
878  /* And switch working directory into it */
879  ChangeToDataDir();
880 
881  /*
882  * Check for invalid combinations of GUC settings.
883  */
885  {
886  write_stderr("%s: superuser_reserved_connections must be less than max_connections\n", progname);
887  ExitPostmaster(1);
888  }
890  {
891  write_stderr("%s: max_wal_senders must be less than max_connections\n", progname);
892  ExitPostmaster(1);
893  }
895  ereport(ERROR,
896  (errmsg("WAL archival cannot be enabled when wal_level is \"minimal\"")));
898  ereport(ERROR,
899  (errmsg("WAL streaming (max_wal_senders > 0) requires wal_level \"replica\" or \"logical\"")));
900 
901  /*
902  * Other one-time internal sanity checks can go here, if they are fast.
903  * (Put any slow processing further down, after postmaster.pid creation.)
904  */
905  if (!CheckDateTokenTables())
906  {
907  write_stderr("%s: invalid datetoken tables, please fix\n", progname);
908  ExitPostmaster(1);
909  }
910 
911  /*
912  * Now that we are done processing the postmaster arguments, reset
913  * getopt(3) library so that it will work correctly in subprocesses.
914  */
915  optind = 1;
916 #ifdef HAVE_INT_OPTRESET
917  optreset = 1; /* some systems need this too */
918 #endif
919 
920  /* For debugging: display postmaster environment */
921  {
922  extern char **environ;
923  char **p;
924 
925  ereport(DEBUG3,
926  (errmsg_internal("%s: PostmasterMain: initial environment dump:",
927  progname)));
928  ereport(DEBUG3,
929  (errmsg_internal("-----------------------------------------")));
930  for (p = environ; *p; ++p)
931  ereport(DEBUG3,
932  (errmsg_internal("\t%s", *p)));
933  ereport(DEBUG3,
934  (errmsg_internal("-----------------------------------------")));
935  }
936 
937  /*
938  * Create lockfile for data directory.
939  *
940  * We want to do this before we try to grab the input sockets, because the
941  * data directory interlock is more reliable than the socket-file
942  * interlock (thanks to whoever decided to put socket files in /tmp :-().
943  * For the same reason, it's best to grab the TCP socket(s) before the
944  * Unix socket(s).
945  *
946  * Also note that this internally sets up the on_proc_exit function that
947  * is responsible for removing both data directory and socket lockfiles;
948  * so it must happen before opening sockets so that at exit, the socket
949  * lockfiles go away after CloseServerPorts runs.
950  */
951  CreateDataDirLockFile(true);
952 
953  /*
954  * Initialize SSL library, if specified.
955  */
956 #ifdef USE_SSL
957  if (EnableSSL)
958  {
959  (void) secure_initialize(true);
960  LoadedSSL = true;
961  }
962 #endif
963 
964  /*
965  * Register the apply launcher. Since it registers a background worker,
966  * it needs to be called before InitializeMaxBackends(), and it's probably
967  * a good idea to call it before any modules had chance to take the
968  * background worker slots.
969  */
971 
972  /*
973  * process any libraries that should be preloaded at postmaster start
974  */
976 
977  /*
978  * Now that loadable modules have had their chance to register background
979  * workers, calculate MaxBackends.
980  */
982 
983  /*
984  * Establish input sockets.
985  *
986  * First, mark them all closed, and set up an on_proc_exit function that's
987  * charged with closing the sockets again at postmaster shutdown.
988  */
989  for (i = 0; i < MAXLISTEN; i++)
991 
993 
994  if (ListenAddresses)
995  {
996  char *rawstring;
997  List *elemlist;
998  ListCell *l;
999  int success = 0;
1000 
1001  /* Need a modifiable copy of ListenAddresses */
1002  rawstring = pstrdup(ListenAddresses);
1003 
1004  /* Parse string into list of hostnames */
1005  if (!SplitIdentifierString(rawstring, ',', &elemlist))
1006  {
1007  /* syntax error in list */
1008  ereport(FATAL,
1009  (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
1010  errmsg("invalid list syntax in parameter \"%s\"",
1011  "listen_addresses")));
1012  }
1013 
1014  foreach(l, elemlist)
1015  {
1016  char *curhost = (char *) lfirst(l);
1017 
1018  if (strcmp(curhost, "*") == 0)
1019  status = StreamServerPort(AF_UNSPEC, NULL,
1020  (unsigned short) PostPortNumber,
1021  NULL,
1023  else
1024  status = StreamServerPort(AF_UNSPEC, curhost,
1025  (unsigned short) PostPortNumber,
1026  NULL,
1027  ListenSocket, MAXLISTEN);
1028 
1029  if (status == STATUS_OK)
1030  {
1031  success++;
1032  /* record the first successful host addr in lockfile */
1033  if (!listen_addr_saved)
1034  {
1036  listen_addr_saved = true;
1037  }
1038  }
1039  else
1040  ereport(WARNING,
1041  (errmsg("could not create listen socket for \"%s\"",
1042  curhost)));
1043  }
1044 
1045  if (!success && elemlist != NIL)
1046  ereport(FATAL,
1047  (errmsg("could not create any TCP/IP sockets")));
1048 
1049  list_free(elemlist);
1050  pfree(rawstring);
1051  }
1052 
1053 #ifdef USE_BONJOUR
1054  /* Register for Bonjour only if we opened TCP socket(s) */
1055  if (enable_bonjour && ListenSocket[0] != PGINVALID_SOCKET)
1056  {
1057  DNSServiceErrorType err;
1058 
1059  /*
1060  * We pass 0 for interface_index, which will result in registering on
1061  * all "applicable" interfaces. It's not entirely clear from the
1062  * DNS-SD docs whether this would be appropriate if we have bound to
1063  * just a subset of the available network interfaces.
1064  */
1065  err = DNSServiceRegister(&bonjour_sdref,
1066  0,
1067  0,
1068  bonjour_name,
1069  "_postgresql._tcp.",
1070  NULL,
1071  NULL,
1072  htons(PostPortNumber),
1073  0,
1074  NULL,
1075  NULL,
1076  NULL);
1077  if (err != kDNSServiceErr_NoError)
1078  elog(LOG, "DNSServiceRegister() failed: error code %ld",
1079  (long) err);
1080 
1081  /*
1082  * We don't bother to read the mDNS daemon's reply, and we expect that
1083  * it will automatically terminate our registration when the socket is
1084  * closed at postmaster termination. So there's nothing more to be
1085  * done here. However, the bonjour_sdref is kept around so that
1086  * forked children can close their copies of the socket.
1087  */
1088  }
1089 #endif
1090 
1091 #ifdef HAVE_UNIX_SOCKETS
1093  {
1094  char *rawstring;
1095  List *elemlist;
1096  ListCell *l;
1097  int success = 0;
1098 
1099  /* Need a modifiable copy of Unix_socket_directories */
1100  rawstring = pstrdup(Unix_socket_directories);
1101 
1102  /* Parse string into list of directories */
1103  if (!SplitDirectoriesString(rawstring, ',', &elemlist))
1104  {
1105  /* syntax error in list */
1106  ereport(FATAL,
1107  (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
1108  errmsg("invalid list syntax in parameter \"%s\"",
1109  "unix_socket_directories")));
1110  }
1111 
1112  foreach(l, elemlist)
1113  {
1114  char *socketdir = (char *) lfirst(l);
1115 
1116  status = StreamServerPort(AF_UNIX, NULL,
1117  (unsigned short) PostPortNumber,
1118  socketdir,
1119  ListenSocket, MAXLISTEN);
1120 
1121  if (status == STATUS_OK)
1122  {
1123  success++;
1124  /* record the first successful Unix socket in lockfile */
1125  if (success == 1)
1127  }
1128  else
1129  ereport(WARNING,
1130  (errmsg("could not create Unix-domain socket in directory \"%s\"",
1131  socketdir)));
1132  }
1133 
1134  if (!success && elemlist != NIL)
1135  ereport(FATAL,
1136  (errmsg("could not create any Unix-domain sockets")));
1137 
1138  list_free_deep(elemlist);
1139  pfree(rawstring);
1140  }
1141 #endif
1142 
1143  /*
1144  * check that we have some socket to listen on
1145  */
1146  if (ListenSocket[0] == PGINVALID_SOCKET)
1147  ereport(FATAL,
1148  (errmsg("no socket created for listening")));
1149 
1150  /*
1151  * If no valid TCP ports, write an empty line for listen address,
1152  * indicating the Unix socket must be used. Note that this line is not
1153  * added to the lock file until there is a socket backing it.
1154  */
1155  if (!listen_addr_saved)
1157 
1158  /*
1159  * Set up shared memory and semaphores.
1160  */
1162 
1163  /*
1164  * Estimate number of openable files. This must happen after setting up
1165  * semaphores, because on some platforms semaphores count as open files.
1166  */
1167  set_max_safe_fds();
1168 
1169  /*
1170  * Set reference point for stack-depth checking.
1171  */
1172  set_stack_base();
1173 
1174  /*
1175  * Initialize pipe (or process handle on Windows) that allows children to
1176  * wake up from sleep on postmaster death.
1177  */
1179 
1180 #ifdef WIN32
1181 
1182  /*
1183  * Initialize I/O completion port used to deliver list of dead children.
1184  */
1185  win32ChildQueue = CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, 0, 1);
1186  if (win32ChildQueue == NULL)
1187  ereport(FATAL,
1188  (errmsg("could not create I/O completion port for child queue")));
1189 #endif
1190 
1191  /*
1192  * Record postmaster options. We delay this till now to avoid recording
1193  * bogus options (eg, NBuffers too high for available memory).
1194  */
1195  if (!CreateOptsFile(argc, argv, my_exec_path))
1196  ExitPostmaster(1);
1197 
1198 #ifdef EXEC_BACKEND
1199  /* Write out nondefault GUC settings for child processes to use */
1200  write_nondefault_variables(PGC_POSTMASTER);
1201 #endif
1202 
1203  /*
1204  * Write the external PID file if requested
1205  */
1206  if (external_pid_file)
1207  {
1208  FILE *fpidfile = fopen(external_pid_file, "w");
1209 
1210  if (fpidfile)
1211  {
1212  fprintf(fpidfile, "%d\n", MyProcPid);
1213  fclose(fpidfile);
1214 
1215  /* Make PID file world readable */
1216  if (chmod(external_pid_file, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH) != 0)
1217  write_stderr("%s: could not change permissions of external PID file \"%s\": %s\n",
1219  }
1220  else
1221  write_stderr("%s: could not write external PID file \"%s\": %s\n",
1223 
1225  }
1226 
1227  /*
1228  * Remove old temporary files. At this point there can be no other
1229  * Postgres processes running in this directory, so this should be safe.
1230  */
1232 
1233  /*
1234  * Forcibly remove the files signaling a standby promotion request.
1235  * Otherwise, the existence of those files triggers a promotion too early,
1236  * whether a user wants that or not.
1237  *
1238  * This removal of files is usually unnecessary because they can exist
1239  * only during a few moments during a standby promotion. However there is
1240  * a race condition: if pg_ctl promote is executed and creates the files
1241  * during a promotion, the files can stay around even after the server is
1242  * brought up to new master. Then, if new standby starts by using the
1243  * backup taken from that master, the files can exist at the server
1244  * startup and should be removed in order to avoid an unexpected
1245  * promotion.
1246  *
1247  * Note that promotion signal files need to be removed before the startup
1248  * process is invoked. Because, after that, they can be used by
1249  * postmaster's SIGUSR1 signal handler.
1250  */
1252 
1253  /* Remove any outdated file holding the current log filenames. */
1254  if (unlink(LOG_METAINFO_DATAFILE) < 0 && errno != ENOENT)
1255  ereport(LOG,
1257  errmsg("could not remove file \"%s\": %m",
1259 
1260  /*
1261  * If enabled, start up syslogger collection subprocess
1262  */
1264 
1265  /*
1266  * Reset whereToSendOutput from DestDebug (its starting state) to
1267  * DestNone. This stops ereport from sending log messages to stderr unless
1268  * Log_destination permits. We don't do this until the postmaster is
1269  * fully launched, since startup failures may as well be reported to
1270  * stderr.
1271  *
1272  * If we are in fact disabling logging to stderr, first emit a log message
1273  * saying so, to provide a breadcrumb trail for users who may not remember
1274  * that their logging is configured to go somewhere else.
1275  */
1277  ereport(LOG,
1278  (errmsg("ending log output to stderr"),
1279  errhint("Future log output will go to log destination \"%s\".",
1281 
1283 
1284  /*
1285  * Initialize stats collection subsystem (this does NOT start the
1286  * collector process!)
1287  */
1288  pgstat_init();
1289 
1290  /*
1291  * Initialize the autovacuum subsystem (again, no process start yet)
1292  */
1293  autovac_init();
1294 
1295  /*
1296  * Load configuration files for client authentication.
1297  */
1298  if (!load_hba())
1299  {
1300  /*
1301  * It makes no sense to continue if we fail to load the HBA file,
1302  * since there is no way to connect to the database in this case.
1303  */
1304  ereport(FATAL,
1305  (errmsg("could not load pg_hba.conf")));
1306  }
1307  if (!load_ident())
1308  {
1309  /*
1310  * We can start up without the IDENT file, although it means that you
1311  * cannot log in using any of the authentication methods that need a
1312  * user name mapping. load_ident() already logged the details of error
1313  * to the log.
1314  */
1315  }
1316 
1317 #ifdef HAVE_PTHREAD_IS_THREADED_NP
1318 
1319  /*
1320  * On macOS, libintl replaces setlocale() with a version that calls
1321  * CFLocaleCopyCurrent() when its second argument is "" and every relevant
1322  * environment variable is unset or empty. CFLocaleCopyCurrent() makes
1323  * the process multithreaded. The postmaster calls sigprocmask() and
1324  * calls fork() without an immediate exec(), both of which have undefined
1325  * behavior in a multithreaded program. A multithreaded postmaster is the
1326  * normal case on Windows, which offers neither fork() nor sigprocmask().
1327  */
1328  if (pthread_is_threaded_np() != 0)
1329  ereport(FATAL,
1330  (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
1331  errmsg("postmaster became multithreaded during startup"),
1332  errhint("Set the LC_ALL environment variable to a valid locale.")));
1333 #endif
1334 
1335  /*
1336  * Remember postmaster startup time
1337  */
1339 #ifndef HAVE_STRONG_RANDOM
1340  /* RandomCancelKey wants its own copy */
1342 #endif
1343 
1344  /*
1345  * Report postmaster status in the postmaster.pid file, to allow pg_ctl to
1346  * see what's happening.
1347  */
1349 
1350  /*
1351  * We're ready to rock and roll...
1352  */
1354  Assert(StartupPID != 0);
1356  pmState = PM_STARTUP;
1357 
1358  /* Some workers may be scheduled to start now */
1360 
1361  status = ServerLoop();
1362 
1363  /*
1364  * ServerLoop probably shouldn't ever return, but if it does, close down.
1365  */
1366  ExitPostmaster(status != STATUS_OK);
1367 
1368  abort(); /* not reached */
1369 }
pg_stack_base_t set_stack_base(void)
Definition: postgres.c:3064
const char * GetConfigOption(const char *name, bool missing_ok, bool restrict_superuser)
Definition: guc.c:6707
int secure_initialize(bool isServerStart)
Definition: be-secure.c:74
#define NIL
Definition: pg_list.h:69
bool IsPostmasterEnvironment
Definition: globals.c:100
bool EnableSSL
Definition: postmaster.c:234
#define SIGUSR1
Definition: win32.h:202
static StartupStatusEnum StartupStatus
Definition: postmaster.c:267
int gettimeofday(struct timeval *tp, struct timezone *tzp)
Definition: gettimeofday.c:105
static void unlink_external_pid_file(int status, Datum arg)
Definition: postmaster.c:1412
int MyProcPid
Definition: globals.c:39
int errhint(const char *fmt,...)
Definition: elog.c:987
#define StartupDataBase()
Definition: postmaster.c:547
#define DEBUG3
Definition: elog.h:23
TimestampTz GetCurrentTimestamp(void)
Definition: timestamp.c:1570
pqsigfunc pqsignal_no_restart(int signo, pqsigfunc func)
Definition: pqsignal.c:71
void on_proc_exit(pg_on_exit_callback function, Datum arg)
Definition: ipc.c:292
void AddToDataDirLockFile(int target_line, const char *str)
Definition: miscinit.c:1158
int wal_level
Definition: xlog.c:104
char * pstrdup(const char *in)
Definition: mcxt.c:1077
static void dummy_handler(SIGNAL_ARGS)
Definition: postmaster.c:5167
void ParseLongOption(const char *string, char **name, char **value)
Definition: guc.c:9385
pg_time_t MyStartTime
Definition: globals.c:40
bool set_plan_disabling_options(const char *arg, GucContext context, GucSource source)
Definition: postgres.c:3241
#define SIGTTIN
Definition: win32.h:199
static MemoryContext MemoryContextSwitchTo(MemoryContext context)
Definition: palloc.h:109
#define write_stderr(str)
Definition: parallel.c:180
static bool CreateOptsFile(int argc, char *argv[], char *fullprogname)
Definition: postmaster.c:5477
bool CheckDateTokenTables(void)
Definition: datetime.c:4464
int errcode(int sqlerrcode)
Definition: elog.c:575
#define LOG_METAINFO_DATAFILE
Definition: syslogger.h:94
const char * get_stats_option_name(const char *arg)
Definition: postgres.c:3283
int snprintf(char *str, size_t count, const char *fmt,...) pg_attribute_printf(3
int SysLogger_Start(void)
Definition: syslogger.c:520
void set_debug_options(int debug_flag, GucContext context, GucSource source)
Definition: postgres.c:3212
#define LOG
Definition: elog.h:26
const char * progname
Definition: pg_standby.c:37
void list_free_deep(List *list)
Definition: list.c:1147
char * Unix_socket_directories
Definition: postmaster.c:198
bool IsBinaryUpgrade
Definition: globals.c:102
#define SIGQUIT
Definition: win32.h:189
int getopt(int nargc, char *const *nargv, const char *ostr)
Definition: getopt.c:72
#define PG_SETMASK(mask)
Definition: pqsignal.h:19
bool load_ident(void)
Definition: hba.c:2876
void autovac_init(void)
Definition: autovacuum.c:3224
void pqinitmask(void)
Definition: pqsignal.c:41
static void CloseServerPorts(int status, Datum arg)
Definition: postmaster.c:1376
static void InitPostmasterDeathWatchHandle(void)
Definition: postmaster.c:6375
bool SplitDirectoriesString(char *rawstring, char separator, List **namelist)
Definition: varlena.c:3387
static void checkDataDir(void)
Definition: postmaster.c:1475
#define PM_STATUS_STARTING
Definition: pidfile.h:50
void pfree(void *pointer)
Definition: mcxt.c:950
#define SIG_IGN
Definition: win32.h:185
int optind
Definition: getopt.c:51
#define ERROR
Definition: elog.h:43
void CreateDataDirLockFile(bool amPostmaster)
Definition: miscinit.c:1081
static pid_t StartupPID
Definition: postmaster.c:248
int PostPortNumber
Definition: postmaster.c:195
int ReservedBackends
Definition: postmaster.c:212
static void ExitPostmaster(int status) pg_attribute_noreturn()
Definition: postmaster.c:4958
#define FATAL
Definition: elog.h:52
#define LOCK_FILE_LINE_SOCKET_DIR
Definition: pidfile.h:40
static struct @121 value
char * external_pid_file
Definition: guc.c:465
#define ALLOCSET_DEFAULT_SIZES
Definition: memutils.h:165
#define S_IRGRP
Definition: win32.h:448
static bool success
Definition: pg_basebackup.c:96
Definition: dest.h:88
void SetConfigOption(const char *name, const char *value, GucContext context, GucSource source)
Definition: guc.c:6683
bool load_hba(void)
Definition: hba.c:2094
char * bonjour_name
Definition: postmaster.c:244
bool SplitIdentifierString(char *rawstring, char separator, List **namelist)
Definition: varlena.c:3260
int XLogArchiveMode
Definition: xlog.c:94
int errcode_for_file_access(void)
Definition: elog.c:598
static pid_t SysLoggerPID
Definition: postmaster.c:256
#define S_IROTH
Definition: win32.h:452
void ChangeToDataDir(void)
Definition: miscinit.c:116
int opterr
Definition: getopt.c:50
static void getInstallationPaths(const char *argv0)
Definition: postmaster.c:1424
char * Log_destination_string
Definition: elog.c:107
char * ListenAddresses
Definition: postmaster.c:201
int StreamServerPort(int family, char *hostName, unsigned short portNumber, char *unixSocketDir, pgsocket ListenSocket[], int MaxListen)
Definition: pqcomm.c:330
int unlink(const char *filename)
#define ereport(elevel, rest)
Definition: elog.h:122
#define STATUS_OK
Definition: c.h:976
MemoryContext TopMemoryContext
Definition: mcxt.c:43
static void pmdie(SIGNAL_ARGS)
Definition: postmaster.c:2594
static void SIGHUP_handler(SIGNAL_ARGS)
Definition: postmaster.c:2521
#define LOCK_FILE_LINE_LISTEN_ADDR
Definition: pidfile.h:41
bool enable_bonjour
Definition: postmaster.c:243
void RemovePromoteSignalFiles(void)
Definition: xlog.c:12079
int max_wal_senders
Definition: walsender.c:120
pid_t PostmasterPid
Definition: globals.c:87
#define WARNING
Definition: elog.h:40
char my_exec_path[MAXPGPATH]
Definition: globals.c:64
sigset_t BlockSig
Definition: pqsignal.c:22
static pgsocket ListenSocket[MAXLISTEN]
Definition: postmaster.c:216
MemoryContext AllocSetContextCreate(MemoryContext parent, const char *name, Size minContextSize, Size initBlockSize, Size maxBlockSize)
Definition: aset.c:322
static PMState pmState
Definition: postmaster.c:339
bool SelectConfigFiles(const char *userDoption, const char *progname)
Definition: guc.c:4700
void ApplyLauncherRegister(void)
Definition: launcher.c:756
#define PGINVALID_SOCKET
Definition: port.h:24
int MaxConnections
Definition: globals.c:124
TimestampTz PgStartTime
Definition: timestamp.c:49
#define SIGPIPE
Definition: win32.h:193
#define S_IRWXO
Definition: win32.h:455
#define SIGHUP
Definition: win32.h:188
#define LOG_DESTINATION_STDERR
Definition: elog.h:395
static void reset_shared(int port)
Definition: postmaster.c:2503
static bool Reinit
Definition: postmaster.c:230
pqsigfunc pqsignal(int signum, pqsigfunc handler)
Definition: signal.c:168
#define free(a)
Definition: header.h:65
int errmsg_internal(const char *fmt,...)
Definition: elog.c:827
#define NULL
Definition: c.h:229
static char ExtraOptions[MAXPGPATH]
Definition: postmaster.c:221
static int ServerLoop(void)
Definition: postmaster.c:1669
#define Assert(condition)
Definition: c.h:676
#define lfirst(lc)
Definition: pg_list.h:106
void RemovePgTempFiles(void)
Definition: fd.c:2706
static void reaper(SIGNAL_ARGS)
Definition: postmaster.c:2773
void InitializeMaxBackends(void)
Definition: postinit.c:495
const char * name
Definition: encode.c:521
#define S_IRWXG
Definition: win32.h:451
#define SIGTTOU
Definition: win32.h:200
static const char * userDoption
Definition: postgres.c:154
void set_max_safe_fds(void)
Definition: fd.c:881
int errmsg(const char *fmt,...)
Definition: elog.c:797
char * optarg
Definition: getopt.c:53
void list_free(List *list)
Definition: list.c:1133
int i
const char * strerror(int errnum)
Definition: strerror.c:19
static void sigusr1_handler(SIGNAL_ARGS)
Definition: postmaster.c:4991
void pgstat_init(void)
Definition: pgstat.c:355
void srandom(unsigned int seed)
Definition: srandom.c:22
int Log_destination
Definition: elog.c:106
char ** environ
#define elog
Definition: elog.h:219
CommandDest whereToSendOutput
Definition: postgres.c:88
static void static void status(const char *fmt,...) pg_attribute_printf(1
Definition: pg_regress.c:224
#define SIGCHLD
Definition: win32.h:198
static int SendStop
Definition: postmaster.c:231
void process_shared_preload_libraries(void)
Definition: miscinit.c:1487
#define LOCK_FILE_LINE_PM_STATUS
Definition: pidfile.h:43
Definition: pg_list.h:45
#define MAXLISTEN
Definition: postmaster.c:215
#define SIGALRM
Definition: win32.h:194
static struct timeval random_start_time
Definition: postmaster.c:375
MemoryContext PostmasterContext
Definition: mcxt.c:45
#define SIGUSR2
Definition: win32.h:203
static void maybe_start_bgworkers(void)
Definition: postmaster.c:5801
void InitializeGUCOptions(void)
Definition: guc.c:4478
bool PostmasterMarkPIDForWorkerNotify ( int  )

Definition at line 5911 of file postmaster.c.

References bkend::bgworker_notify, dlist_iter::cur, dlist_container, dlist_foreach, and bkend::pid.

Referenced by BackgroundWorkerStateChange().

5912 {
5913  dlist_iter iter;
5914  Backend *bp;
5915 
5916  dlist_foreach(iter, &BackendList)
5917  {
5918  bp = dlist_container(Backend, elem, iter.cur);
5919  if (bp->pid == pid)
5920  {
5921  bp->bgworker_notify = true;
5922  return true;
5923  }
5924  }
5925  return false;
5926 }
#define dlist_foreach(iter, lhead)
Definition: ilist.h:507
bool bgworker_notify
Definition: postmaster.c:180
#define dlist_container(type, membername, ptr)
Definition: ilist.h:477
static dlist_head BackendList
Definition: postmaster.c:184
dlist_node * cur
Definition: ilist.h:161
pid_t pid
Definition: postmaster.c:169

Variable Documentation

int AuthenticationTimeout

Definition at line 237 of file postmaster.c.

Referenced by BackendInitialize(), and PerformAuthentication().

char* bonjour_name

Definition at line 244 of file postmaster.c.

Referenced by PostmasterMain().

bool enable_bonjour

Definition at line 243 of file postmaster.c.

Referenced by PostmasterMain().

bool EnableSSL

Definition at line 234 of file postmaster.c.

Referenced by parse_hba_line(), PostmasterMain(), and SIGHUP_handler().

char* ListenAddresses

Definition at line 201 of file postmaster.c.

Referenced by PostmasterMain().

bool Log_connections

Definition at line 240 of file postmaster.c.

Referenced by BackendInitialize(), and PerformAuthentication().

bool log_hostname

Definition at line 239 of file postmaster.c.

Referenced by BackendInitialize().

int postmaster_alive_fds[2]
int PostPortNumber

Definition at line 195 of file postmaster.c.

Referenced by CreateLockFile(), PostmasterMain(), and PostmasterStateMachine().

int PreAuthDelay

Definition at line 236 of file postmaster.c.

Referenced by BackendInitialize().

const char* progname

Definition at line 37 of file pg_standby.c.

Referenced by _check_database_version(), _CloseArchive(), _connectDB(), AuxiliaryProcessMain(), BackendRun(), BaseBackup(), CheckCopyStreamStop(), checkDataDir(), CheckServerVersionForStreaming(), cleanup_directories_atexit(), CleanupPriorWALFiles(), close_destination_dir(), close_walfile(), connectDatabase(), ConnectDatabase(), CopyStreamPoll(), CopyStreamReceive(), CreateReplicationSlot(), CustomizableCleanupPriorWALFiles(), CustomizableInitialize(), dir_close(), dir_finish(), dir_open_for_write(), doConnect(), DropReplicationSlot(), escape_quotes(), FindStreamingStart(), GenerateRecoveryConf(), get_destination_dir(), get_opts(), get_progname(), GetConnection(), HandleCopyStream(), HandleEndOfCopyStream(), init_parallel_dump_utils(), Initialize(), LogStreamerMain(), main(), mark_file_as_archived(), open_walfile(), OutputFsync(), parse_max_rate(), PostgresMain(), PostmasterMain(), prepareToTerminate(), process_postgres_switches(), ProcessKeepaliveMsg(), ProcessXLogDataMsg(), reached_end_position(), ReadEndOfStreamingResult(), ReceiveAndUnpackTarFile(), ReceiveTarFile(), ReceiveXlogStream(), RunIdentifySystem(), sendFeedback(), set_dump_section(), SetWALFileNameForCleanup(), sigTermHandler(), StartLogStreamer(), stop_streaming(), StreamLog(), StreamLogicalLog(), syncTargetDirectory(), tablespace_list_append(), tar_finish(), usage(), verify_dir_is_empty_or_create(), vwrite_msg(), walkdir(), WriteRecoveryConf(), writeTarData(), and writeTimeLineHistoryFile().

int ReservedBackends

Definition at line 212 of file postmaster.c.

Referenced by InitPostgres(), and PostmasterMain().

bool restart_after_crash

Definition at line 245 of file postmaster.c.

Referenced by PostmasterStateMachine().

char* Unix_socket_directories

Definition at line 198 of file postmaster.c.

Referenced by PostmasterMain().

char* Unix_socket_group

Definition at line 122 of file pqcomm.c.

int Unix_socket_permissions

Definition at line 121 of file pqcomm.c.

Referenced by show_unix_socket_permissions().