diff options
Diffstat (limited to 'src/backend/postmaster/postmaster.c')
-rw-r--r-- | src/backend/postmaster/postmaster.c | 44 |
1 files changed, 34 insertions, 10 deletions
diff --git a/src/backend/postmaster/postmaster.c b/src/backend/postmaster/postmaster.c index 7dad294bc9b..41099d9c05d 100644 --- a/src/backend/postmaster/postmaster.c +++ b/src/backend/postmaster/postmaster.c @@ -10,7 +10,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/postmaster/postmaster.c,v 1.101 1999/02/13 23:17:40 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/postmaster/postmaster.c,v 1.102 1999/02/19 06:06:00 tgl Exp $ * * NOTES * @@ -162,8 +162,17 @@ static IpcMemoryKey ipc_key; * adding to this. */ +static int MaxBackends = MAXBACKENDS; -static int NextBackendId = MAXINT; /* XXX why? */ + /* + * MaxBackends is the actual soft limit on the number of backends + * we will start. It defaults to the hard limit established at compilation + * time, but can be readjusted with postmaster's xxx switch. + * One reason to reduce MaxBackends is to allow startup under a kernel + * that won't let us get MAXBACKENDS semaphores! + */ + +static int NextBackendTag = MAXINT; /* XXX why count down not up? */ static char *progname = (char *) NULL; static char **real_argv; static int real_argc; @@ -388,7 +397,7 @@ PostmasterMain(int argc, char *argv[]) DataDir = getenv("PGDATA"); /* default value */ opterr = 0; - while ((opt = getopt(nonblank_argc, argv, "A:a:B:b:D:dim:Mno:p:Ss")) != EOF) + while ((opt = getopt(nonblank_argc, argv, "A:a:B:b:D:dim:MN:no:p:Ss")) != EOF) { switch (opt) { @@ -463,6 +472,17 @@ PostmasterMain(int argc, char *argv[]) * 'postmaster' */ break; + case 'N': + /* + * The max number of backends to start. + * Can't set to less than 1 or more than compiled-in limit. + */ + MaxBackends = atoi(optarg); + if (MaxBackends < 1) + MaxBackends = 1; + if (MaxBackends > MAXBACKENDS) + MaxBackends = MAXBACKENDS; + break; case 'n': /* Don't reinit shared mem after abnormal exit */ Reinit = false; @@ -621,6 +641,8 @@ usage(const char *progname) fprintf(stderr, "\t-b backend\tuse a specific backend server executable\n"); fprintf(stderr, "\t-d [1|2|3]\tset debugging level\n"); fprintf(stderr, "\t-i \t\tlisten on TCP/IP sockets as well as Unix domain socket\n"); + fprintf(stderr, "\t-N nprocs\tset max number of backend servers (1..%d)\n", + MAXBACKENDS); fprintf(stderr, "\t-n \t\tdon't reinitialize shared memory after abnormal exit\n"); fprintf(stderr, "\t-o option\tpass 'option' to each backend servers\n"); fprintf(stderr, "\t-p port\tspecify port for postmaster to listen on\n"); @@ -765,7 +787,7 @@ ServerLoop(void) if (status == STATUS_OK && port->pktInfo.state == Idle) { /* Can't start backend if max backend count is exceeded. */ - if (CountChildren() >= MaxBackendId) + if (CountChildren() >= MaxBackends) PacketSendError(&port->pktInfo, "Sorry, too many clients already"); else @@ -1009,7 +1031,7 @@ static void reset_shared(short port) { ipc_key = port * 1000 + shmem_seq * 100; - CreateSharedMemoryAndSemaphores(ipc_key); + CreateSharedMemoryAndSemaphores(ipc_key, MaxBackends); ActiveBackends = FALSE; shmem_seq += 1; if (shmem_seq >= 10) @@ -1272,7 +1294,7 @@ BackendStartup(Port *port) */ sprintf(envEntry[0], "POSTPORT=%d", PostPortName); putenv(envEntry[0]); - sprintf(envEntry[1], "POSTID=%d", NextBackendId); + sprintf(envEntry[1], "POSTID=%d", NextBackendTag); putenv(envEntry[1]); sprintf(envEntry[2], "PG_USER=%s", port->user); putenv(envEntry[2]); @@ -1348,9 +1370,11 @@ BackendStartup(Port *port) progname, pid, port->user, port->database, port->sock); - /* adjust backend counter */ - /* XXX Don't know why this is done, but for now backend needs it */ - NextBackendId -= 1; + /* Generate a new backend tag for every backend we start */ + /* XXX theoretically this could wrap around, if you have the patience + * to start 2^31 backends ... + */ + NextBackendTag -= 1; /* * Everything's been successful, it's safe to add this backend to our @@ -1459,7 +1483,7 @@ DoBackend(Port *port) /* OK, let's unblock our signals, all together now... */ sigprocmask(SIG_SETMASK, &oldsigmask, 0); - /* Close the postmater sockets */ + /* Close the postmaster sockets */ if (NetServer) StreamClose(ServerSock_INET); #ifndef __CYGWIN32__ |