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:
Bruce Momjian 2003-12-25 03:52:51 +00:00
parent 3e32e9476f
commit aeddc2a60d
7 changed files with 345 additions and 159 deletions

View File

@ -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();

View File

@ -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.

View File

@ -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
*/ */

View File

@ -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,9 +3122,9 @@ 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", \
@ -3117,7 +3132,7 @@ extern int pgStatSock;
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 */
if (port)
{
write_var(port->sock,fp); write_var(port->sock,fp);
write_var(port->proto,fp); write_var(port->proto,fp);
write_var(port->laddr,fp); write_var(port->laddr,fp);
write_var(port->raddr,fp); write_var(port->raddr,fp);
write_var(port->canAcceptConnections,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 */
if (port)
{
read_var(port->sock,fp); read_var(port->sock,fp);
read_var(port->proto,fp); read_var(port->proto,fp);
read_var(port->laddr,fp); read_var(port->laddr,fp);
read_var(port->raddr,fp); read_var(port->raddr,fp);
read_var(port->canAcceptConnections,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);

View File

@ -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++)
{ {

View File

@ -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");

View File

@ -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
* ---------- * ----------