mirror of https://github.com/postgres/postgres
After the preceding commits the auxprocess code is independent from bootstrap.c - so a dedicated file seems less confusing. Author: Andres Freund <andres@anarazel.de> Reviewed-By: Kyotaro Horiguchi <horikyota.ntt@gmail.com> Reviewed-By: Robert Haas <robertmhaas@gmail.com> Discussion: https://postgr.es/m/20210802164124.ufo5buo4apl6yuvs@alap3.anarazel.depull/68/head
parent
27f7903466
commit
0a692109dc
@ -0,0 +1,194 @@ |
||||
/*-------------------------------------------------------------------------
|
||||
* auxprocess.c |
||||
* functions related to auxiliary processes. |
||||
* |
||||
* |
||||
* Portions Copyright (c) 1996-2021, PostgreSQL Global Development Group |
||||
* Portions Copyright (c) 1994, Regents of the University of California |
||||
* |
||||
* IDENTIFICATION |
||||
* src/backend/postmaster/auxprocess.c |
||||
*------------------------------------------------------------------------- |
||||
*/ |
||||
#include "postgres.h" |
||||
|
||||
#include <unistd.h> |
||||
#include <signal.h> |
||||
|
||||
#include "libpq/pqsignal.h" |
||||
#include "miscadmin.h" |
||||
#include "pgstat.h" |
||||
#include "postmaster/auxprocess.h" |
||||
#include "postmaster/bgwriter.h" |
||||
#include "postmaster/startup.h" |
||||
#include "postmaster/walwriter.h" |
||||
#include "replication/walreceiver.h" |
||||
#include "storage/bufmgr.h" |
||||
#include "storage/bufpage.h" |
||||
#include "storage/condition_variable.h" |
||||
#include "storage/ipc.h" |
||||
#include "storage/proc.h" |
||||
#include "tcop/tcopprot.h" |
||||
#include "utils/memutils.h" |
||||
#include "utils/ps_status.h" |
||||
#include "utils/rel.h" |
||||
|
||||
|
||||
static void ShutdownAuxiliaryProcess(int code, Datum arg); |
||||
|
||||
|
||||
/* ----------------
|
||||
* global variables |
||||
* ---------------- |
||||
*/ |
||||
|
||||
AuxProcType MyAuxProcType = NotAnAuxProcess; /* declared in miscadmin.h */ |
||||
|
||||
|
||||
/*
|
||||
* AuxiliaryProcessMain |
||||
* |
||||
* The main entry point for auxiliary processes, such as the bgwriter, |
||||
* walwriter, walreceiver, bootstrapper and the shared memory checker code. |
||||
* |
||||
* This code is here just because of historical reasons. |
||||
*/ |
||||
void |
||||
AuxiliaryProcessMain(AuxProcType auxtype) |
||||
{ |
||||
Assert(IsUnderPostmaster); |
||||
|
||||
MyAuxProcType = auxtype; |
||||
|
||||
switch (MyAuxProcType) |
||||
{ |
||||
case StartupProcess: |
||||
MyBackendType = B_STARTUP; |
||||
break; |
||||
case ArchiverProcess: |
||||
MyBackendType = B_ARCHIVER; |
||||
break; |
||||
case BgWriterProcess: |
||||
MyBackendType = B_BG_WRITER; |
||||
break; |
||||
case CheckpointerProcess: |
||||
MyBackendType = B_CHECKPOINTER; |
||||
break; |
||||
case WalWriterProcess: |
||||
MyBackendType = B_WAL_WRITER; |
||||
break; |
||||
case WalReceiverProcess: |
||||
MyBackendType = B_WAL_RECEIVER; |
||||
break; |
||||
default: |
||||
elog(ERROR, "something has gone wrong"); |
||||
MyBackendType = B_INVALID; |
||||
} |
||||
|
||||
init_ps_display(NULL); |
||||
|
||||
SetProcessingMode(BootstrapProcessing); |
||||
IgnoreSystemIndexes = true; |
||||
|
||||
BaseInit(); |
||||
|
||||
/*
|
||||
* As an auxiliary process, we aren't going to do the full InitPostgres |
||||
* pushups, but there are a couple of things that need to get lit up even |
||||
* in an auxiliary process. |
||||
*/ |
||||
|
||||
/*
|
||||
* Create a PGPROC so we can use LWLocks. In the EXEC_BACKEND case, this |
||||
* was already done by SubPostmasterMain(). |
||||
*/ |
||||
#ifndef EXEC_BACKEND |
||||
InitAuxiliaryProcess(); |
||||
#endif |
||||
|
||||
/*
|
||||
* Assign the ProcSignalSlot for an auxiliary process. Since it doesn't |
||||
* have a BackendId, the slot is statically allocated based on the |
||||
* auxiliary process type (MyAuxProcType). Backends use slots indexed in |
||||
* the range from 1 to MaxBackends (inclusive), so we use MaxBackends + |
||||
* AuxProcType + 1 as the index of the slot for an auxiliary process. |
||||
* |
||||
* This will need rethinking if we ever want more than one of a particular |
||||
* auxiliary process type. |
||||
*/ |
||||
ProcSignalInit(MaxBackends + MyAuxProcType + 1); |
||||
|
||||
/* finish setting up bufmgr.c */ |
||||
InitBufferPoolBackend(); |
||||
|
||||
/*
|
||||
* Auxiliary processes don't run transactions, but they may need a |
||||
* resource owner anyway to manage buffer pins acquired outside |
||||
* transactions (and, perhaps, other things in future). |
||||
*/ |
||||
CreateAuxProcessResourceOwner(); |
||||
|
||||
/* Initialize statistics reporting */ |
||||
pgstat_initialize(); |
||||
|
||||
/* Initialize backend status information */ |
||||
pgstat_beinit(); |
||||
pgstat_bestart(); |
||||
|
||||
/* register a before-shutdown callback for LWLock cleanup */ |
||||
before_shmem_exit(ShutdownAuxiliaryProcess, 0); |
||||
|
||||
SetProcessingMode(NormalProcessing); |
||||
|
||||
switch (MyAuxProcType) |
||||
{ |
||||
case CheckerProcess: |
||||
case BootstrapProcess: |
||||
pg_unreachable(); |
||||
break; |
||||
|
||||
case StartupProcess: |
||||
StartupProcessMain(); |
||||
proc_exit(1); |
||||
|
||||
case ArchiverProcess: |
||||
PgArchiverMain(); |
||||
proc_exit(1); |
||||
|
||||
case BgWriterProcess: |
||||
BackgroundWriterMain(); |
||||
proc_exit(1); |
||||
|
||||
case CheckpointerProcess: |
||||
CheckpointerMain(); |
||||
proc_exit(1); |
||||
|
||||
case WalWriterProcess: |
||||
InitXLOGAccess(); |
||||
WalWriterMain(); |
||||
proc_exit(1); |
||||
|
||||
case WalReceiverProcess: |
||||
WalReceiverMain(); |
||||
proc_exit(1); |
||||
|
||||
default: |
||||
elog(PANIC, "unrecognized process type: %d", (int) MyAuxProcType); |
||||
proc_exit(1); |
||||
} |
||||
} |
||||
|
||||
/*
|
||||
* Begin shutdown of an auxiliary process. This is approximately the equivalent |
||||
* of ShutdownPostgres() in postinit.c. We can't run transactions in an |
||||
* auxiliary process, so most of the work of AbortTransaction() is not needed, |
||||
* but we do need to make sure we've released any LWLocks we are holding. |
||||
* (This is only critical during an error exit.) |
||||
*/ |
||||
static void |
||||
ShutdownAuxiliaryProcess(int code, Datum arg) |
||||
{ |
||||
LWLockReleaseAll(); |
||||
ConditionVariableCancelSleep(); |
||||
pgstat_report_wait_end(); |
||||
} |
@ -0,0 +1,20 @@ |
||||
/*-------------------------------------------------------------------------
|
||||
* auxprocess.h |
||||
* include file for functions related to auxiliary processes. |
||||
* |
||||
* |
||||
* Portions Copyright (c) 1996-2021, PostgreSQL Global Development Group |
||||
* Portions Copyright (c) 1994, Regents of the University of California |
||||
* |
||||
* IDENTIFICATION |
||||
* src/include/postmaster/auxprocess.h |
||||
*------------------------------------------------------------------------- |
||||
*/ |
||||
#ifndef AUXPROCESS_H |
||||
#define AUXPROCESS_H |
||||
|
||||
#include "miscadmin.h" |
||||
|
||||
extern void AuxiliaryProcessMain(AuxProcType auxtype) pg_attribute_noreturn(); |
||||
|
||||
#endif /* AUXPROCESS_H */ |
Loading…
Reference in new issue