diff options
| author | Peter Eisentraut <peter_e@gmx.net> | 2000-05-31 00:28:42 +0000 |
|---|---|---|
| committer | Peter Eisentraut <peter_e@gmx.net> | 2000-05-31 00:28:42 +0000 |
| commit | 6a68f42648f54690ad5b5ae6fb9104e86e15f0f1 (patch) | |
| tree | 4b6742f51fb2160dbe2ce090273fd430dc2b2499 /src/backend/postmaster | |
| parent | 5e4d554bae6a7177903cdb99bf5d41b695519a45 (diff) | |
| download | postgresql-6a68f42648f54690ad5b5ae6fb9104e86e15f0f1.tar.gz | |
The heralded `Grand Unified Configuration scheme' (GUC)
That means you can now set your options in either or all of $PGDATA/configuration,
some postmaster option (--enable-fsync=off), or set a SET command. The list of
options is in backend/utils/misc/guc.c, documentation will be written post haste.
pg_options is gone, so is that pq_geqo config file. Also removed were backend -K,
-Q, and -T options (no longer applicable, although -d0 does the same as -Q).
Added to configure an --enable-syslog option.
changed all callers from TPRINTF to elog(DEBUG)
Diffstat (limited to 'src/backend/postmaster')
| -rw-r--r-- | src/backend/postmaster/postmaster.c | 147 |
1 files changed, 97 insertions, 50 deletions
diff --git a/src/backend/postmaster/postmaster.c b/src/backend/postmaster/postmaster.c index 94a43cba8e..729ade2db6 100644 --- a/src/backend/postmaster/postmaster.c +++ b/src/backend/postmaster/postmaster.c @@ -11,7 +11,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/postmaster/postmaster.c,v 1.143 2000/05/26 01:38:08 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/postmaster/postmaster.c,v 1.144 2000/05/31 00:28:25 petere Exp $ * * NOTES * @@ -90,7 +90,7 @@ #include "storage/proc.h" #include "access/xlog.h" #include "tcop/tcopprot.h" -#include "utils/trace.h" +#include "utils/guc.h" #include "version.h" /* @@ -136,7 +136,7 @@ static Dllist *BackendList; /* list of ports associated with still open, but incomplete connections */ static Dllist *PortList; -static unsigned short PostPortName = 0; +int PostPortName = DEF_PGPORT; /* * This is a boolean indicating that there is at least one backend that @@ -167,7 +167,7 @@ static IpcMemoryKey ipc_key; * adding to this. */ -static int MaxBackends = DEF_MAXBACKENDS; +int MaxBackends = DEF_MAXBACKENDS; /* * MaxBackends is the actual limit on the number of backends we will @@ -185,6 +185,9 @@ static int real_argc; static time_t tnow; +/* flag to indicate that SIGHUP arrived during server loop */ +static volatile bool got_SIGHUP = false; + /* * Default Values */ @@ -217,8 +220,7 @@ static char ExtraOptions[MAXPGPATH]; static bool Reinit = true; static int SendStop = false; -static bool NetServer = false; /* if not zero, postmaster listen for - * non-local connections */ +bool NetServer = false; /* listen on TCP/IP */ #ifdef USE_SSL static bool SecureNetServer = false; /* if not zero, postmaster listens @@ -256,7 +258,8 @@ extern int optind, static void pmdaemonize(char *extraoptions); static Port *ConnCreate(int serverFd); static void ConnFree(Port *port); -static void reset_shared(unsigned short port); +static void reset_shared(int port); +static void SIGHUP_handler(SIGNAL_ARGS); static void pmdie(SIGNAL_ARGS); static void reaper(SIGNAL_ARGS); static void dumpstatus(SIGNAL_ARGS); @@ -368,7 +371,6 @@ checkDataDir(const char *DataDir, bool *DataDirOK) int PostmasterMain(int argc, char *argv[]) { - extern int NBuffers; /* from buffer/bufmgr.c */ int opt; char *hostName; int status; @@ -431,6 +433,8 @@ PostmasterMain(int argc, char *argv[]) */ umask((mode_t) 0077); + ResetAllOptions(); + if (!(hostName = getenv("PGHOST"))) { if (gethostname(hostbuf, MAXHOSTNAMELEN) < 0) @@ -441,9 +445,38 @@ PostmasterMain(int argc, char *argv[]) MyProcPid = getpid(); DataDir = getenv("PGDATA"); /* default value */ - opterr = 0; + /* + * First we must scan for a -D argument to get the data dir. Then + * read the config file. Finally, scan all the other arguments. + * (Command line switches override config file.) + * + * Note: The two lists of options must be exactly the same, even + * though perhaps the first one would only have to be "D:" with + * opterr turned off. But some versions of getopt (notably GNU) + * are going to arbitrarily permute some "non-options" (according + * to the local world view) which will result in some switches + * being associated with the wrong argument. Death and destruction + * will occur. + */ + opterr = 1; + while ((opt = getopt(nonblank_argc, argv, "A:a:B:b:D:d:Film:MN:no:p:Ss-:")) != EOF) + { + if (opt == 'D') + DataDir = optarg; + } + + optind = 1; /* start over */ + checkDataDir(DataDir, &DataDirOK); /* issues error messages */ + if (!DataDirOK) + { + fprintf(stderr, "No data directory -- can't proceed.\n"); + exit(2); + } + + ProcessConfigFile(PGC_POSTMASTER); + IgnoreSystemIndexes(false); - while ((opt = getopt(nonblank_argc, argv, "A:a:B:b:D:d:ilm:MN:no:p:Ss")) != EOF) + while ((opt = getopt(nonblank_argc, argv, "A:a:B:b:D:d:Film:MN:no:p:Ss-:")) != EOF) { switch (opt) { @@ -464,15 +497,7 @@ PostmasterMain(int argc, char *argv[]) /* Can no longer set authentication method. */ break; case 'B': - - /* - * The number of buffers to create. Setting this option - * means we have to start each backend with a -B # to make - * sure they know how many buffers were allocated. - */ NBuffers = atoi(optarg); - strcat(ExtraOptions, " -B "); - strcat(ExtraOptions, optarg); break; case 'b': /* Set the backend executable file to use. */ @@ -486,8 +511,7 @@ PostmasterMain(int argc, char *argv[]) } break; case 'D': - /* Set PGDATA from the command line. */ - DataDir = optarg; + /* already done above */ break; case 'd': @@ -496,8 +520,10 @@ PostmasterMain(int argc, char *argv[]) * servers descended from it. */ DebugLvl = atoi(optarg); - pg_options[TRACE_VERBOSE] = DebugLvl; break; + case 'F': + enableFsync = false; + break; case 'i': NetServer = true; break; @@ -545,7 +571,7 @@ PostmasterMain(int argc, char *argv[]) break; case 'p': /* Set PGPORT by hand. */ - PostPortName = (unsigned short) atoi(optarg); + PostPortName = atoi(optarg); break; case 'S': @@ -567,6 +593,21 @@ PostmasterMain(int argc, char *argv[]) */ SendStop = true; break; + case '-': + { + /* A little 'long argument' simulation */ + size_t equal_pos = strcspn(optarg, "="); + char *cp; + + if (optarg[equal_pos] != '=') + elog(ERROR, "--%s requires argument", optarg); + optarg[equal_pos] = '\0'; + for(cp = optarg; *cp; cp++) + if (*cp == '-') + *cp = '_'; + SetConfigOption(optarg, optarg + equal_pos + 1, PGC_POSTMASTER); + break; + } default: /* usage() never returns */ usage(progname); @@ -574,11 +615,8 @@ PostmasterMain(int argc, char *argv[]) } } - /* - * Select default values for switches where needed - */ if (PostPortName == 0) - PostPortName = (unsigned short) pq_getport(); + PostPortName = pq_getport(); /* * Check for invalid combinations of switches @@ -596,13 +634,6 @@ PostmasterMain(int argc, char *argv[]) exit(1); } - checkDataDir(DataDir, &DataDirOK); /* issues error messages */ - if (!DataDirOK) - { - fprintf(stderr, "No data directory -- can't proceed.\n"); - exit(2); - } - if (!Execfile[0] && FindExec(Execfile, argv[0], "postgres") < 0) { fprintf(stderr, "%s: could not find backend to execute...\n", @@ -622,7 +653,7 @@ PostmasterMain(int argc, char *argv[]) if (NetServer) { - status = StreamServerPort(hostName, PostPortName, &ServerSock_INET); + status = StreamServerPort(hostName, (unsigned short)PostPortName, &ServerSock_INET); if (status != STATUS_OK) { fprintf(stderr, "%s: cannot create INET stream port\n", @@ -632,7 +663,7 @@ PostmasterMain(int argc, char *argv[]) } #if !defined(__CYGWIN32__) && !defined(__QNX__) - status = StreamServerPort(NULL, PostPortName, &ServerSock_UNIX); + status = StreamServerPort(NULL, (unsigned short)PostPortName, &ServerSock_UNIX); if (status != STATUS_OK) { fprintf(stderr, "%s: cannot create UNIX stream port\n", @@ -707,7 +738,7 @@ PostmasterMain(int argc, char *argv[]) PG_INITMASK(); PG_SETMASK(&BlockSig); - pqsignal(SIGHUP, pmdie); /* send SIGHUP, don't die */ + pqsignal(SIGHUP, SIGHUP_handler); /* reread config file and have children do same */ pqsignal(SIGINT, pmdie); /* send SIGTERM and ShutdownDataBase */ pqsignal(SIGQUIT, pmdie); /* send SIGUSR1 and die */ pqsignal(SIGTERM, pmdie); /* wait for children and ShutdownDataBase */ @@ -1066,6 +1097,12 @@ ServerLoop(void) curr = next; } + + if (got_SIGHUP) + { + got_SIGHUP = false; + ProcessConfigFile(PGC_SIGHUP); + } } } @@ -1321,7 +1358,7 @@ ConnFree(Port *conn) * reset_shared -- reset shared memory and semaphores */ static void -reset_shared(unsigned short port) +reset_shared(int port) { ipc_key = port * 1000 + shmem_seq * 100; CreateSharedMemoryAndSemaphores(ipc_key, MaxBackends); @@ -1330,6 +1367,23 @@ reset_shared(unsigned short port) shmem_seq -= 10; } + +/* + * set flag is SIGHUP was detected so config file can be reread in + * main loop + */ +static void +SIGHUP_handler(SIGNAL_ARGS) +{ + got_SIGHUP = true; + if (Shutdown > SmartShutdown) + return; + got_SIGHUP = true; + SignalChildren(SIGHUP); +} + + + /* * pmdie -- signal handler for cleaning up after a kill signal. */ @@ -1338,19 +1392,11 @@ pmdie(SIGNAL_ARGS) { PG_SETMASK(&BlockSig); - TPRINTF(TRACE_VERBOSE, "pmdie %d", postgres_signal_arg); + if (DebugLvl >= 1) + elog(DEBUG, "pmdie %d", postgres_signal_arg); switch (postgres_signal_arg) { - case SIGHUP: - - /* - * Send SIGHUP to all children (update options flags) - */ - if (Shutdown > SmartShutdown) - return; - SignalChildren(SIGHUP); - return; case SIGUSR2: /* @@ -1679,9 +1725,10 @@ SignalChildren(int signal) if (bp->pid != mypid) { - TPRINTF(TRACE_VERBOSE, - "SignalChildren: sending signal %d to process %d", - signal, bp->pid); + if (DebugLvl >= 1) + elog(DEBUG, "SignalChildren: sending signal %d to process %d", + signal, bp->pid); + kill(bp->pid, signal); } |
