mirror of
https://github.com/postgres/postgres.git
synced 2025-07-15 19:21:59 +03:00
Change the autovacuum launcher to read pg_database directly, rather than
via the "flat files" facility. This requires making it enough like a backend to be able to run transactions; it's no longer an "auxiliary process" but more like the autovacuum worker processes. Also, its signal handling has to be brought into line with backends/workers. In particular, since it now has to handle procsignal.c processing, the special autovac-launcher-only signal conditions are moved to SIGUSR2. Alvaro, with some cleanup from Tom
This commit is contained in:
@ -8,7 +8,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $PostgreSQL: pgsql/src/backend/storage/lmgr/proc.c,v 1.208 2009/08/12 20:53:30 tgl Exp $
|
||||
* $PostgreSQL: pgsql/src/backend/storage/lmgr/proc.c,v 1.209 2009/08/31 19:41:00 tgl Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@ -102,7 +102,7 @@ ProcGlobalShmemSize(void)
|
||||
size = add_size(size, sizeof(PROC_HDR));
|
||||
/* AuxiliaryProcs */
|
||||
size = add_size(size, mul_size(NUM_AUXILIARY_PROCS, sizeof(PGPROC)));
|
||||
/* MyProcs, including autovacuum */
|
||||
/* MyProcs, including autovacuum workers and launcher */
|
||||
size = add_size(size, mul_size(MaxBackends, sizeof(PGPROC)));
|
||||
/* ProcStructLock */
|
||||
size = add_size(size, sizeof(slock_t));
|
||||
@ -192,19 +192,27 @@ InitProcGlobal(void)
|
||||
ProcGlobal->freeProcs = &procs[i];
|
||||
}
|
||||
|
||||
procs = (PGPROC *) ShmemAlloc((autovacuum_max_workers) * sizeof(PGPROC));
|
||||
/*
|
||||
* Likewise for the PGPROCs reserved for autovacuum.
|
||||
*
|
||||
* Note: the "+1" here accounts for the autovac launcher
|
||||
*/
|
||||
procs = (PGPROC *) ShmemAlloc((autovacuum_max_workers + 1) * sizeof(PGPROC));
|
||||
if (!procs)
|
||||
ereport(FATAL,
|
||||
(errcode(ERRCODE_OUT_OF_MEMORY),
|
||||
errmsg("out of shared memory")));
|
||||
MemSet(procs, 0, autovacuum_max_workers * sizeof(PGPROC));
|
||||
for (i = 0; i < autovacuum_max_workers; i++)
|
||||
MemSet(procs, 0, (autovacuum_max_workers + 1) * sizeof(PGPROC));
|
||||
for (i = 0; i < autovacuum_max_workers + 1; i++)
|
||||
{
|
||||
PGSemaphoreCreate(&(procs[i].sem));
|
||||
procs[i].links.next = (SHM_QUEUE *) ProcGlobal->autovacFreeProcs;
|
||||
ProcGlobal->autovacFreeProcs = &procs[i];
|
||||
}
|
||||
|
||||
/*
|
||||
* And auxiliary procs.
|
||||
*/
|
||||
MemSet(AuxiliaryProcs, 0, NUM_AUXILIARY_PROCS * sizeof(PGPROC));
|
||||
for (i = 0; i < NUM_AUXILIARY_PROCS; i++)
|
||||
{
|
||||
@ -248,14 +256,14 @@ InitProcess(void)
|
||||
|
||||
set_spins_per_delay(procglobal->spins_per_delay);
|
||||
|
||||
if (IsAutoVacuumWorkerProcess())
|
||||
if (IsAnyAutoVacuumProcess())
|
||||
MyProc = procglobal->autovacFreeProcs;
|
||||
else
|
||||
MyProc = procglobal->freeProcs;
|
||||
|
||||
if (MyProc != NULL)
|
||||
{
|
||||
if (IsAutoVacuumWorkerProcess())
|
||||
if (IsAnyAutoVacuumProcess())
|
||||
procglobal->autovacFreeProcs = (PGPROC *) MyProc->links.next;
|
||||
else
|
||||
procglobal->freeProcs = (PGPROC *) MyProc->links.next;
|
||||
@ -278,9 +286,10 @@ InitProcess(void)
|
||||
/*
|
||||
* Now that we have a PGPROC, mark ourselves as an active postmaster
|
||||
* child; this is so that the postmaster can detect it if we exit without
|
||||
* cleaning up.
|
||||
* cleaning up. (XXX autovac launcher currently doesn't participate in
|
||||
* this; it probably should.)
|
||||
*/
|
||||
if (IsUnderPostmaster)
|
||||
if (IsUnderPostmaster && !IsAutoVacuumLauncherProcess())
|
||||
MarkPostmasterChildActive();
|
||||
|
||||
/*
|
||||
@ -299,6 +308,7 @@ InitProcess(void)
|
||||
MyProc->roleId = InvalidOid;
|
||||
MyProc->inCommit = false;
|
||||
MyProc->vacuumFlags = 0;
|
||||
/* NB -- autovac launcher intentionally does not set IS_AUTOVACUUM */
|
||||
if (IsAutoVacuumWorkerProcess())
|
||||
MyProc->vacuumFlags |= PROC_IS_AUTOVACUUM;
|
||||
MyProc->lwWaiting = false;
|
||||
@ -429,7 +439,6 @@ InitAuxiliaryProcess(void)
|
||||
MyProc->databaseId = InvalidOid;
|
||||
MyProc->roleId = InvalidOid;
|
||||
MyProc->inCommit = false;
|
||||
/* we don't set the "is autovacuum" flag in the launcher */
|
||||
MyProc->vacuumFlags = 0;
|
||||
MyProc->lwWaiting = false;
|
||||
MyProc->lwExclusive = false;
|
||||
@ -595,8 +604,8 @@ ProcKill(int code, Datum arg)
|
||||
|
||||
SpinLockAcquire(ProcStructLock);
|
||||
|
||||
/* Return PGPROC structure (and semaphore) to freelist */
|
||||
if (IsAutoVacuumWorkerProcess())
|
||||
/* Return PGPROC structure (and semaphore) to appropriate freelist */
|
||||
if (IsAnyAutoVacuumProcess())
|
||||
{
|
||||
MyProc->links.next = (SHM_QUEUE *) procglobal->autovacFreeProcs;
|
||||
procglobal->autovacFreeProcs = MyProc;
|
||||
@ -618,13 +627,14 @@ ProcKill(int code, Datum arg)
|
||||
/*
|
||||
* This process is no longer present in shared memory in any meaningful
|
||||
* way, so tell the postmaster we've cleaned up acceptably well.
|
||||
* (XXX autovac launcher should be included here someday)
|
||||
*/
|
||||
if (IsUnderPostmaster)
|
||||
if (IsUnderPostmaster && !IsAutoVacuumLauncherProcess())
|
||||
MarkPostmasterChildInactive();
|
||||
|
||||
/* wake autovac launcher if needed -- see comments in FreeWorkerInfo */
|
||||
if (AutovacuumLauncherPid != 0)
|
||||
kill(AutovacuumLauncherPid, SIGUSR1);
|
||||
kill(AutovacuumLauncherPid, SIGUSR2);
|
||||
}
|
||||
|
||||
/*
|
||||
|
Reference in New Issue
Block a user