2021-08-05 21:09:19 +02:00
|
|
|
/*-------------------------------------------------------------------------
|
|
|
|
* auxprocess.c
|
|
|
|
* functions related to auxiliary processes.
|
|
|
|
*
|
|
|
|
*
|
2024-01-04 02:49:05 +01:00
|
|
|
* Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group
|
2021-08-05 21:09:19 +02:00
|
|
|
* 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 "postmaster/bgwriter.h"
|
|
|
|
#include "postmaster/startup.h"
|
Add a new WAL summarizer process.
When active, this process writes WAL summary files to
$PGDATA/pg_wal/summaries. Each summary file contains information for a
certain range of LSNs on a certain TLI. For each relation, it stores a
"limit block" which is 0 if a relation is created or destroyed within
a certain range of WAL records, or otherwise the shortest length to
which the relation was truncated during that range of WAL records, or
otherwise InvalidBlockNumber. In addition, it stores a list of blocks
which have been modified during that range of WAL records, but
excluding blocks which were removed by truncation after they were
modified and never subsequently modified again.
In other words, it tells us which blocks need to copied in case of an
incremental backup covering that range of WAL records. But this
doesn't yet add the capability to actually perform an incremental
backup; the next patch will do that.
A new parameter summarize_wal enables or disables this new background
process. The background process also automatically deletes summary
files that are older than wal_summarize_keep_time, if that parameter
has a non-zero value and the summarizer is configured to run.
Patch by me, with some design help from Dilip Kumar and Andres Freund.
Reviewed by Matthias van de Meent, Dilip Kumar, Jakub Wartak, Peter
Eisentraut, and Álvaro Herrera.
Discussion: http://postgr.es/m/CA+TgmoYOYZfMCyOXFyC-P+-mdrZqm5pP2N7S-r0z3_402h9rsA@mail.gmail.com
2023-12-20 14:41:09 +01:00
|
|
|
#include "postmaster/walsummarizer.h"
|
2021-08-05 21:09:19 +02:00
|
|
|
#include "postmaster/walwriter.h"
|
|
|
|
#include "replication/walreceiver.h"
|
|
|
|
#include "storage/condition_variable.h"
|
|
|
|
#include "storage/ipc.h"
|
|
|
|
#include "storage/proc.h"
|
2024-03-04 12:00:11 +01:00
|
|
|
#include "storage/procsignal.h"
|
2024-03-18 10:35:08 +01:00
|
|
|
#include "utils/memutils.h"
|
2021-08-05 21:09:19 +02:00
|
|
|
#include "utils/ps_status.h"
|
|
|
|
|
|
|
|
|
|
|
|
static void ShutdownAuxiliaryProcess(int code, Datum arg);
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
2024-03-18 10:35:08 +01:00
|
|
|
* AuxiliaryProcessMainCommon
|
2021-08-05 21:09:19 +02:00
|
|
|
*
|
2024-03-18 10:35:08 +01:00
|
|
|
* Common initialization code for auxiliary processes, such as the bgwriter,
|
|
|
|
* walwriter, walreceiver, and the startup process.
|
2021-08-05 21:09:19 +02:00
|
|
|
*/
|
|
|
|
void
|
2024-03-18 10:35:08 +01:00
|
|
|
AuxiliaryProcessMainCommon(void)
|
2021-08-05 21:09:19 +02:00
|
|
|
{
|
|
|
|
Assert(IsUnderPostmaster);
|
|
|
|
|
2024-03-18 10:35:08 +01:00
|
|
|
/* Release postmaster's working memory context */
|
|
|
|
if (PostmasterContext)
|
|
|
|
{
|
|
|
|
MemoryContextDelete(PostmasterContext);
|
|
|
|
PostmasterContext = NULL;
|
|
|
|
}
|
2021-08-05 21:09:19 +02:00
|
|
|
|
|
|
|
init_ps_display(NULL);
|
|
|
|
|
|
|
|
SetProcessingMode(BootstrapProcessing);
|
|
|
|
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.
|
|
|
|
*/
|
|
|
|
|
|
|
|
/*
|
2023-12-03 15:39:18 +01:00
|
|
|
* Create a PGPROC so we can use LWLocks and access shared memory.
|
2021-08-05 21:09:19 +02:00
|
|
|
*/
|
|
|
|
InitAuxiliaryProcess();
|
|
|
|
|
2021-08-05 23:37:09 +02:00
|
|
|
BaseInit();
|
|
|
|
|
Redefine backend ID to be an index into the proc array
Previously, backend ID was an index into the ProcState array, in the
shared cache invalidation manager (sinvaladt.c). The entry in the
ProcState array was reserved at backend startup by scanning the array
for a free entry, and that was also when the backend got its backend
ID. Things become slightly simpler if we redefine backend ID to be the
index into the PGPROC array, and directly use it also as an index to
the ProcState array. This uses a little more memory, as we reserve a
few extra slots in the ProcState array for aux processes that don't
need them, but the simplicity is worth it.
Aux processes now also have a backend ID. This simplifies the
reservation of BackendStatusArray and ProcSignal slots.
You can now convert a backend ID into an index into the PGPROC array
simply by subtracting 1. We still use 0-based "pgprocnos" in various
places, for indexes into the PGPROC array, but the only difference now
is that backend IDs start at 1 while pgprocnos start at 0. (The next
commmit will get rid of the term "backend ID" altogether and make
everything 0-based.)
There is still a 'backendId' field in PGPROC, now part of 'vxid' which
encapsulates the backend ID and local transaction ID together. It's
needed for prepared xacts. For regular backends, the backendId is
always equal to pgprocno + 1, but for prepared xact PGPROC entries,
it's the ID of the original backend that processed the transaction.
Reviewed-by: Andres Freund, Reid Thompson
Discussion: https://www.postgresql.org/message-id/8171f1aa-496f-46a6-afc3-c46fe7a9b407@iki.fi
2024-03-03 18:37:28 +01:00
|
|
|
ProcSignalInit();
|
2021-08-05 21:09:19 +02:00
|
|
|
|
|
|
|
/*
|
|
|
|
* 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();
|
|
|
|
|
|
|
|
/* 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();
|
|
|
|
}
|