Line data Source code
1 : /*------------------------------------------------------------------------- 2 : * auxprocess.c 3 : * functions related to auxiliary processes. 4 : * 5 : * 6 : * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group 7 : * Portions Copyright (c) 1994, Regents of the University of California 8 : * 9 : * IDENTIFICATION 10 : * src/backend/postmaster/auxprocess.c 11 : *------------------------------------------------------------------------- 12 : */ 13 : #include "postgres.h" 14 : 15 : #include <unistd.h> 16 : #include <signal.h> 17 : 18 : #include "miscadmin.h" 19 : #include "pgstat.h" 20 : #include "postmaster/auxprocess.h" 21 : #include "storage/condition_variable.h" 22 : #include "storage/ipc.h" 23 : #include "storage/proc.h" 24 : #include "storage/procsignal.h" 25 : #include "utils/memutils.h" 26 : #include "utils/ps_status.h" 27 : 28 : 29 : static void ShutdownAuxiliaryProcess(int code, Datum arg); 30 : 31 : 32 : /* 33 : * AuxiliaryProcessMainCommon 34 : * 35 : * Common initialization code for auxiliary processes, such as the bgwriter, 36 : * walwriter, walreceiver, and the startup process. 37 : */ 38 : void 39 4464 : AuxiliaryProcessMainCommon(void) 40 : { 41 : Assert(IsUnderPostmaster); 42 : 43 : /* Release postmaster's working memory context */ 44 4464 : if (PostmasterContext) 45 : { 46 4464 : MemoryContextDelete(PostmasterContext); 47 4464 : PostmasterContext = NULL; 48 : } 49 : 50 4464 : init_ps_display(NULL); 51 : 52 : Assert(GetProcessingMode() == InitProcessing); 53 : 54 4464 : IgnoreSystemIndexes = true; 55 : 56 : /* 57 : * As an auxiliary process, we aren't going to do the full InitPostgres 58 : * pushups, but there are a couple of things that need to get lit up even 59 : * in an auxiliary process. 60 : */ 61 : 62 : /* 63 : * Create a PGPROC so we can use LWLocks and access shared memory. 64 : */ 65 4464 : InitAuxiliaryProcess(); 66 : 67 4464 : BaseInit(); 68 : 69 4464 : ProcSignalInit(false, 0); 70 : 71 : /* 72 : * Auxiliary processes don't run transactions, but they may need a 73 : * resource owner anyway to manage buffer pins acquired outside 74 : * transactions (and, perhaps, other things in future). 75 : */ 76 4464 : CreateAuxProcessResourceOwner(); 77 : 78 : 79 : /* Initialize backend status information */ 80 4464 : pgstat_beinit(); 81 4464 : pgstat_bestart(); 82 : 83 : /* register a before-shutdown callback for LWLock cleanup */ 84 4464 : before_shmem_exit(ShutdownAuxiliaryProcess, 0); 85 : 86 4464 : SetProcessingMode(NormalProcessing); 87 4464 : } 88 : 89 : /* 90 : * Begin shutdown of an auxiliary process. This is approximately the equivalent 91 : * of ShutdownPostgres() in postinit.c. We can't run transactions in an 92 : * auxiliary process, so most of the work of AbortTransaction() is not needed, 93 : * but we do need to make sure we've released any LWLocks we are holding. 94 : * (This is only critical during an error exit.) 95 : */ 96 : static void 97 4464 : ShutdownAuxiliaryProcess(int code, Datum arg) 98 : { 99 4464 : LWLockReleaseAll(); 100 4464 : ConditionVariableCancelSleep(); 101 4464 : pgstat_report_wait_end(); 102 4464 : }