Coverage Report

Created: 2025-06-13 06:06

/src/postgres/src/backend/postmaster/auxprocess.c
Line
Count
Source (jump to first uncovered line)
1
/*-------------------------------------------------------------------------
2
 * auxprocess.c
3
 *    functions related to auxiliary processes.
4
 *
5
 *
6
 * Portions Copyright (c) 1996-2025, 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
AuxiliaryProcessMainCommon(void)
40
0
{
41
0
  Assert(IsUnderPostmaster);
42
43
  /* Release postmaster's working memory context */
44
0
  if (PostmasterContext)
45
0
  {
46
0
    MemoryContextDelete(PostmasterContext);
47
0
    PostmasterContext = NULL;
48
0
  }
49
50
0
  init_ps_display(NULL);
51
52
0
  Assert(GetProcessingMode() == InitProcessing);
53
54
0
  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
0
  InitAuxiliaryProcess();
66
67
0
  BaseInit();
68
69
0
  ProcSignalInit(NULL, 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
0
  CreateAuxProcessResourceOwner();
77
78
79
  /* Initialize backend status information */
80
0
  pgstat_beinit();
81
0
  pgstat_bestart_initial();
82
0
  pgstat_bestart_final();
83
84
  /* register a before-shutdown callback for LWLock cleanup */
85
0
  before_shmem_exit(ShutdownAuxiliaryProcess, 0);
86
87
0
  SetProcessingMode(NormalProcessing);
88
0
}
89
90
/*
91
 * Begin shutdown of an auxiliary process.  This is approximately the equivalent
92
 * of ShutdownPostgres() in postinit.c.  We can't run transactions in an
93
 * auxiliary process, so most of the work of AbortTransaction() is not needed,
94
 * but we do need to make sure we've released any LWLocks we are holding.
95
 * (This is only critical during an error exit.)
96
 */
97
static void
98
ShutdownAuxiliaryProcess(int code, Datum arg)
99
0
{
100
0
  LWLockReleaseAll();
101
0
  ConditionVariableCancelSleep();
102
0
  pgstat_report_wait_end();
103
0
}