1
0
mirror of https://github.com/postgres/postgres.git synced 2025-11-09 06:21:09 +03:00

Add new function pg_get_wal_summarizer_state().

This makes it possible to access information about the progress
of WAL summarization from SQL. The previously-added functions
pg_available_wal_summaries() and pg_wal_summary_contents() only
examine on-disk state, but this function exposes information from
the server's shared memory.

Discussion: http://postgr.es/m/CA+Tgmobvqqj-DW9F7uUzT-cQqs6wcVb-Xhs=w=hzJnXSE-kRGw@mail.gmail.com
This commit is contained in:
Robert Haas
2024-01-11 12:41:18 -05:00
parent 544bcb5a5e
commit d9ef650fca
6 changed files with 146 additions and 1 deletions

View File

@@ -142,6 +142,7 @@ static XLogRecPtr redo_pointer_at_last_summary_removal = InvalidXLogRecPtr;
bool summarize_wal = false;
int wal_summary_keep_time = 10 * 24 * 60;
static void WalSummarizerShutdown(int code, Datum arg);
static XLogRecPtr GetLatestLSN(TimeLineID *tli);
static void HandleWalSummarizerInterrupts(void);
static XLogRecPtr SummarizeWAL(TimeLineID tli, XLogRecPtr start_lsn,
@@ -245,6 +246,7 @@ WalSummarizerMain(void)
pqsignal(SIGUSR2, SIG_IGN); /* not used */
/* Advertise ourselves. */
on_shmem_exit(WalSummarizerShutdown, (Datum) 0);
LWLockAcquire(WALSummarizerLock, LW_EXCLUSIVE);
WalSummarizerCtl->summarizer_pgprocno = MyProc->pgprocno;
LWLockRelease(WALSummarizerLock);
@@ -417,6 +419,57 @@ WalSummarizerMain(void)
}
}
/*
* Get information about the state of the WAL summarizer.
*/
void
GetWalSummarizerState(TimeLineID *summarized_tli, XLogRecPtr *summarized_lsn,
XLogRecPtr *pending_lsn, int *summarizer_pid)
{
LWLockAcquire(WALSummarizerLock, LW_SHARED);
if (!WalSummarizerCtl->initialized)
{
/*
* If initialized is false, the rest of the structure contents are
* undefined.
*/
*summarized_tli = 0;
*summarized_lsn = InvalidXLogRecPtr;
*pending_lsn = InvalidXLogRecPtr;
*summarizer_pid = -1;
}
else
{
int summarizer_pgprocno = WalSummarizerCtl->summarizer_pgprocno;
*summarized_tli = WalSummarizerCtl->summarized_tli;
*summarized_lsn = WalSummarizerCtl->summarized_lsn;
if (summarizer_pgprocno == INVALID_PGPROCNO)
{
/*
* If the summarizer has exited, the fact that it had processed
* beyond summarized_lsn is irrelevant now.
*/
*pending_lsn = WalSummarizerCtl->summarized_lsn;
*summarizer_pid = -1;
}
else
{
*pending_lsn = WalSummarizerCtl->pending_lsn;
/*
* We're not fussed about inexact answers here, since they could
* become stale instantly, so we don't bother taking the lock, but
* make sure that invalid PID values are normalized to -1.
*/
*summarizer_pid = GetPGProcByNumber(summarizer_pgprocno)->pid;
if (*summarizer_pid <= 0)
*summarizer_pid = -1;
}
}
LWLockRelease(WALSummarizerLock);
}
/*
* Get the oldest LSN in this server's timeline history that has not yet been
* summarized.
@@ -622,6 +675,18 @@ WaitForWalSummarization(XLogRecPtr lsn, long timeout, XLogRecPtr *pending_lsn)
return summarized_lsn;
}
/*
* On exit, update shared memory to make it clear that we're no longer
* running.
*/
static void
WalSummarizerShutdown(int code, Datum arg)
{
LWLockAcquire(WALSummarizerLock, LW_EXCLUSIVE);
WalSummarizerCtl->summarizer_pgprocno = INVALID_PGPROCNO;
LWLockRelease(WALSummarizerLock);
}
/*
* Get the latest LSN that is eligible to be summarized, and set *tli to the
* corresponding timeline.