mirror of
https://github.com/postgres/postgres.git
synced 2025-08-27 07:42:10 +03:00
Rearrange handling of MAXBACKENDS a little bit. The default setting
of MAXBACKENDS is now 1024, since all it's costing is about 32 bytes of memory per array slot. configure's --with-maxbackends switch now controls DEF_MAXBACKENDS which is simply the default value of the postmaster's -N switch. Thus, the out-of-the-box configuration will still limit you to 64 backends, but you can go up to 1024 backends simply by restarting the postmaster with a different -N switch --- no rebuild required.
This commit is contained in:
@@ -7,7 +7,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/backend/storage/ipc/ipc.c,v 1.35 1999/02/13 23:18:09 momjian Exp $
|
||||
* $Header: /cvsroot/pgsql/src/backend/storage/ipc/ipc.c,v 1.36 1999/02/21 01:41:44 tgl Exp $
|
||||
*
|
||||
* NOTES
|
||||
*
|
||||
@@ -677,9 +677,10 @@ struct ipcdummy
|
||||
SLock *free;
|
||||
int unused;
|
||||
slock_t memlock;
|
||||
SLock slocks[NSLOCKS];
|
||||
SLock slocks[MAX_SPINS + 1];
|
||||
};
|
||||
static int SLockMemorySize = sizeof(struct ipcdummy);
|
||||
|
||||
#define SLOCKMEMORYSIZE sizeof(struct ipcdummy)
|
||||
|
||||
void
|
||||
CreateAndInitSLockMemory(IPCKey key)
|
||||
@@ -688,7 +689,7 @@ CreateAndInitSLockMemory(IPCKey key)
|
||||
SLock *slckP;
|
||||
|
||||
SLockMemoryId = IpcMemoryCreate(key,
|
||||
SLockMemorySize,
|
||||
SLOCKMEMORYSIZE,
|
||||
0700);
|
||||
AttachSLockMemory(key);
|
||||
*FreeSLockPP = NULL;
|
||||
@@ -713,7 +714,7 @@ AttachSLockMemory(IPCKey key)
|
||||
struct ipcdummy *slockM;
|
||||
|
||||
if (SLockMemoryId == -1)
|
||||
SLockMemoryId = IpcMemoryIdGet(key, SLockMemorySize);
|
||||
SLockMemoryId = IpcMemoryIdGet(key, SLOCKMEMORYSIZE);
|
||||
if (SLockMemoryId == -1)
|
||||
elog(FATAL, "SLockMemory not in shared memory");
|
||||
slockM = (struct ipcdummy *) IpcMemoryAttach(SLockMemoryId);
|
||||
|
@@ -7,7 +7,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/backend/storage/ipc/ipci.c,v 1.20 1999/02/19 07:10:47 tgl Exp $
|
||||
* $Header: /cvsroot/pgsql/src/backend/storage/ipc/ipci.c,v 1.21 1999/02/21 01:41:44 tgl Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@@ -72,7 +72,7 @@ CreateSharedMemoryAndSemaphores(IPCKey key, int maxBackends)
|
||||
* ----------------
|
||||
*/
|
||||
CreateSpinlocks(IPCKeyGetSpinLockSemaphoreKey(key));
|
||||
size = BufferShmemSize() + LockShmemSize();
|
||||
size = BufferShmemSize() + LockShmemSize(maxBackends);
|
||||
|
||||
#ifdef STABLE_MEMORY_STORAGE
|
||||
size += MMShmemSize();
|
||||
@@ -113,15 +113,13 @@ CreateSharedMemoryAndSemaphores(IPCKey key, int maxBackends)
|
||||
void
|
||||
AttachSharedMemoryAndSemaphores(IPCKey key)
|
||||
{
|
||||
int size;
|
||||
|
||||
/* ----------------
|
||||
* create rather than attach if using private key
|
||||
* ----------------
|
||||
*/
|
||||
if (key == PrivateIPCKey)
|
||||
{
|
||||
CreateSharedMemoryAndSemaphores(key, 1);
|
||||
CreateSharedMemoryAndSemaphores(key, 16);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -136,8 +134,7 @@ AttachSharedMemoryAndSemaphores(IPCKey key)
|
||||
* attach the buffer manager buffer pool (and semaphore)
|
||||
* ----------------
|
||||
*/
|
||||
size = BufferShmemSize() + LockShmemSize();
|
||||
InitShmem(key, size);
|
||||
InitShmem(key, 0);
|
||||
InitBufferPool(key);
|
||||
|
||||
/* ----------------
|
||||
|
@@ -7,7 +7,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/backend/storage/lmgr/lock.c,v 1.42 1999/02/19 06:06:06 tgl Exp $
|
||||
* $Header: /cvsroot/pgsql/src/backend/storage/lmgr/lock.c,v 1.43 1999/02/21 01:41:46 tgl Exp $
|
||||
*
|
||||
* NOTES
|
||||
* Outside modules can create a lock table and acquire/release
|
||||
@@ -1478,36 +1478,37 @@ next_item:
|
||||
}
|
||||
|
||||
int
|
||||
LockShmemSize()
|
||||
LockShmemSize(int maxBackends)
|
||||
{
|
||||
int size = 0;
|
||||
int nLockEnts = NLOCKENTS(maxBackends);
|
||||
int nLockBuckets,
|
||||
nLockSegs;
|
||||
int nXidBuckets,
|
||||
nXidSegs;
|
||||
|
||||
nLockBuckets = 1 << (int) my_log2((NLOCKENTS - 1) / DEF_FFACTOR + 1);
|
||||
nLockBuckets = 1 << (int) my_log2((nLockEnts - 1) / DEF_FFACTOR + 1);
|
||||
nLockSegs = 1 << (int) my_log2((nLockBuckets - 1) / DEF_SEGSIZE + 1);
|
||||
|
||||
nXidBuckets = 1 << (int) my_log2((NLOCKS_PER_XACT - 1) / DEF_FFACTOR + 1);
|
||||
nXidSegs = 1 << (int) my_log2((nLockBuckets - 1) / DEF_SEGSIZE + 1);
|
||||
|
||||
size += MAXALIGN(MAXBACKENDS * sizeof(PROC)); /* each MyProc */
|
||||
size += MAXALIGN(MAXBACKENDS * sizeof(LOCKMETHODCTL)); /* each
|
||||
size += MAXALIGN(maxBackends * sizeof(PROC)); /* each MyProc */
|
||||
size += MAXALIGN(maxBackends * sizeof(LOCKMETHODCTL)); /* each
|
||||
* lockMethodTable->ctl */
|
||||
size += MAXALIGN(sizeof(PROC_HDR)); /* ProcGlobal */
|
||||
|
||||
size += MAXALIGN(my_log2(NLOCKENTS) * sizeof(void *));
|
||||
size += MAXALIGN(my_log2(nLockEnts) * sizeof(void *));
|
||||
size += MAXALIGN(sizeof(HHDR));
|
||||
size += nLockSegs * MAXALIGN(DEF_SEGSIZE * sizeof(SEGMENT));
|
||||
size += NLOCKENTS * /* XXX not multiple of BUCKET_ALLOC_INCR? */
|
||||
size += nLockEnts * /* XXX not multiple of BUCKET_ALLOC_INCR? */
|
||||
(MAXALIGN(sizeof(BUCKET_INDEX)) +
|
||||
MAXALIGN(sizeof(LOCK))); /* contains hash key */
|
||||
|
||||
size += MAXALIGN(my_log2(MAXBACKENDS) * sizeof(void *));
|
||||
size += MAXALIGN(my_log2(maxBackends) * sizeof(void *));
|
||||
size += MAXALIGN(sizeof(HHDR));
|
||||
size += nXidSegs * MAXALIGN(DEF_SEGSIZE * sizeof(SEGMENT));
|
||||
size += MAXBACKENDS * /* XXX not multiple of BUCKET_ALLOC_INCR? */
|
||||
size += maxBackends * /* XXX not multiple of BUCKET_ALLOC_INCR? */
|
||||
(MAXALIGN(sizeof(BUCKET_INDEX)) +
|
||||
MAXALIGN(sizeof(XIDLookupEnt))); /* contains hash key */
|
||||
|
||||
@@ -1673,8 +1674,8 @@ DeadLockCheck(SHM_QUEUE *lockQueue, LOCK *findlock, bool skip_check)
|
||||
break;
|
||||
if (j >= nprocs && lock != findlock)
|
||||
{
|
||||
Assert(nprocs < MAXBACKENDS);
|
||||
checked_procs[nprocs++] = proc;
|
||||
Assert(nprocs <= MAXBACKENDS);
|
||||
|
||||
/*
|
||||
* For non-MyProc entries, we are looking only
|
||||
|
@@ -7,7 +7,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/backend/storage/lmgr/proc.c,v 1.50 1999/02/19 07:10:48 tgl Exp $
|
||||
* $Header: /cvsroot/pgsql/src/backend/storage/lmgr/proc.c,v 1.51 1999/02/21 01:41:45 tgl Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@@ -46,7 +46,7 @@
|
||||
* This is so that we can support more backends. (system-wide semaphore
|
||||
* sets run out pretty fast.) -ay 4/95
|
||||
*
|
||||
* $Header: /cvsroot/pgsql/src/backend/storage/lmgr/proc.c,v 1.50 1999/02/19 07:10:48 tgl Exp $
|
||||
* $Header: /cvsroot/pgsql/src/backend/storage/lmgr/proc.c,v 1.51 1999/02/21 01:41:45 tgl Exp $
|
||||
*/
|
||||
#include <sys/time.h>
|
||||
#include <unistd.h>
|
||||
@@ -154,23 +154,28 @@ InitProcGlobal(IPCKey key, int maxBackends)
|
||||
*/
|
||||
on_shmem_exit(ProcFreeAllSemaphores, NULL);
|
||||
|
||||
/* Pre-create the semaphores for the first maxBackends processes */
|
||||
for (i = 0;
|
||||
i < (maxBackends+PROC_NSEMS_PER_SET-1) / PROC_NSEMS_PER_SET;
|
||||
i++)
|
||||
/* Pre-create the semaphores for the first maxBackends processes,
|
||||
* unless we are running as a standalone backend.
|
||||
*/
|
||||
if (key != PrivateIPCKey)
|
||||
{
|
||||
IPCKey semKey = ProcGlobal->currKey + i;
|
||||
int semId;
|
||||
int semstat;
|
||||
for (i = 0;
|
||||
i < (maxBackends+PROC_NSEMS_PER_SET-1) / PROC_NSEMS_PER_SET;
|
||||
i++)
|
||||
{
|
||||
IPCKey semKey = ProcGlobal->currKey + i;
|
||||
int semId;
|
||||
int semstat;
|
||||
|
||||
semId = IpcSemaphoreCreate(semKey,
|
||||
PROC_NSEMS_PER_SET,
|
||||
IPCProtection,
|
||||
IpcSemaphoreDefaultStartValue,
|
||||
0,
|
||||
&semstat);
|
||||
/* mark this sema set allocated */
|
||||
ProcGlobal->freeSemMap[i] = (1 << PROC_NSEMS_PER_SET);
|
||||
semId = IpcSemaphoreCreate(semKey,
|
||||
PROC_NSEMS_PER_SET,
|
||||
IPCProtection,
|
||||
IpcSemaphoreDefaultStartValue,
|
||||
0,
|
||||
&semstat);
|
||||
/* mark this sema set allocated */
|
||||
ProcGlobal->freeSemMap[i] = (1 << PROC_NSEMS_PER_SET);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user