Apply Bryan's IPC Patches

From: Bryan Henderson <bryanh@giraffe.netgate.net>
This commit is contained in:
Marc G. Fournier 1997-11-17 03:47:31 +00:00
parent 930bce33db
commit 9bcf350cc7
2 changed files with 56 additions and 19 deletions

View File

@ -10,7 +10,7 @@
*
*
* 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
*
@ -123,6 +123,32 @@ static Dllist *PortList;
static short PostPortName = -1;
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 char *progname = (char *) NULL;
@ -904,11 +930,11 @@ ConnCreate(int serverFd, int *newFdP)
static void
reset_shared(short port)
{
IPCKey key;
key = SystemPortAddressCreateIPCKey((SystemPortAddress) port);
CreateSharedMemoryAndSemaphores(key);
ActiveBackends = FALSE;
ipc_key = port * 1000 + shmem_seq * 100;
CreateSharedMemoryAndSemaphores(ipc_key);
ActiveBackends = FALSE;
shmem_seq += 1;
if (shmem_seq >= 10) shmem_seq -= 10;
}
/*
@ -1079,9 +1105,10 @@ BackendStartup(StartupInfo *packet, /* client's startup packet */
Backend *bn; /* for backend cleanup */
int pid,
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);
}
@ -1101,6 +1128,9 @@ BackendStartup(StartupInfo *packet, /* client's startup packet */
sprintf(envEntry[3], "PGDATA=%s", DataDir);
putenv(envEntry[3]);
}
sprintf(envEntry[4], "IPC_KEY=%d", ipc_key);
putenv(envEntry[4]);
if (DebugLvl > 2)
{
char **p;

View File

@ -7,7 +7,7 @@
*
*
* 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
* InitPostgres() is the function called from PostgresMain
@ -281,8 +281,9 @@ InitUserid()
static void
InitCommunication()
{
char *postid;
char *postport;
char *postid; /* value of environment variable */
char *postport; /* value of environment variable */
char *ipc_key; /* value of environemnt variable */
IPCKey key = 0;
/* ----------------
@ -302,10 +303,15 @@ InitCommunication()
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");
if (PointerIsValid(postport))
@ -315,8 +321,6 @@ InitCommunication()
if (MyBackendTag == -1)
elog(FATAL, "InitCommunication: missing POSTID");
key = SystemPortAddressCreateIPCKey(address);
/*
* Enable this if you are trying to force the backend to run as if
* it is running under the postmaster.
@ -328,8 +332,11 @@ InitCommunication()
* To enable emulation, run the following shell commands (in addition
* to enabling this goto)
*
* % setenv POSTID 1 % setenv POSTPORT 4321 % postmaster & % kill -9
* %1
* % setenv POSTID 1
* % setenv POSTPORT 4321
* % setenv IPC_KEY 4321000
* % postmaster &
* % kill -9 %1
*
* Upon doing this, Postmaster will have allocated the shared memory
* resources that Postgres will attach to if you enable