mirror of
https://github.com/postgres/postgres.git
synced 2025-09-02 04:21:28 +03:00
Reorganize backend code to more cleanly manage executable names and
backend startup.
This commit is contained in:
@@ -13,7 +13,7 @@
|
||||
*
|
||||
* Copyright (c) 2001-2003, PostgreSQL Global Development Group
|
||||
*
|
||||
* $PostgreSQL: pgsql/src/backend/postmaster/pgstat.c,v 1.68 2004/05/06 19:23:25 momjian Exp $
|
||||
* $PostgreSQL: pgsql/src/backend/postmaster/pgstat.c,v 1.69 2004/05/13 22:45:02 momjian Exp $
|
||||
* ----------
|
||||
*/
|
||||
#include "postgres.h"
|
||||
@@ -487,7 +487,7 @@ pgstat_forkexec(STATS_PROCESS_TYPE procType)
|
||||
/* + the pstat file names, and postgres pathname */
|
||||
snprintf(pgstatBuf[bufc++],MAXPGPATH,"\"%s\"",pgStat_tmpfname);
|
||||
snprintf(pgstatBuf[bufc++],MAXPGPATH,"\"%s\"",pgStat_fname);
|
||||
snprintf(pgstatBuf[bufc++],MAXPGPATH,"\"%s\"",pg_pathname);
|
||||
snprintf(pgstatBuf[bufc++],MAXPGPATH,"\"%s\"",my_exec_path); /* used? */
|
||||
snprintf(pgstatBuf[bufc++],MAXPGPATH,"\"%s\"",DataDir);
|
||||
|
||||
/* Add to the arg list */
|
||||
@@ -500,9 +500,9 @@ pgstat_forkexec(STATS_PROCESS_TYPE procType)
|
||||
|
||||
/* Fire off execv in child */
|
||||
#ifdef WIN32
|
||||
pid = win32_forkexec(pg_pathname,av);
|
||||
pid = win32_forkexec(my_exec_path, av);
|
||||
#else
|
||||
if ((pid = fork()) == 0 && (execv(pg_pathname,av) == -1))
|
||||
if ((pid = fork()) == 0 && (execv(my_exec_path, av) == -1))
|
||||
/* FIXME: [fork/exec] suggestions for what to do here? Can't call elog... */
|
||||
abort();
|
||||
#endif
|
||||
@@ -530,9 +530,9 @@ pgstat_parseArgs(PGSTAT_FORK_ARGS)
|
||||
pgStatPipe[0] = atoi(argv[argc++]);
|
||||
pgStatPipe[1] = atoi(argv[argc++]);
|
||||
MaxBackends = atoi(argv[argc++]);
|
||||
strncpy(pgStat_tmpfname,argv[argc++],MAXPGPATH);
|
||||
strncpy(pgStat_fname, argv[argc++],MAXPGPATH);
|
||||
strncpy(pg_pathname, argv[argc++],MAXPGPATH);
|
||||
StrNCpy(pgStat_tmpfname,argv[argc++],MAXPGPATH);
|
||||
StrNCpy(pgStat_fname, argv[argc++],MAXPGPATH);
|
||||
StrNCpy(my_exec_path, argv[argc++],MAXPGPATH);
|
||||
DataDir = strdup(argv[argc++]);
|
||||
|
||||
read_nondefault_variables();
|
||||
|
@@ -37,7 +37,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $PostgreSQL: pgsql/src/backend/postmaster/postmaster.c,v 1.385 2004/05/12 13:38:39 momjian Exp $
|
||||
* $PostgreSQL: pgsql/src/backend/postmaster/postmaster.c,v 1.386 2004/05/13 22:45:02 momjian Exp $
|
||||
*
|
||||
* NOTES
|
||||
*
|
||||
@@ -181,7 +181,6 @@ static int ListenSocket[MAXLISTEN];
|
||||
/* Used to reduce macros tests */
|
||||
#ifdef EXEC_BACKEND
|
||||
const bool ExecBackend = true;
|
||||
|
||||
#else
|
||||
const bool ExecBackend = false;
|
||||
#endif
|
||||
@@ -286,7 +285,7 @@ static long PostmasterRandom(void);
|
||||
static void RandomSalt(char *cryptSalt, char *md5Salt);
|
||||
static void SignalChildren(int signal);
|
||||
static int CountChildren(void);
|
||||
static bool CreateOptsFile(int argc, char *argv[]);
|
||||
static bool CreateOptsFile(int argc, char *argv[], char *fullprogname);
|
||||
NON_EXEC_STATIC void SSDataBaseInit(int xlop);
|
||||
static pid_t SSDataBase(int xlop);
|
||||
static void
|
||||
@@ -295,6 +294,9 @@ postmaster_error(const char *fmt,...)
|
||||
__attribute__((format(printf, 1, 2)));
|
||||
|
||||
#ifdef EXEC_BACKEND
|
||||
|
||||
static char postgres_exec_path[MAXPGPATH];
|
||||
|
||||
#ifdef WIN32
|
||||
pid_t win32_forkexec(const char* path, char *argv[]);
|
||||
|
||||
@@ -323,7 +325,6 @@ static void ShmemBackendArrayRemove(pid_t pid);
|
||||
#define StartBackgroundWriter() SSDataBase(BS_XLOG_BGWRITER)
|
||||
#define ShutdownDataBase() SSDataBase(BS_XLOG_SHUTDOWN)
|
||||
|
||||
|
||||
static void
|
||||
checkDataDir(const char *checkdir)
|
||||
{
|
||||
@@ -692,11 +693,18 @@ PostmasterMain(int argc, char *argv[])
|
||||
/*
|
||||
* On some systems our dynloader code needs the executable's pathname.
|
||||
*/
|
||||
if (find_my_exec(pg_pathname, argv[0]) < 0)
|
||||
if (find_my_exec(my_exec_path, argv[0]) < 0)
|
||||
ereport(FATAL,
|
||||
(errmsg("%s: could not locate postgres executable",
|
||||
(errmsg("%s: could not locate my own executable path",
|
||||
progname)));
|
||||
|
||||
#ifdef EXEC_BACKEND
|
||||
if (find_other_exec(postgres_exec_path, argv[0], "postgres", PG_VERSIONSTR) < 0)
|
||||
ereport(FATAL,
|
||||
(errmsg("%s: could not locate postgres executable or non-matching version",
|
||||
progname)));
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Initialize SSL library, if specified.
|
||||
*/
|
||||
@@ -852,7 +860,7 @@ PostmasterMain(int argc, char *argv[])
|
||||
* recording bogus options (eg, NBuffers too high for available
|
||||
* memory).
|
||||
*/
|
||||
if (!CreateOptsFile(argc, argv))
|
||||
if (!CreateOptsFile(argc, argv, my_exec_path))
|
||||
ExitPostmaster(1);
|
||||
|
||||
/*
|
||||
@@ -2754,10 +2762,10 @@ Backend_forkexec(Port *port)
|
||||
Assert(ac <= lengthof(av));
|
||||
|
||||
#ifdef WIN32
|
||||
pid = win32_forkexec(pg_pathname,av); /* logs on error */
|
||||
pid = win32_forkexec(postgres_exec_path, av); /* logs on error */
|
||||
#else
|
||||
/* Fire off execv in child */
|
||||
if ((pid = fork()) == 0 && (execv(pg_pathname,av) == -1))
|
||||
if ((pid = fork()) == 0 && (execv(postgres_exec_path, av) == -1))
|
||||
/*
|
||||
* FIXME: [fork/exec] suggestions for what to do here?
|
||||
* Probably OK to issue error (unlike pgstat case)
|
||||
@@ -3116,12 +3124,12 @@ SSDataBase(int xlop)
|
||||
#ifdef EXEC_BACKEND
|
||||
/* EXEC_BACKEND case; fork/exec here */
|
||||
#ifdef WIN32
|
||||
pid = win32_forkexec(pg_pathname,av); /* logs on error */
|
||||
pid = win32_forkexec(postgres_exec_path, av); /* logs on error */
|
||||
#else
|
||||
if ((pid = fork()) == 0 && (execv(pg_pathname,av) == -1))
|
||||
if ((pid = fork()) == 0 && (execv(postgres_exec_path, av) == -1))
|
||||
{
|
||||
/* in child */
|
||||
elog(ERROR,"unable to execv in SSDataBase: %m");
|
||||
elog(ERROR, "unable to execv in SSDataBase: %m");
|
||||
exit(0);
|
||||
}
|
||||
#endif
|
||||
@@ -3215,19 +3223,12 @@ SSDataBase(int xlop)
|
||||
* Create the opts file
|
||||
*/
|
||||
static bool
|
||||
CreateOptsFile(int argc, char *argv[])
|
||||
CreateOptsFile(int argc, char *argv[], char *fullprogname)
|
||||
{
|
||||
char fullprogname[MAXPGPATH];
|
||||
char filename[MAXPGPATH];
|
||||
FILE *fp;
|
||||
int i;
|
||||
|
||||
if (find_my_exec(fullprogname, argv[0]) < 0)
|
||||
{
|
||||
elog(LOG, "could not locate postmaster");
|
||||
return false;
|
||||
}
|
||||
|
||||
snprintf(filename, sizeof(filename), "%s/postmaster.opts", DataDir);
|
||||
|
||||
if ((fp = fopen(filename, "w")) == NULL)
|
||||
|
Reference in New Issue
Block a user