diff options
Diffstat (limited to 'src/backend/storage/lmgr/proc.c')
-rw-r--r-- | src/backend/storage/lmgr/proc.c | 37 |
1 files changed, 21 insertions, 16 deletions
diff --git a/src/backend/storage/lmgr/proc.c b/src/backend/storage/lmgr/proc.c index ce29da90121..f15ae87659c 100644 --- a/src/backend/storage/lmgr/proc.c +++ b/src/backend/storage/lmgr/proc.c @@ -183,11 +183,12 @@ InitProcGlobal(void) /* * Create and initialize all the PGPROC structures we'll need. There are - * five separate consumers: (1) normal backends, (2) autovacuum workers - * and the autovacuum launcher, (3) background workers, (4) auxiliary - * processes, and (5) prepared transactions. Each PGPROC structure is - * dedicated to exactly one of these purposes, and they do not move - * between groups. + * six separate consumers: (1) normal backends, (2) autovacuum workers and + * special workers, (3) background workers, (4) walsenders, (5) auxiliary + * processes, and (6) prepared transactions. (For largely-historical + * reasons, we combine autovacuum and special workers into one category + * with a single freelist.) Each PGPROC structure is dedicated to exactly + * one of these purposes, and they do not move between groups. */ procs = (PGPROC *) ShmemAlloc(TotalProcs * sizeof(PGPROC)); MemSet(procs, 0, TotalProcs * sizeof(PGPROC)); @@ -229,12 +230,13 @@ InitProcGlobal(void) } /* - * Newly created PGPROCs for normal backends, autovacuum and bgworkers - * must be queued up on the appropriate free list. Because there can - * only ever be a small, fixed number of auxiliary processes, no free - * list is used in that case; InitAuxiliaryProcess() instead uses a - * linear search. PGPROCs for prepared transactions are added to a - * free list by TwoPhaseShmemInit(). + * Newly created PGPROCs for normal backends, autovacuum workers, + * special workers, bgworkers, and walsenders must be queued up on the + * appropriate free list. Because there can only ever be a small, + * fixed number of auxiliary processes, no free list is used in that + * case; InitAuxiliaryProcess() instead uses a linear search. PGPROCs + * for prepared transactions are added to a free list by + * TwoPhaseShmemInit(). */ if (i < MaxConnections) { @@ -242,13 +244,13 @@ InitProcGlobal(void) dlist_push_tail(&ProcGlobal->freeProcs, &proc->links); proc->procgloballist = &ProcGlobal->freeProcs; } - else if (i < MaxConnections + autovacuum_max_workers + 1) + else if (i < MaxConnections + autovacuum_max_workers + NUM_SPECIAL_WORKER_PROCS) { - /* PGPROC for AV launcher/worker, add to autovacFreeProcs list */ + /* PGPROC for AV or special worker, add to autovacFreeProcs list */ dlist_push_tail(&ProcGlobal->autovacFreeProcs, &proc->links); proc->procgloballist = &ProcGlobal->autovacFreeProcs; } - else if (i < MaxConnections + autovacuum_max_workers + 1 + max_worker_processes) + else if (i < MaxConnections + autovacuum_max_workers + NUM_SPECIAL_WORKER_PROCS + max_worker_processes) { /* PGPROC for bgworker, add to bgworkerFreeProcs list */ dlist_push_tail(&ProcGlobal->bgworkerFreeProcs, &proc->links); @@ -307,8 +309,11 @@ InitProcess(void) if (MyProc != NULL) elog(ERROR, "you already exist"); - /* Decide which list should supply our PGPROC. */ - if (AmAutoVacuumLauncherProcess() || AmAutoVacuumWorkerProcess()) + /* + * Decide which list should supply our PGPROC. This logic must match the + * way the freelists were constructed in InitProcGlobal(). + */ + if (AmAutoVacuumWorkerProcess() || AmSpecialWorkerProcess()) procgloballist = &ProcGlobal->autovacFreeProcs; else if (AmBackgroundWorkerProcess()) procgloballist = &ProcGlobal->bgworkerFreeProcs; |