mirror of
https://github.com/postgres/postgres.git
synced 2025-11-10 17:42:29 +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:
@@ -37,7 +37,7 @@
|
||||
*
|
||||
*
|
||||
* 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
|
||||
*
|
||||
@@ -289,6 +289,7 @@ static void RandomSalt(char *cryptSalt, char *md5Salt);
|
||||
static void SignalChildren(int signal);
|
||||
static int CountChildren(void);
|
||||
static bool CreateOptsFile(int argc, char *argv[]);
|
||||
NON_EXEC_STATIC void SSDataBaseInit(int xlop);
|
||||
static pid_t SSDataBase(int xlop);
|
||||
static void
|
||||
postmaster_error(const char *fmt,...)
|
||||
@@ -296,8 +297,8 @@ postmaster_error(const char *fmt,...)
|
||||
__attribute__((format(printf, 1, 2)));
|
||||
|
||||
#ifdef EXEC_BACKEND
|
||||
static void
|
||||
write_backend_variables(pid_t pid, Port *port);
|
||||
void read_backend_variables(pid_t pid, Port *port);
|
||||
static void write_backend_variables(pid_t pid, Port *port);
|
||||
#endif
|
||||
|
||||
#define StartupDataBase() SSDataBase(BS_XLOG_STARTUP)
|
||||
@@ -2848,9 +2849,46 @@ CountChildren(void)
|
||||
/*
|
||||
* 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).
|
||||
*/
|
||||
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
|
||||
SSDataBase(int xlop)
|
||||
{
|
||||
@@ -2876,16 +2914,11 @@ SSDataBase(int xlop)
|
||||
|
||||
if ((pid = fork()) == 0) /* child */
|
||||
{
|
||||
const char *statmsg;
|
||||
char *av[10];
|
||||
int ac = 0;
|
||||
char nbbuf[32];
|
||||
char xlbuf[32];
|
||||
|
||||
#ifdef EXEC_BACKEND
|
||||
char pbuf[NAMEDATALEN + 256];
|
||||
#endif
|
||||
|
||||
#ifdef LINUX_PROFILE
|
||||
setitimer(ITIMER_PROF, &prof_itimer, NULL);
|
||||
#endif
|
||||
@@ -2895,65 +2928,47 @@ SSDataBase(int xlop)
|
||||
beos_backend_startup();
|
||||
#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 */
|
||||
ClosePostmasterPorts(true);
|
||||
|
||||
/*
|
||||
* 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("");
|
||||
#ifndef EXEC_BACKEND
|
||||
SSDataBaseInit(xlop);
|
||||
#endif
|
||||
|
||||
/* Set up command-line arguments for subprocess */
|
||||
av[ac++] = "postgres";
|
||||
|
||||
#ifdef EXEC_BACKEND
|
||||
av[ac++] = "-boot";
|
||||
#endif
|
||||
|
||||
snprintf(nbbuf, sizeof(nbbuf), "-B%d", NBuffers);
|
||||
av[ac++] = nbbuf;
|
||||
|
||||
snprintf(xlbuf, sizeof(xlbuf), "-x%d", xlop);
|
||||
av[ac++] = xlbuf;
|
||||
|
||||
av[ac++] = "-p";
|
||||
#ifdef EXEC_BACKEND
|
||||
Assert(UsedShmemSegID != 0 && UsedShmemSegAddr != NULL);
|
||||
/* database name at the end because it might contain commas */
|
||||
snprintf(pbuf, sizeof(pbuf), "%lu,%p,%s",
|
||||
UsedShmemSegID, UsedShmemSegAddr, "template1");
|
||||
av[ac++] = pbuf;
|
||||
#else
|
||||
av[ac++] = "template1";
|
||||
write_backend_variables(getpid(),NULL);
|
||||
|
||||
/* pass data dir before end of secure switches (-p) */
|
||||
av[ac++] = "-D";
|
||||
av[ac++] = DataDir;
|
||||
#endif
|
||||
av[ac++] = "-p";
|
||||
av[ac++] = "template1";
|
||||
|
||||
av[ac] = (char *) NULL;
|
||||
|
||||
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);
|
||||
ExitPostmaster(0);
|
||||
#endif
|
||||
}
|
||||
|
||||
/* in parent */
|
||||
@@ -3107,17 +3122,17 @@ extern slock_t *ProcStructLock;
|
||||
extern int pgStatSock;
|
||||
|
||||
#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) \
|
||||
do { \
|
||||
Assert(DataDir); \
|
||||
sprintf((buf), \
|
||||
"%s/%s/%s.backend_var.%d", \
|
||||
DataDir, \
|
||||
PG_TEMP_FILES_DIR, \
|
||||
PG_TEMP_FILE_PREFIX, \
|
||||
(id)); \
|
||||
} while (0)
|
||||
do { \
|
||||
Assert(DataDir); \
|
||||
sprintf((buf), \
|
||||
"%s/%s/%s.backend_var.%d", \
|
||||
DataDir, \
|
||||
PG_TEMP_FILES_DIR, \
|
||||
PG_TEMP_FILE_PREFIX, \
|
||||
(id)); \
|
||||
} while (0)
|
||||
|
||||
static void
|
||||
write_backend_variables(pid_t pid, Port *port)
|
||||
@@ -3146,11 +3161,16 @@ write_backend_variables(pid_t pid, Port *port)
|
||||
}
|
||||
|
||||
/* Write vars */
|
||||
write_var(port->sock,fp);
|
||||
write_var(port->proto,fp);
|
||||
write_var(port->laddr,fp);
|
||||
write_var(port->raddr,fp);
|
||||
write_var(port->canAcceptConnections,fp);
|
||||
if (port)
|
||||
{
|
||||
write_var(port->sock,fp);
|
||||
write_var(port->proto,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(RedoRecPtr,fp);
|
||||
@@ -3190,11 +3210,16 @@ read_backend_variables(pid_t pid, Port *port)
|
||||
}
|
||||
|
||||
/* Read vars */
|
||||
read_var(port->sock,fp);
|
||||
read_var(port->proto,fp);
|
||||
read_var(port->laddr,fp);
|
||||
read_var(port->raddr,fp);
|
||||
read_var(port->canAcceptConnections,fp);
|
||||
if (port)
|
||||
{
|
||||
read_var(port->sock,fp);
|
||||
read_var(port->proto,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(RedoRecPtr,fp);
|
||||
|
||||
Reference in New Issue
Block a user