mirror of
https://github.com/postgres/postgres.git
synced 2025-07-03 20:02:46 +03:00
Apply Bryan's IPC Patches
From: Bryan Henderson <bryanh@giraffe.netgate.net>
This commit is contained in:
@ -10,7 +10,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $Header: /cvsroot/pgsql/src/backend/postmaster/postmaster.c,v 1.61 1997/11/10 05:10:21 momjian Exp $
|
* $Header: /cvsroot/pgsql/src/backend/postmaster/postmaster.c,v 1.62 1997/11/17 03:47:28 scrappy Exp $
|
||||||
*
|
*
|
||||||
* NOTES
|
* NOTES
|
||||||
*
|
*
|
||||||
@ -123,6 +123,32 @@ static Dllist *PortList;
|
|||||||
|
|
||||||
static short PostPortName = -1;
|
static short PostPortName = -1;
|
||||||
static short ActiveBackends = FALSE;
|
static short ActiveBackends = FALSE;
|
||||||
|
/* This is a boolean indicating that there is at least one backend
|
||||||
|
that is accessing the current shared memory and semaphores.
|
||||||
|
Between the time that we start up, or throw away shared memory
|
||||||
|
segments and start over, and the time we generate the next
|
||||||
|
backend (because we received a connection request), it is false.
|
||||||
|
Other times, it is true.
|
||||||
|
*/
|
||||||
|
static short shmem_seq = 0;
|
||||||
|
/* This is a sequence number that indicates how many times we've had
|
||||||
|
to throw away the shared memory and start over because we doubted
|
||||||
|
its integrity. It starts off at zero and is incremented every
|
||||||
|
time we start over. We use this to ensure that we use a new
|
||||||
|
IPC shared memory key for the new shared memory segment in case
|
||||||
|
the old segment isn't entirely gone yet.
|
||||||
|
|
||||||
|
The sequence actually cycles back to 0 after 9, so pathologically
|
||||||
|
there could be an IPC failure if 10 sets of backends are all stuck
|
||||||
|
and won't release IPC resources.
|
||||||
|
*/
|
||||||
|
|
||||||
|
static IpcMemoryKey ipc_key;
|
||||||
|
/* This is the base IPC shared memory key. Other keys are generated by
|
||||||
|
adding to this.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
static int NextBackendId = MAXINT; /* XXX why? */
|
static int NextBackendId = MAXINT; /* XXX why? */
|
||||||
static char *progname = (char *) NULL;
|
static char *progname = (char *) NULL;
|
||||||
|
|
||||||
@ -904,11 +930,11 @@ ConnCreate(int serverFd, int *newFdP)
|
|||||||
static void
|
static void
|
||||||
reset_shared(short port)
|
reset_shared(short port)
|
||||||
{
|
{
|
||||||
IPCKey key;
|
ipc_key = port * 1000 + shmem_seq * 100;
|
||||||
|
CreateSharedMemoryAndSemaphores(ipc_key);
|
||||||
key = SystemPortAddressCreateIPCKey((SystemPortAddress) port);
|
ActiveBackends = FALSE;
|
||||||
CreateSharedMemoryAndSemaphores(key);
|
shmem_seq += 1;
|
||||||
ActiveBackends = FALSE;
|
if (shmem_seq >= 10) shmem_seq -= 10;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -1079,9 +1105,10 @@ BackendStartup(StartupInfo *packet, /* client's startup packet */
|
|||||||
Backend *bn; /* for backend cleanup */
|
Backend *bn; /* for backend cleanup */
|
||||||
int pid,
|
int pid,
|
||||||
i;
|
i;
|
||||||
static char envEntry[4][2 * ARGV_SIZE];
|
#define NR_ENVIRONMENT_VBL 5
|
||||||
|
static char envEntry[NR_ENVIRONMENT_VBL][2 * ARGV_SIZE];
|
||||||
|
|
||||||
for (i = 0; i < 4; ++i)
|
for (i = 0; i < NR_ENVIRONMENT_VBL; ++i)
|
||||||
{
|
{
|
||||||
MemSet(envEntry[i], 0, 2 * ARGV_SIZE);
|
MemSet(envEntry[i], 0, 2 * ARGV_SIZE);
|
||||||
}
|
}
|
||||||
@ -1101,6 +1128,9 @@ BackendStartup(StartupInfo *packet, /* client's startup packet */
|
|||||||
sprintf(envEntry[3], "PGDATA=%s", DataDir);
|
sprintf(envEntry[3], "PGDATA=%s", DataDir);
|
||||||
putenv(envEntry[3]);
|
putenv(envEntry[3]);
|
||||||
}
|
}
|
||||||
|
sprintf(envEntry[4], "IPC_KEY=%d", ipc_key);
|
||||||
|
putenv(envEntry[4]);
|
||||||
|
|
||||||
if (DebugLvl > 2)
|
if (DebugLvl > 2)
|
||||||
{
|
{
|
||||||
char **p;
|
char **p;
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $Header: /cvsroot/pgsql/src/backend/utils/init/postinit.c,v 1.17 1997/11/10 15:15:40 thomas Exp $
|
* $Header: /cvsroot/pgsql/src/backend/utils/init/postinit.c,v 1.18 1997/11/17 03:47:31 scrappy Exp $
|
||||||
*
|
*
|
||||||
* NOTES
|
* NOTES
|
||||||
* InitPostgres() is the function called from PostgresMain
|
* InitPostgres() is the function called from PostgresMain
|
||||||
@ -281,8 +281,9 @@ InitUserid()
|
|||||||
static void
|
static void
|
||||||
InitCommunication()
|
InitCommunication()
|
||||||
{
|
{
|
||||||
char *postid;
|
char *postid; /* value of environment variable */
|
||||||
char *postport;
|
char *postport; /* value of environment variable */
|
||||||
|
char *ipc_key; /* value of environemnt variable */
|
||||||
IPCKey key = 0;
|
IPCKey key = 0;
|
||||||
|
|
||||||
/* ----------------
|
/* ----------------
|
||||||
@ -302,10 +303,15 @@ InitCommunication()
|
|||||||
Assert(MyBackendTag >= 0);
|
Assert(MyBackendTag >= 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ----------------
|
|
||||||
* try and get the ipc key from POSTPORT
|
ipc_key = getenv("IPC_KEY");
|
||||||
* ----------------
|
if (!PointerIsValid(ipc_key)) {
|
||||||
*/
|
key = -1;
|
||||||
|
} else {
|
||||||
|
key = atoi(ipc_key);
|
||||||
|
Assert(MyBackendTag >= 0);
|
||||||
|
}
|
||||||
|
|
||||||
postport = getenv("POSTPORT");
|
postport = getenv("POSTPORT");
|
||||||
|
|
||||||
if (PointerIsValid(postport))
|
if (PointerIsValid(postport))
|
||||||
@ -315,8 +321,6 @@ InitCommunication()
|
|||||||
if (MyBackendTag == -1)
|
if (MyBackendTag == -1)
|
||||||
elog(FATAL, "InitCommunication: missing POSTID");
|
elog(FATAL, "InitCommunication: missing POSTID");
|
||||||
|
|
||||||
key = SystemPortAddressCreateIPCKey(address);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Enable this if you are trying to force the backend to run as if
|
* Enable this if you are trying to force the backend to run as if
|
||||||
* it is running under the postmaster.
|
* it is running under the postmaster.
|
||||||
@ -328,8 +332,11 @@ InitCommunication()
|
|||||||
* To enable emulation, run the following shell commands (in addition
|
* To enable emulation, run the following shell commands (in addition
|
||||||
* to enabling this goto)
|
* to enabling this goto)
|
||||||
*
|
*
|
||||||
* % setenv POSTID 1 % setenv POSTPORT 4321 % postmaster & % kill -9
|
* % setenv POSTID 1
|
||||||
* %1
|
* % setenv POSTPORT 4321
|
||||||
|
* % setenv IPC_KEY 4321000
|
||||||
|
* % postmaster &
|
||||||
|
* % kill -9 %1
|
||||||
*
|
*
|
||||||
* Upon doing this, Postmaster will have allocated the shared memory
|
* Upon doing this, Postmaster will have allocated the shared memory
|
||||||
* resources that Postgres will attach to if you enable
|
* resources that Postgres will attach to if you enable
|
||||||
|
Reference in New Issue
Block a user