mirror of
https://github.com/postgres/postgres.git
synced 2025-11-19 13:42:17 +03:00
pgstat_bestart(), used post-authentication to set up a backend entry in the PgBackendStatus array, so as its data becomes visible in pg_stat_activity and related catalogs, has its logic divided into three routines with this commit, called in order at different steps of the backend initialization: * pgstat_bestart_initial() sets up the backend entry with a minimal amount of information, reporting it with a new BackendState called STATE_STARTING while waiting for backend initialization and client authentication to complete. The main benefit that this offers is observability, so as it is possible to monitor the backend activity during authentication. This step happens earlier than in the logic prior to this commit. pgstat_beinit() happens earlier as well, before authentication. * pgstat_bestart_security() reports the SSL/GSS status of the connection, once authentication completes. Auxiliary processes, for example, do not need to call this step, hence it is optional. This step is called after performing authentication, same as previously. * pgstat_bestart_final() reports the user and database IDs, takes the entry out of STATE_STARTING, and reports its application_name. This is called as the last step of the three, once authentication completes. An injection point is added, with a test checking that the "starting" phase of a backend entry is visible in pg_stat_activity. Some follow-up patches are planned to take advantage of this refactoring with more information provided in backend entries during authentication (LDAP hanging was a problem for the author, initially). Author: Jacob Champion <jacob.champion@enterprisedb.com> Reviewed-by: Michael Paquier <michael@paquier.xyz> Reviewed-by: Andres Freund <andres@anarazel.de> Discussion: https://postgr.es/m/CAOYmi+=60deN20WDyCoHCiecgivJxr=98s7s7-C8SkXwrCfHXg@mail.gmail.com
104 lines
2.6 KiB
C
104 lines
2.6 KiB
C
/*-------------------------------------------------------------------------
|
|
* auxprocess.c
|
|
* functions related to auxiliary processes.
|
|
*
|
|
*
|
|
* Portions Copyright (c) 1996-2025, 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 "miscadmin.h"
|
|
#include "pgstat.h"
|
|
#include "postmaster/auxprocess.h"
|
|
#include "storage/condition_variable.h"
|
|
#include "storage/ipc.h"
|
|
#include "storage/proc.h"
|
|
#include "storage/procsignal.h"
|
|
#include "utils/memutils.h"
|
|
#include "utils/ps_status.h"
|
|
|
|
|
|
static void ShutdownAuxiliaryProcess(int code, Datum arg);
|
|
|
|
|
|
/*
|
|
* AuxiliaryProcessMainCommon
|
|
*
|
|
* Common initialization code for auxiliary processes, such as the bgwriter,
|
|
* walwriter, walreceiver, and the startup process.
|
|
*/
|
|
void
|
|
AuxiliaryProcessMainCommon(void)
|
|
{
|
|
Assert(IsUnderPostmaster);
|
|
|
|
/* Release postmaster's working memory context */
|
|
if (PostmasterContext)
|
|
{
|
|
MemoryContextDelete(PostmasterContext);
|
|
PostmasterContext = NULL;
|
|
}
|
|
|
|
init_ps_display(NULL);
|
|
|
|
Assert(GetProcessingMode() == InitProcessing);
|
|
|
|
IgnoreSystemIndexes = true;
|
|
|
|
/*
|
|
* 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 and access shared memory.
|
|
*/
|
|
InitAuxiliaryProcess();
|
|
|
|
BaseInit();
|
|
|
|
ProcSignalInit(false, 0);
|
|
|
|
/*
|
|
* 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 backend status information */
|
|
pgstat_beinit();
|
|
pgstat_bestart_initial();
|
|
pgstat_bestart_final();
|
|
|
|
/* register a before-shutdown callback for LWLock cleanup */
|
|
before_shmem_exit(ShutdownAuxiliaryProcess, 0);
|
|
|
|
SetProcessingMode(NormalProcessing);
|
|
}
|
|
|
|
/*
|
|
* 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();
|
|
}
|