mirror of
https://github.com/postgres/postgres.git
synced 2026-04-23 15:19:08 -04:00
Allow multiple backends to initialize WAL buffers concurrently. This way `MemSet((char *) NewPage, 0, XLOG_BLCKSZ);` can run in parallel without taking a single LWLock in exclusive mode. The new algorithm works as follows: * reserve a page for initialization using XLogCtl->InitializeReserved, * ensure the page is written out, * once the page is initialized, try to advance XLogCtl->InitializedUpTo and signal to waiters using XLogCtl->InitializedUpToCondVar condition variable, * repeat previous steps until we reserve initialization up to the target WAL position, * wait until concurrent initialization finishes using a XLogCtl->InitializedUpToCondVar. Now, multiple backends can, in parallel, concurrently reserve pages, initialize them, and advance XLogCtl->InitializedUpTo to point to the latest initialized page. Author: Yura Sokolov <y.sokolov@postgrespro.ru> Co-authored-by: Alexander Korotkov <aekorotkov@gmail.com> Reviewed-by: Pavel Borisov <pashkin.elfe@gmail.com> Reviewed-by: Tomas Vondra <tomas@vondra.me> Tested-by: Michael Paquier <michael@paquier.xyz>
86 lines
2.9 KiB
C
86 lines
2.9 KiB
C
/*-------------------------------------------------------------------------
|
|
*
|
|
* lwlocklist.h
|
|
*
|
|
* The predefined LWLock list is kept in its own source file for use by
|
|
* automatic tools. The exact representation of a keyword is determined by
|
|
* the PG_LWLOCK macro, which is not defined in this file; it can be
|
|
* defined by the caller for special purposes.
|
|
*
|
|
* Also, generate-lwlocknames.pl processes this file to create lwlocknames.h.
|
|
*
|
|
* Portions Copyright (c) 1996-2025, PostgreSQL Global Development Group
|
|
* Portions Copyright (c) 1994, Regents of the University of California
|
|
*
|
|
* IDENTIFICATION
|
|
* src/include/storage/lwlocklist.h
|
|
*
|
|
*-------------------------------------------------------------------------
|
|
*/
|
|
|
|
/*
|
|
* Some commonly-used locks have predefined positions within MainLWLockArray;
|
|
* these are defined here. If you add a lock, add it to the end to avoid
|
|
* renumbering the existing locks; if you remove a lock, consider leaving a gap
|
|
* in the numbering sequence for the benefit of DTrace and other external
|
|
* debugging scripts. Also, do not forget to update the section
|
|
* WaitEventLWLock of src/backend/utils/activity/wait_event_names.txt.
|
|
*
|
|
* Note that the names here don't include the Lock suffix, to appease the
|
|
* C preprocessor; it's added elsewhere.
|
|
*/
|
|
|
|
/* 0 is available; was formerly BufFreelistLock */
|
|
PG_LWLOCK(1, ShmemIndex)
|
|
PG_LWLOCK(2, OidGen)
|
|
PG_LWLOCK(3, XidGen)
|
|
PG_LWLOCK(4, ProcArray)
|
|
PG_LWLOCK(5, SInvalRead)
|
|
PG_LWLOCK(6, SInvalWrite)
|
|
/* 7 was WALBufMapping */
|
|
PG_LWLOCK(8, WALWrite)
|
|
PG_LWLOCK(9, ControlFile)
|
|
/* 10 was CheckpointLock */
|
|
/* 11 was XactSLRULock */
|
|
/* 12 was SubtransSLRULock */
|
|
PG_LWLOCK(13, MultiXactGen)
|
|
/* 14 was MultiXactOffsetSLRULock */
|
|
/* 15 was MultiXactMemberSLRULock */
|
|
PG_LWLOCK(16, RelCacheInit)
|
|
PG_LWLOCK(17, CheckpointerComm)
|
|
PG_LWLOCK(18, TwoPhaseState)
|
|
PG_LWLOCK(19, TablespaceCreate)
|
|
PG_LWLOCK(20, BtreeVacuum)
|
|
PG_LWLOCK(21, AddinShmemInit)
|
|
PG_LWLOCK(22, Autovacuum)
|
|
PG_LWLOCK(23, AutovacuumSchedule)
|
|
PG_LWLOCK(24, SyncScan)
|
|
PG_LWLOCK(25, RelationMapping)
|
|
/* 26 was NotifySLRULock */
|
|
PG_LWLOCK(27, NotifyQueue)
|
|
PG_LWLOCK(28, SerializableXactHash)
|
|
PG_LWLOCK(29, SerializableFinishedList)
|
|
PG_LWLOCK(30, SerializablePredicateList)
|
|
/* 31 was SerialSLRULock */
|
|
PG_LWLOCK(32, SyncRep)
|
|
PG_LWLOCK(33, BackgroundWorker)
|
|
PG_LWLOCK(34, DynamicSharedMemoryControl)
|
|
PG_LWLOCK(35, AutoFile)
|
|
PG_LWLOCK(36, ReplicationSlotAllocation)
|
|
PG_LWLOCK(37, ReplicationSlotControl)
|
|
/* 38 was CommitTsSLRULock */
|
|
PG_LWLOCK(39, CommitTs)
|
|
PG_LWLOCK(40, ReplicationOrigin)
|
|
PG_LWLOCK(41, MultiXactTruncation)
|
|
/* 42 was OldSnapshotTimeMapLock */
|
|
PG_LWLOCK(43, LogicalRepWorker)
|
|
PG_LWLOCK(44, XactTruncation)
|
|
/* 45 was XactTruncationLock until removal of BackendRandomLock */
|
|
PG_LWLOCK(46, WrapLimitsVacuum)
|
|
PG_LWLOCK(47, NotifyQueueTail)
|
|
PG_LWLOCK(48, WaitEventCustom)
|
|
PG_LWLOCK(49, WALSummarizer)
|
|
PG_LWLOCK(50, DSMRegistry)
|
|
PG_LWLOCK(51, InjectionPoint)
|
|
PG_LWLOCK(52, SerialControl)
|
|
PG_LWLOCK(53, AioWorkerSubmissionQueue)
|