mirror of
https://github.com/postgres/postgres.git
synced 2025-04-25 21:42:33 +03:00
Continued rearrangement to permit pgstat + BootstrapMain processes to be
fork/exec'd, in the same mode as the previous patch for backends. Claudio Natoli
This commit is contained in:
parent
3e32e9476f
commit
aeddc2a60d
@ -8,7 +8,7 @@
|
|||||||
* Portions Copyright (c) 1994, Regents of the University of California
|
* Portions Copyright (c) 1994, Regents of the University of California
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $PostgreSQL: pgsql/src/backend/bootstrap/bootstrap.c,v 1.171 2003/12/20 17:31:21 momjian Exp $
|
* $PostgreSQL: pgsql/src/backend/bootstrap/bootstrap.c,v 1.172 2003/12/25 03:52:50 momjian Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -48,6 +48,11 @@
|
|||||||
|
|
||||||
#define ALLOC(t, c) ((t *) calloc((unsigned)(c), sizeof(t)))
|
#define ALLOC(t, c) ((t *) calloc((unsigned)(c), sizeof(t)))
|
||||||
|
|
||||||
|
#ifdef EXEC_BACKEND
|
||||||
|
typedef struct Port Port;
|
||||||
|
extern void SSDataBaseInit(int);
|
||||||
|
extern void read_backend_variables(pid_t, Port*);
|
||||||
|
#endif
|
||||||
|
|
||||||
extern int Int_yyparse(void);
|
extern int Int_yyparse(void);
|
||||||
static hashnode *AddStr(char *str, int strlength, int mderef);
|
static hashnode *AddStr(char *str, int strlength, int mderef);
|
||||||
@ -238,7 +243,7 @@ BootstrapMain(int argc, char *argv[])
|
|||||||
*
|
*
|
||||||
* If we are running under the postmaster, this is done already.
|
* If we are running under the postmaster, this is done already.
|
||||||
*/
|
*/
|
||||||
if (!IsUnderPostmaster /* when exec || ExecBackend */ )
|
if (!IsUnderPostmaster || ExecBackend)
|
||||||
MemoryContextInit();
|
MemoryContextInit();
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -247,7 +252,7 @@ BootstrapMain(int argc, char *argv[])
|
|||||||
|
|
||||||
/* Set defaults, to be overriden by explicit options below */
|
/* Set defaults, to be overriden by explicit options below */
|
||||||
dbname = NULL;
|
dbname = NULL;
|
||||||
if (!IsUnderPostmaster /* when exec || ExecBackend */ )
|
if (!IsUnderPostmaster)
|
||||||
{
|
{
|
||||||
InitializeGUCOptions();
|
InitializeGUCOptions();
|
||||||
potential_DataDir = getenv("PGDATA"); /* Null if no PGDATA
|
potential_DataDir = getenv("PGDATA"); /* Null if no PGDATA
|
||||||
@ -285,24 +290,11 @@ BootstrapMain(int argc, char *argv[])
|
|||||||
xlogop = atoi(optarg);
|
xlogop = atoi(optarg);
|
||||||
break;
|
break;
|
||||||
case 'p':
|
case 'p':
|
||||||
{
|
|
||||||
/* indicates fork from postmaster */
|
|
||||||
#ifdef EXEC_BACKEND
|
#ifdef EXEC_BACKEND
|
||||||
char *p;
|
IsUnderPostmaster = true;
|
||||||
|
|
||||||
sscanf(optarg, "%lu,%p,",
|
|
||||||
&UsedShmemSegID,
|
|
||||||
&UsedShmemSegAddr);
|
|
||||||
p = strchr(optarg, ',');
|
|
||||||
if (p)
|
|
||||||
p = strchr(p + 1, ',');
|
|
||||||
if (p)
|
|
||||||
dbname = strdup(p + 1);
|
|
||||||
#else
|
|
||||||
dbname = strdup(optarg);
|
|
||||||
#endif
|
#endif
|
||||||
|
dbname = strdup(optarg);
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
case 'B':
|
case 'B':
|
||||||
SetConfigOption("shared_buffers", optarg, PGC_POSTMASTER, PGC_S_ARGV);
|
SetConfigOption("shared_buffers", optarg, PGC_POSTMASTER, PGC_S_ARGV);
|
||||||
break;
|
break;
|
||||||
@ -347,12 +339,7 @@ BootstrapMain(int argc, char *argv[])
|
|||||||
if (!dbname || argc != optind)
|
if (!dbname || argc != optind)
|
||||||
usage();
|
usage();
|
||||||
|
|
||||||
#ifdef EXEC_BACKEND
|
if (!IsUnderPostmaster || ExecBackend)
|
||||||
if (IsUnderPostmaster && MyProc /* ordinary backend */ )
|
|
||||||
AttachSharedMemoryAndSemaphores();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (!IsUnderPostmaster /* when exec || ExecBackend */ )
|
|
||||||
{
|
{
|
||||||
if (!potential_DataDir)
|
if (!potential_DataDir)
|
||||||
{
|
{
|
||||||
@ -376,6 +363,9 @@ BootstrapMain(int argc, char *argv[])
|
|||||||
{
|
{
|
||||||
#ifdef EXEC_BACKEND
|
#ifdef EXEC_BACKEND
|
||||||
read_nondefault_variables();
|
read_nondefault_variables();
|
||||||
|
read_backend_variables(getpid(),NULL);
|
||||||
|
|
||||||
|
SSDataBaseInit(xlogop);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -427,6 +417,10 @@ BootstrapMain(int argc, char *argv[])
|
|||||||
SetProcessingMode(BootstrapProcessing);
|
SetProcessingMode(BootstrapProcessing);
|
||||||
IgnoreSystemIndexes(true);
|
IgnoreSystemIndexes(true);
|
||||||
|
|
||||||
|
#ifdef EXEC_BACKEND
|
||||||
|
if (IsUnderPostmaster)
|
||||||
|
AttachSharedMemoryAndSemaphores();
|
||||||
|
#endif
|
||||||
XLOGPathInit();
|
XLOGPathInit();
|
||||||
|
|
||||||
BaseInit();
|
BaseInit();
|
||||||
|
@ -13,7 +13,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $PostgreSQL: pgsql/src/backend/main/main.c,v 1.68 2003/12/23 00:34:04 momjian Exp $
|
* $PostgreSQL: pgsql/src/backend/main/main.c,v 1.69 2003/12/25 03:52:50 momjian Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -39,6 +39,7 @@
|
|||||||
#include "tcop/tcopprot.h"
|
#include "tcop/tcopprot.h"
|
||||||
#include "utils/help_config.h"
|
#include "utils/help_config.h"
|
||||||
#include "utils/ps_status.h"
|
#include "utils/ps_status.h"
|
||||||
|
#include "pgstat.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -202,9 +203,9 @@ main(int argc, char *argv[])
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* Now dispatch to one of PostmasterMain, PostgresMain, GucInfoMain,
|
* Now dispatch to one of PostmasterMain, PostgresMain, GucInfoMain,
|
||||||
* or BootstrapMain depending on the program name (and possibly first
|
* pgstat_main, pgstat_mainChild or BootstrapMain depending on the
|
||||||
* argument) we were called with. The lack of consistency here is
|
* program name (and possibly first argument) we were called with.
|
||||||
* historical.
|
* The lack of consistency here is historical.
|
||||||
*/
|
*/
|
||||||
len = strlen(new_argv[0]);
|
len = strlen(new_argv[0]);
|
||||||
|
|
||||||
@ -221,6 +222,28 @@ main(int argc, char *argv[])
|
|||||||
if (argc > 1 && strcmp(new_argv[1], "-boot") == 0)
|
if (argc > 1 && strcmp(new_argv[1], "-boot") == 0)
|
||||||
exit(BootstrapMain(argc - 1, new_argv + 1));
|
exit(BootstrapMain(argc - 1, new_argv + 1));
|
||||||
|
|
||||||
|
#ifdef EXEC_BACKEND
|
||||||
|
/*
|
||||||
|
* If the first argument is "-statBuf", then invoke pgstat_main. Note
|
||||||
|
* we remove "-statBuf" from the arguments passed on to pgstat_main.
|
||||||
|
*/
|
||||||
|
if (argc > 1 && strcmp(new_argv[1], "-statBuf") == 0)
|
||||||
|
{
|
||||||
|
pgstat_main(argc - 2, new_argv + 2);
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If the first argument is "-statCol", then invoke pgstat_mainChild. Note
|
||||||
|
* we remove "-statCol" from the arguments passed on to pgstat_mainChild.
|
||||||
|
*/
|
||||||
|
if (argc > 1 && strcmp(new_argv[1], "-statCol") == 0)
|
||||||
|
{
|
||||||
|
pgstat_mainChild(argc - 2, new_argv + 2);
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If the first argument is "--describe-config", then invoke runtime
|
* If the first argument is "--describe-config", then invoke runtime
|
||||||
* configuration option display mode.
|
* configuration option display mode.
|
||||||
|
@ -13,7 +13,7 @@
|
|||||||
*
|
*
|
||||||
* Copyright (c) 2001-2003, PostgreSQL Global Development Group
|
* Copyright (c) 2001-2003, PostgreSQL Global Development Group
|
||||||
*
|
*
|
||||||
* $PostgreSQL: pgsql/src/backend/postmaster/pgstat.c,v 1.49 2003/12/20 17:31:21 momjian Exp $
|
* $PostgreSQL: pgsql/src/backend/postmaster/pgstat.c,v 1.50 2003/12/25 03:52:51 momjian Exp $
|
||||||
* ----------
|
* ----------
|
||||||
*/
|
*/
|
||||||
#include "postgres.h"
|
#include "postgres.h"
|
||||||
@ -106,7 +106,13 @@ static char pgStat_fname[MAXPGPATH];
|
|||||||
* Local function forward declarations
|
* Local function forward declarations
|
||||||
* ----------
|
* ----------
|
||||||
*/
|
*/
|
||||||
static void pgstat_main(void);
|
#ifdef EXEC_BACKEND
|
||||||
|
static void pgstat_exec(STATS_PROCESS_TYPE procType);
|
||||||
|
static void pgstat_parseArgs(PGSTAT_FORK_ARGS);
|
||||||
|
#endif
|
||||||
|
NON_EXEC_STATIC void pgstat_main(PGSTAT_FORK_ARGS);
|
||||||
|
NON_EXEC_STATIC void pgstat_mainChild(PGSTAT_FORK_ARGS);
|
||||||
|
static void pgstat_mainInit(void);
|
||||||
static void pgstat_recvbuffer(void);
|
static void pgstat_recvbuffer(void);
|
||||||
static void pgstat_die(SIGNAL_ARGS);
|
static void pgstat_die(SIGNAL_ARGS);
|
||||||
|
|
||||||
@ -328,6 +334,89 @@ startup_failed:
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef EXEC_BACKEND
|
||||||
|
|
||||||
|
/* ----------
|
||||||
|
* pgstat_exec() -
|
||||||
|
*
|
||||||
|
* Used to format up the arglist for, and exec, statistics
|
||||||
|
* (buffer and collector) processes
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
pgstat_exec(STATS_PROCESS_TYPE procType)
|
||||||
|
{
|
||||||
|
char *av[11];
|
||||||
|
int ac = 0, bufc = 0, i;
|
||||||
|
char pgstatBuf[8][MAXPGPATH];
|
||||||
|
|
||||||
|
av[ac++] = "postgres";
|
||||||
|
switch (procType)
|
||||||
|
{
|
||||||
|
case STAT_PROC_BUFFER:
|
||||||
|
av[ac++] = "-statBuf";
|
||||||
|
break;
|
||||||
|
|
||||||
|
case STAT_PROC_COLLECTOR:
|
||||||
|
av[ac++] = "-statCol";
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
Assert(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Sockets + pipes */
|
||||||
|
bufc = 0;
|
||||||
|
snprintf(pgstatBuf[bufc++],MAXPGPATH,"%d",pgStatSock);
|
||||||
|
snprintf(pgstatBuf[bufc++],MAXPGPATH,"%d",pgStatPmPipe[0]);
|
||||||
|
snprintf(pgstatBuf[bufc++],MAXPGPATH,"%d",pgStatPmPipe[1]);
|
||||||
|
snprintf(pgstatBuf[bufc++],MAXPGPATH,"%d",pgStatPipe[0]);
|
||||||
|
snprintf(pgstatBuf[bufc++],MAXPGPATH,"%d",pgStatPipe[1]);
|
||||||
|
|
||||||
|
/* + the pstat file names, and postgres pathname */
|
||||||
|
/* FIXME: [fork/exec] whitespaces in directories? */
|
||||||
|
snprintf(pgstatBuf[bufc++],MAXPGPATH,"%s",pgStat_tmpfname);
|
||||||
|
snprintf(pgstatBuf[bufc++],MAXPGPATH,"%s",pgStat_fname);
|
||||||
|
snprintf(pgstatBuf[bufc++],MAXPGPATH,"%s",pg_pathname);
|
||||||
|
|
||||||
|
/* Add to the arg list */
|
||||||
|
Assert(bufc <= lengthof(pgstatBuf));
|
||||||
|
for (i = 0; i < bufc; i++)
|
||||||
|
av[ac++] = pgstatBuf[i];
|
||||||
|
|
||||||
|
av[ac++] = NULL;
|
||||||
|
Assert(ac <= lengthof(av));
|
||||||
|
|
||||||
|
if (execv(pg_pathname,av) == -1)
|
||||||
|
/* FIXME: [fork/exec] suggestions for what to do here? Can't call elog... */
|
||||||
|
Assert(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* ----------
|
||||||
|
* pgstat_parseArgs() -
|
||||||
|
*
|
||||||
|
* Used to unformat the arglist for exec'ed statistics
|
||||||
|
* (buffer and collector) processes
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
pgstat_parseArgs(PGSTAT_FORK_ARGS)
|
||||||
|
{
|
||||||
|
Assert(argc == 8);
|
||||||
|
argc = 0;
|
||||||
|
pgStatSock = atoi(argv[argc++]);
|
||||||
|
pgStatPmPipe[0] = atoi(argv[argc++]);
|
||||||
|
pgStatPmPipe[1] = atoi(argv[argc++]);
|
||||||
|
pgStatPipe[0] = atoi(argv[argc++]);
|
||||||
|
pgStatPipe[1] = atoi(argv[argc++]);
|
||||||
|
strncpy(pgStat_tmpfname,argv[argc++],MAXPGPATH);
|
||||||
|
strncpy(pgStat_fname, argv[argc++],MAXPGPATH);
|
||||||
|
strncpy(pg_pathname, argv[argc++],MAXPGPATH);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
/* ----------
|
/* ----------
|
||||||
* pgstat_start() -
|
* pgstat_start() -
|
||||||
*
|
*
|
||||||
@ -416,22 +505,17 @@ pgstat_start(void)
|
|||||||
beos_backend_startup();
|
beos_backend_startup();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
IsUnderPostmaster = true; /* we are a postmaster subprocess now */
|
|
||||||
|
|
||||||
MyProcPid = getpid(); /* reset MyProcPid */
|
|
||||||
|
|
||||||
/* Lose the postmaster's on-exit routines */
|
|
||||||
on_exit_reset();
|
|
||||||
|
|
||||||
/* Close the postmaster's sockets, except for pgstat link */
|
/* Close the postmaster's sockets, except for pgstat link */
|
||||||
ClosePostmasterPorts(false);
|
ClosePostmasterPorts(false);
|
||||||
|
|
||||||
/* Drop our connection to postmaster's shared memory, as well */
|
/* Drop our connection to postmaster's shared memory, as well */
|
||||||
PGSharedMemoryDetach();
|
PGSharedMemoryDetach();
|
||||||
|
|
||||||
|
#ifdef EXEC_BACKEND
|
||||||
|
pgstat_exec(STAT_PROC_BUFFER);
|
||||||
|
#else
|
||||||
pgstat_main();
|
pgstat_main();
|
||||||
|
#endif
|
||||||
exit(0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -1228,35 +1312,15 @@ pgstat_send(void *msg, int len)
|
|||||||
*------------------------------------------------------------
|
*------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
/* ----------
|
|
||||||
* pgstat_main() -
|
|
||||||
*
|
|
||||||
* Start up the statistics collector itself. This is the body of the
|
|
||||||
* postmaster child process.
|
|
||||||
* ----------
|
|
||||||
*/
|
|
||||||
static void
|
static void
|
||||||
pgstat_main(void)
|
pgstat_mainInit(void)
|
||||||
{
|
{
|
||||||
PgStat_Msg msg;
|
IsUnderPostmaster = true; /* we are a postmaster subprocess now */
|
||||||
fd_set rfds;
|
|
||||||
int readPipe;
|
|
||||||
int pmPipe = pgStatPmPipe[0];
|
|
||||||
int maxfd;
|
|
||||||
int nready;
|
|
||||||
int len = 0;
|
|
||||||
struct timeval timeout;
|
|
||||||
struct timeval next_statwrite;
|
|
||||||
bool need_statwrite;
|
|
||||||
HASHCTL hash_ctl;
|
|
||||||
|
|
||||||
/*
|
MyProcPid = getpid(); /* reset MyProcPid */
|
||||||
* Close the writing end of the postmaster pipe, so we'll see it
|
|
||||||
* closing when the postmaster terminates and can terminate as well.
|
/* Lose the postmaster's on-exit routines */
|
||||||
*/
|
on_exit_reset();
|
||||||
closesocket(pgStatPmPipe[1]);
|
|
||||||
pgStatPmPipe[1] = -1;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Ignore all signals usually bound to some action in the postmaster,
|
* Ignore all signals usually bound to some action in the postmaster,
|
||||||
@ -1275,6 +1339,31 @@ pgstat_main(void)
|
|||||||
pqsignal(SIGTTOU, SIG_DFL);
|
pqsignal(SIGTTOU, SIG_DFL);
|
||||||
pqsignal(SIGCONT, SIG_DFL);
|
pqsignal(SIGCONT, SIG_DFL);
|
||||||
pqsignal(SIGWINCH, SIG_DFL);
|
pqsignal(SIGWINCH, SIG_DFL);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* ----------
|
||||||
|
* pgstat_main() -
|
||||||
|
*
|
||||||
|
* Start up the statistics collector itself. This is the body of the
|
||||||
|
* postmaster child process.
|
||||||
|
* ----------
|
||||||
|
*/
|
||||||
|
NON_EXEC_STATIC void
|
||||||
|
pgstat_main(PGSTAT_FORK_ARGS)
|
||||||
|
{
|
||||||
|
pgstat_mainInit(); /* Note: for *both* EXEC_BACKEND and regular cases */
|
||||||
|
|
||||||
|
#ifdef EXEC_BACKEND
|
||||||
|
pgstat_parseArgs(argc,argv);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Close the writing end of the postmaster pipe, so we'll see it
|
||||||
|
* closing when the postmaster terminates and can terminate as well.
|
||||||
|
*/
|
||||||
|
closesocket(pgStatPmPipe[1]);
|
||||||
|
pgStatPmPipe[1] = -1;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Start a buffering process to read from the socket, so we have a
|
* Start a buffering process to read from the socket, so we have a
|
||||||
@ -1305,9 +1394,12 @@ pgstat_main(void)
|
|||||||
|
|
||||||
case 0:
|
case 0:
|
||||||
/* child becomes collector process */
|
/* child becomes collector process */
|
||||||
closesocket(pgStatPipe[1]);
|
#ifdef EXEC_BACKEND
|
||||||
closesocket(pgStatSock);
|
pgstat_exec(STAT_PROC_COLLECTOR);
|
||||||
break;
|
#else
|
||||||
|
pgstat_mainChild();
|
||||||
|
#endif
|
||||||
|
exit(0);
|
||||||
|
|
||||||
default:
|
default:
|
||||||
/* parent becomes buffer process */
|
/* parent becomes buffer process */
|
||||||
@ -1315,6 +1407,36 @@ pgstat_main(void)
|
|||||||
pgstat_recvbuffer();
|
pgstat_recvbuffer();
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
NON_EXEC_STATIC void
|
||||||
|
pgstat_mainChild(PGSTAT_FORK_ARGS)
|
||||||
|
{
|
||||||
|
PgStat_Msg msg;
|
||||||
|
fd_set rfds;
|
||||||
|
int readPipe;
|
||||||
|
int pmPipe;
|
||||||
|
int maxfd;
|
||||||
|
int nready;
|
||||||
|
int len = 0;
|
||||||
|
struct timeval timeout;
|
||||||
|
struct timeval next_statwrite;
|
||||||
|
bool need_statwrite;
|
||||||
|
HASHCTL hash_ctl;
|
||||||
|
|
||||||
|
#ifdef EXEC_BACKEND
|
||||||
|
MemoryContextInit(); /* before any elog'ing can occur */
|
||||||
|
|
||||||
|
pgstat_mainInit();
|
||||||
|
pgstat_parseArgs(argc,argv);
|
||||||
|
#else
|
||||||
|
MyProcPid = getpid(); /* reset MyProcPid */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
closesocket(pgStatPipe[1]);
|
||||||
|
closesocket(pgStatSock);
|
||||||
|
pmPipe = pgStatPmPipe[0];
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* In the child we can have default SIGCHLD handling (in case we want
|
* In the child we can have default SIGCHLD handling (in case we want
|
||||||
@ -1322,8 +1444,6 @@ pgstat_main(void)
|
|||||||
*/
|
*/
|
||||||
pqsignal(SIGCHLD, SIG_DFL);
|
pqsignal(SIGCHLD, SIG_DFL);
|
||||||
|
|
||||||
MyProcPid = getpid(); /* reset MyProcPid */
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Identify myself via ps
|
* Identify myself via ps
|
||||||
*/
|
*/
|
||||||
|
@ -37,7 +37,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $PostgreSQL: pgsql/src/backend/postmaster/postmaster.c,v 1.352 2003/12/20 17:31:21 momjian Exp $
|
* $PostgreSQL: pgsql/src/backend/postmaster/postmaster.c,v 1.353 2003/12/25 03:52:51 momjian Exp $
|
||||||
*
|
*
|
||||||
* NOTES
|
* NOTES
|
||||||
*
|
*
|
||||||
@ -289,6 +289,7 @@ static void RandomSalt(char *cryptSalt, char *md5Salt);
|
|||||||
static void SignalChildren(int signal);
|
static void SignalChildren(int signal);
|
||||||
static int CountChildren(void);
|
static int CountChildren(void);
|
||||||
static bool CreateOptsFile(int argc, char *argv[]);
|
static bool CreateOptsFile(int argc, char *argv[]);
|
||||||
|
NON_EXEC_STATIC void SSDataBaseInit(int xlop);
|
||||||
static pid_t SSDataBase(int xlop);
|
static pid_t SSDataBase(int xlop);
|
||||||
static void
|
static void
|
||||||
postmaster_error(const char *fmt,...)
|
postmaster_error(const char *fmt,...)
|
||||||
@ -296,8 +297,8 @@ postmaster_error(const char *fmt,...)
|
|||||||
__attribute__((format(printf, 1, 2)));
|
__attribute__((format(printf, 1, 2)));
|
||||||
|
|
||||||
#ifdef EXEC_BACKEND
|
#ifdef EXEC_BACKEND
|
||||||
static void
|
void read_backend_variables(pid_t pid, Port *port);
|
||||||
write_backend_variables(pid_t pid, Port *port);
|
static void write_backend_variables(pid_t pid, Port *port);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define StartupDataBase() SSDataBase(BS_XLOG_STARTUP)
|
#define StartupDataBase() SSDataBase(BS_XLOG_STARTUP)
|
||||||
@ -2848,9 +2849,46 @@ CountChildren(void)
|
|||||||
/*
|
/*
|
||||||
* Fire off a subprocess for startup/shutdown/checkpoint.
|
* Fire off a subprocess for startup/shutdown/checkpoint.
|
||||||
*
|
*
|
||||||
* Return value is subprocess' PID, or 0 if failed to start subprocess
|
* Return value of SSDataBase is subprocess' PID, or 0 if failed to start subprocess
|
||||||
* (0 is returned only for checkpoint case).
|
* (0 is returned only for checkpoint case).
|
||||||
*/
|
*/
|
||||||
|
NON_EXEC_STATIC void
|
||||||
|
SSDataBaseInit(int xlop)
|
||||||
|
{
|
||||||
|
const char *statmsg;
|
||||||
|
|
||||||
|
IsUnderPostmaster = true; /* we are a postmaster subprocess
|
||||||
|
* now */
|
||||||
|
|
||||||
|
/* Lose the postmaster's on-exit routines and port connections */
|
||||||
|
on_exit_reset();
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Identify myself via ps
|
||||||
|
*/
|
||||||
|
switch (xlop)
|
||||||
|
{
|
||||||
|
case BS_XLOG_STARTUP:
|
||||||
|
statmsg = "startup subprocess";
|
||||||
|
break;
|
||||||
|
case BS_XLOG_CHECKPOINT:
|
||||||
|
statmsg = "checkpoint subprocess";
|
||||||
|
break;
|
||||||
|
case BS_XLOG_BGWRITER:
|
||||||
|
statmsg = "bgwriter subprocess";
|
||||||
|
break;
|
||||||
|
case BS_XLOG_SHUTDOWN:
|
||||||
|
statmsg = "shutdown subprocess";
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
statmsg = "??? subprocess";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
init_ps_display(statmsg, "", "");
|
||||||
|
set_ps_display("");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static pid_t
|
static pid_t
|
||||||
SSDataBase(int xlop)
|
SSDataBase(int xlop)
|
||||||
{
|
{
|
||||||
@ -2876,16 +2914,11 @@ SSDataBase(int xlop)
|
|||||||
|
|
||||||
if ((pid = fork()) == 0) /* child */
|
if ((pid = fork()) == 0) /* child */
|
||||||
{
|
{
|
||||||
const char *statmsg;
|
|
||||||
char *av[10];
|
char *av[10];
|
||||||
int ac = 0;
|
int ac = 0;
|
||||||
char nbbuf[32];
|
char nbbuf[32];
|
||||||
char xlbuf[32];
|
char xlbuf[32];
|
||||||
|
|
||||||
#ifdef EXEC_BACKEND
|
|
||||||
char pbuf[NAMEDATALEN + 256];
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef LINUX_PROFILE
|
#ifdef LINUX_PROFILE
|
||||||
setitimer(ITIMER_PROF, &prof_itimer, NULL);
|
setitimer(ITIMER_PROF, &prof_itimer, NULL);
|
||||||
#endif
|
#endif
|
||||||
@ -2895,65 +2928,47 @@ SSDataBase(int xlop)
|
|||||||
beos_backend_startup();
|
beos_backend_startup();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
IsUnderPostmaster = true; /* we are a postmaster subprocess
|
|
||||||
* now */
|
|
||||||
|
|
||||||
/* Lose the postmaster's on-exit routines and port connections */
|
|
||||||
on_exit_reset();
|
|
||||||
|
|
||||||
/* Close the postmaster's sockets */
|
/* Close the postmaster's sockets */
|
||||||
ClosePostmasterPorts(true);
|
ClosePostmasterPorts(true);
|
||||||
|
|
||||||
/*
|
#ifndef EXEC_BACKEND
|
||||||
* Identify myself via ps
|
SSDataBaseInit(xlop);
|
||||||
*/
|
#endif
|
||||||
switch (xlop)
|
|
||||||
{
|
|
||||||
case BS_XLOG_STARTUP:
|
|
||||||
statmsg = "startup subprocess";
|
|
||||||
break;
|
|
||||||
case BS_XLOG_CHECKPOINT:
|
|
||||||
statmsg = "checkpoint subprocess";
|
|
||||||
break;
|
|
||||||
case BS_XLOG_BGWRITER:
|
|
||||||
statmsg = "bgwriter subprocess";
|
|
||||||
break;
|
|
||||||
case BS_XLOG_SHUTDOWN:
|
|
||||||
statmsg = "shutdown subprocess";
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
statmsg = "??? subprocess";
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
init_ps_display(statmsg, "", "");
|
|
||||||
set_ps_display("");
|
|
||||||
|
|
||||||
/* Set up command-line arguments for subprocess */
|
/* Set up command-line arguments for subprocess */
|
||||||
av[ac++] = "postgres";
|
av[ac++] = "postgres";
|
||||||
|
|
||||||
|
#ifdef EXEC_BACKEND
|
||||||
|
av[ac++] = "-boot";
|
||||||
|
#endif
|
||||||
|
|
||||||
snprintf(nbbuf, sizeof(nbbuf), "-B%d", NBuffers);
|
snprintf(nbbuf, sizeof(nbbuf), "-B%d", NBuffers);
|
||||||
av[ac++] = nbbuf;
|
av[ac++] = nbbuf;
|
||||||
|
|
||||||
snprintf(xlbuf, sizeof(xlbuf), "-x%d", xlop);
|
snprintf(xlbuf, sizeof(xlbuf), "-x%d", xlop);
|
||||||
av[ac++] = xlbuf;
|
av[ac++] = xlbuf;
|
||||||
|
|
||||||
av[ac++] = "-p";
|
|
||||||
#ifdef EXEC_BACKEND
|
#ifdef EXEC_BACKEND
|
||||||
Assert(UsedShmemSegID != 0 && UsedShmemSegAddr != NULL);
|
write_backend_variables(getpid(),NULL);
|
||||||
/* database name at the end because it might contain commas */
|
|
||||||
snprintf(pbuf, sizeof(pbuf), "%lu,%p,%s",
|
/* pass data dir before end of secure switches (-p) */
|
||||||
UsedShmemSegID, UsedShmemSegAddr, "template1");
|
av[ac++] = "-D";
|
||||||
av[ac++] = pbuf;
|
av[ac++] = DataDir;
|
||||||
#else
|
|
||||||
av[ac++] = "template1";
|
|
||||||
#endif
|
#endif
|
||||||
|
av[ac++] = "-p";
|
||||||
|
av[ac++] = "template1";
|
||||||
|
|
||||||
av[ac] = (char *) NULL;
|
av[ac] = (char *) NULL;
|
||||||
|
|
||||||
Assert(ac < lengthof(av));
|
Assert(ac < lengthof(av));
|
||||||
|
|
||||||
|
#ifdef EXEC_BACKEND
|
||||||
|
if (execv(pg_pathname,av) == -1)
|
||||||
|
elog(FATAL,"unable to execv in SSDataBase: %m");
|
||||||
|
#else
|
||||||
BootstrapMain(ac, av);
|
BootstrapMain(ac, av);
|
||||||
ExitPostmaster(0);
|
ExitPostmaster(0);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/* in parent */
|
/* in parent */
|
||||||
@ -3107,17 +3122,17 @@ extern slock_t *ProcStructLock;
|
|||||||
extern int pgStatSock;
|
extern int pgStatSock;
|
||||||
|
|
||||||
#define write_var(var,fp) fwrite((void*)&(var),sizeof(var),1,fp)
|
#define write_var(var,fp) fwrite((void*)&(var),sizeof(var),1,fp)
|
||||||
#define read_var(var,fp) fread((void*)&(var),sizeof(var),1,fp);
|
#define read_var(var,fp) fread((void*)&(var),sizeof(var),1,fp)
|
||||||
#define get_tmp_backend_file_name(buf,id) \
|
#define get_tmp_backend_file_name(buf,id) \
|
||||||
do { \
|
do { \
|
||||||
Assert(DataDir); \
|
Assert(DataDir); \
|
||||||
sprintf((buf), \
|
sprintf((buf), \
|
||||||
"%s/%s/%s.backend_var.%d", \
|
"%s/%s/%s.backend_var.%d", \
|
||||||
DataDir, \
|
DataDir, \
|
||||||
PG_TEMP_FILES_DIR, \
|
PG_TEMP_FILES_DIR, \
|
||||||
PG_TEMP_FILE_PREFIX, \
|
PG_TEMP_FILE_PREFIX, \
|
||||||
(id)); \
|
(id)); \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
static void
|
static void
|
||||||
write_backend_variables(pid_t pid, Port *port)
|
write_backend_variables(pid_t pid, Port *port)
|
||||||
@ -3146,11 +3161,16 @@ write_backend_variables(pid_t pid, Port *port)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Write vars */
|
/* Write vars */
|
||||||
write_var(port->sock,fp);
|
if (port)
|
||||||
write_var(port->proto,fp);
|
{
|
||||||
write_var(port->laddr,fp);
|
write_var(port->sock,fp);
|
||||||
write_var(port->raddr,fp);
|
write_var(port->proto,fp);
|
||||||
write_var(port->canAcceptConnections,fp);
|
write_var(port->laddr,fp);
|
||||||
|
write_var(port->raddr,fp);
|
||||||
|
write_var(port->canAcceptConnections,fp);
|
||||||
|
write_var(port->cryptSalt,fp);
|
||||||
|
write_var(port->md5Salt,fp);
|
||||||
|
}
|
||||||
write_var(MyCancelKey,fp);
|
write_var(MyCancelKey,fp);
|
||||||
|
|
||||||
write_var(RedoRecPtr,fp);
|
write_var(RedoRecPtr,fp);
|
||||||
@ -3190,11 +3210,16 @@ read_backend_variables(pid_t pid, Port *port)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Read vars */
|
/* Read vars */
|
||||||
read_var(port->sock,fp);
|
if (port)
|
||||||
read_var(port->proto,fp);
|
{
|
||||||
read_var(port->laddr,fp);
|
read_var(port->sock,fp);
|
||||||
read_var(port->raddr,fp);
|
read_var(port->proto,fp);
|
||||||
read_var(port->canAcceptConnections,fp);
|
read_var(port->laddr,fp);
|
||||||
|
read_var(port->raddr,fp);
|
||||||
|
read_var(port->canAcceptConnections,fp);
|
||||||
|
read_var(port->cryptSalt,fp);
|
||||||
|
read_var(port->md5Salt,fp);
|
||||||
|
}
|
||||||
read_var(MyCancelKey,fp);
|
read_var(MyCancelKey,fp);
|
||||||
|
|
||||||
read_var(RedoRecPtr,fp);
|
read_var(RedoRecPtr,fp);
|
||||||
|
@ -8,7 +8,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $PostgreSQL: pgsql/src/backend/storage/lmgr/proc.c,v 1.142 2003/12/21 00:33:33 tgl Exp $
|
* $PostgreSQL: pgsql/src/backend/storage/lmgr/proc.c,v 1.143 2003/12/25 03:52:51 momjian Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -122,20 +122,31 @@ ProcGlobalSemas(int maxBackends)
|
|||||||
void
|
void
|
||||||
InitProcGlobal(int maxBackends)
|
InitProcGlobal(int maxBackends)
|
||||||
{
|
{
|
||||||
bool found = false;
|
bool foundProcGlobal, foundDummy;
|
||||||
|
|
||||||
/* Create or attach to the ProcGlobal shared structure */
|
/* Create or attach to the ProcGlobal shared structure */
|
||||||
ProcGlobal = (PROC_HDR *)
|
ProcGlobal = (PROC_HDR *)
|
||||||
ShmemInitStruct("Proc Header", sizeof(PROC_HDR), &found);
|
ShmemInitStruct("Proc Header", sizeof(PROC_HDR), &foundProcGlobal);
|
||||||
|
|
||||||
/* --------------------
|
/*
|
||||||
* We're the first - initialize.
|
* Create or attach to the PGPROC structures for dummy (checkpoint)
|
||||||
* XXX if found should ever be true, it is a sign of impending doom ...
|
* processes, too. This does not get linked into the freeProcs
|
||||||
* ought to complain if so?
|
* list.
|
||||||
* --------------------
|
|
||||||
*/
|
*/
|
||||||
if (!found)
|
DummyProc = (PGPROC *)
|
||||||
|
ShmemInitStruct("DummyProc",sizeof(PGPROC) * NUM_DUMMY_PROCS, &foundDummy);
|
||||||
|
|
||||||
|
if (foundProcGlobal || foundDummy)
|
||||||
{
|
{
|
||||||
|
/* both should be present or neither */
|
||||||
|
Assert(foundProcGlobal && foundDummy);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* We're the first - initialize.
|
||||||
|
*/
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
ProcGlobal->freeProcs = INVALID_OFFSET;
|
ProcGlobal->freeProcs = INVALID_OFFSET;
|
||||||
@ -159,16 +170,6 @@ InitProcGlobal(int maxBackends)
|
|||||||
ProcGlobal->freeProcs = MAKE_OFFSET(proc);
|
ProcGlobal->freeProcs = MAKE_OFFSET(proc);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Pre-allocate a PGPROC structure for dummy (checkpoint)
|
|
||||||
* processes, too. This does not get linked into the freeProcs
|
|
||||||
* list.
|
|
||||||
*/
|
|
||||||
DummyProc = (PGPROC *) ShmemAlloc(sizeof(PGPROC) * NUM_DUMMY_PROCS);
|
|
||||||
if (!DummyProc)
|
|
||||||
ereport(FATAL,
|
|
||||||
(errcode(ERRCODE_OUT_OF_MEMORY),
|
|
||||||
errmsg("out of shared memory")));
|
|
||||||
MemSet(DummyProc, 0, sizeof(PGPROC) * NUM_DUMMY_PROCS);
|
MemSet(DummyProc, 0, sizeof(PGPROC) * NUM_DUMMY_PROCS);
|
||||||
for (i = 0; i < NUM_DUMMY_PROCS; i++)
|
for (i = 0; i < NUM_DUMMY_PROCS; i++)
|
||||||
{
|
{
|
||||||
|
@ -8,7 +8,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $PostgreSQL: pgsql/src/backend/tcop/postgres.c,v 1.380 2003/12/20 17:31:21 momjian Exp $
|
* $PostgreSQL: pgsql/src/backend/tcop/postgres.c,v 1.381 2003/12/25 03:52:51 momjian Exp $
|
||||||
*
|
*
|
||||||
* NOTES
|
* NOTES
|
||||||
* this is the "main" module of the postgres backend and
|
* this is the "main" module of the postgres backend and
|
||||||
@ -2063,7 +2063,7 @@ PostgresMain(int argc, char *argv[], const char *username)
|
|||||||
*
|
*
|
||||||
* If we are running under the postmaster, this is done already.
|
* If we are running under the postmaster, this is done already.
|
||||||
*/
|
*/
|
||||||
if (!IsUnderPostmaster /* when exec || ExecBackend */)
|
if (!IsUnderPostmaster || ExecBackend)
|
||||||
MemoryContextInit();
|
MemoryContextInit();
|
||||||
|
|
||||||
set_ps_display("startup");
|
set_ps_display("startup");
|
||||||
@ -2076,7 +2076,7 @@ PostgresMain(int argc, char *argv[], const char *username)
|
|||||||
Noversion = false;
|
Noversion = false;
|
||||||
EchoQuery = false;
|
EchoQuery = false;
|
||||||
|
|
||||||
if (!IsUnderPostmaster /* when exec || ExecBackend */ )
|
if (!IsUnderPostmaster)
|
||||||
{
|
{
|
||||||
InitializeGUCOptions();
|
InitializeGUCOptions();
|
||||||
potential_DataDir = getenv("PGDATA");
|
potential_DataDir = getenv("PGDATA");
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
*
|
*
|
||||||
* Copyright (c) 2001-2003, PostgreSQL Global Development Group
|
* Copyright (c) 2001-2003, PostgreSQL Global Development Group
|
||||||
*
|
*
|
||||||
* $PostgreSQL: pgsql/src/include/pgstat.h,v 1.17 2003/11/29 22:40:53 pgsql Exp $
|
* $PostgreSQL: pgsql/src/include/pgstat.h,v 1.18 2003/12/25 03:52:51 momjian Exp $
|
||||||
* ----------
|
* ----------
|
||||||
*/
|
*/
|
||||||
#ifndef PGSTAT_H
|
#ifndef PGSTAT_H
|
||||||
@ -326,6 +326,18 @@ typedef union PgStat_Msg
|
|||||||
} PgStat_Msg;
|
} PgStat_Msg;
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef EXEC_BACKEND
|
||||||
|
typedef enum STATS_PROCESS_TYPE
|
||||||
|
{
|
||||||
|
STAT_PROC_BUFFER,
|
||||||
|
STAT_PROC_COLLECTOR
|
||||||
|
} STATS_PROCESS_TYPE;
|
||||||
|
#define PGSTAT_FORK_ARGS int argc, char *argv[]
|
||||||
|
#else
|
||||||
|
#define PGSTAT_FORK_ARGS void
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/* ----------
|
/* ----------
|
||||||
* GUC parameters
|
* GUC parameters
|
||||||
* ----------
|
* ----------
|
||||||
@ -342,6 +354,17 @@ extern bool pgstat_collect_blocklevel;
|
|||||||
*/
|
*/
|
||||||
extern bool pgstat_is_running;
|
extern bool pgstat_is_running;
|
||||||
|
|
||||||
|
|
||||||
|
/* ----------
|
||||||
|
* Functions called from main
|
||||||
|
* ----------
|
||||||
|
*/
|
||||||
|
#ifdef EXEC_BACKEND
|
||||||
|
extern void pgstat_main(PGSTAT_FORK_ARGS);
|
||||||
|
extern void pgstat_mainChild(PGSTAT_FORK_ARGS);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/* ----------
|
/* ----------
|
||||||
* Functions called from postmaster
|
* Functions called from postmaster
|
||||||
* ----------
|
* ----------
|
||||||
|
Loading…
x
Reference in New Issue
Block a user