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 2435 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().

2436 {
2437  int i;
2438 
2439 #ifndef WIN32
2440 
2441  /*
2442  * Close the write end of postmaster death watch pipe. It's important to
2443  * do this as early as possible, so that if postmaster dies, others won't
2444  * think that it's still running because we're holding the pipe open.
2445  */
2447  ereport(FATAL,
2449  errmsg_internal("could not close postmaster death monitoring pipe in child process: %m")));
2451 #endif
2452 
2453  /* Close the listen sockets */
2454  for (i = 0; i < MAXLISTEN; i++)
2455  {
2456  if (ListenSocket[i] != PGINVALID_SOCKET)
2457  {
2460  }
2461  }
2462 
2463  /* If using syslogger, close the read side of the pipe */
2464  if (!am_syslogger)
2465  {
2466 #ifndef WIN32
2467  if (syslogPipe[0] >= 0)
2468  close(syslogPipe[0]);
2469  syslogPipe[0] = -1;
2470 #else
2471  if (syslogPipe[0])
2472  CloseHandle(syslogPipe[0]);
2473  syslogPipe[0] = 0;
2474 #endif
2475  }
2476 
2477 #ifdef USE_BONJOUR
2478  /* If using Bonjour, close the connection to the mDNS daemon */
2479  if (bonjour_sdref)
2480  close(DNSServiceRefSockFD(bonjour_sdref));
2481 #endif
2482 }
void StreamClose(pgsocket sock)
Definition: pqcomm.c:825
#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:557
static pgsocket ListenSocket[MAXLISTEN]
Definition: postmaster.c:215
#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:214
int syslogPipe[2]
Definition: syslogger.c:112
int GetNumShmemAttachedBgworkers ( void  )
int MaxLivePostmasterChildren ( void  )

Definition at line 5460 of file postmaster.c.

References autovacuum_max_workers, max_worker_processes, and MaxConnections.

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

5461 {
5462  return 2 * (MaxConnections + autovacuum_max_workers + 1 +
5464 }
int MaxConnections
Definition: globals.c:123
int autovacuum_max_workers
Definition: autovacuum.c:113
int max_worker_processes
Definition: globals.c:124
void PostmasterMain ( int  argc,
char *  argv[] 
)

Definition at line 567 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_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, 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().

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

Definition at line 5854 of file postmaster.c.

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

Referenced by BackgroundWorkerStateChange().

5855 {
5856  dlist_iter iter;
5857  Backend *bp;
5858 
5859  dlist_foreach(iter, &BackendList)
5860  {
5861  bp = dlist_container(Backend, elem, iter.cur);
5862  if (bp->pid == pid)
5863  {
5864  bp->bgworker_notify = true;
5865  return true;
5866  }
5867  }
5868  return false;
5869 }
#define dlist_foreach(iter, lhead)
Definition: ilist.h:507
bool bgworker_notify
Definition: postmaster.c:179
#define dlist_container(type, membername, ptr)
Definition: ilist.h:477
static dlist_head BackendList
Definition: postmaster.c:183
dlist_node * cur
Definition: ilist.h:161
pid_t pid
Definition: postmaster.c:168

Variable Documentation

int AuthenticationTimeout

Definition at line 236 of file postmaster.c.

Referenced by BackendInitialize(), and PerformAuthentication().

char* bonjour_name

Definition at line 243 of file postmaster.c.

Referenced by PostmasterMain().

bool enable_bonjour

Definition at line 242 of file postmaster.c.

Referenced by PostmasterMain().

bool EnableSSL

Definition at line 233 of file postmaster.c.

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

char* ListenAddresses

Definition at line 200 of file postmaster.c.

Referenced by PostmasterMain().

bool Log_connections

Definition at line 239 of file postmaster.c.

Referenced by BackendInitialize(), and PerformAuthentication().

bool log_hostname

Definition at line 238 of file postmaster.c.

Referenced by BackendInitialize().

int postmaster_alive_fds[2]
int PostPortNumber

Definition at line 194 of file postmaster.c.

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

int PreAuthDelay

Definition at line 235 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 211 of file postmaster.c.

Referenced by InitPostgres(), and PostmasterMain().

bool restart_after_crash

Definition at line 244 of file postmaster.c.

Referenced by PostmasterStateMachine().

char* Unix_socket_directories

Definition at line 197 of file postmaster.c.

Referenced by PostmasterMain().

char* Unix_socket_group

Definition at line 103 of file pqcomm.c.

int Unix_socket_permissions

Definition at line 102 of file pqcomm.c.

Referenced by show_unix_socket_permissions().