Skip to content

Commit e6c44ee

Browse files
committed
Fix off-by-one possibly leading to skipped XLOG_RUNNING_XACTS records.
Since 6ef2eba ("Skip checkpoints, archiving on idle systems."), GetLastImportantRecPtr() is used to avoid performing superfluous checkpoints, xlog switches, running-xact records when the system is idle. Unfortunately the check concerning running-xact records had a off-by-one error, leading to such records being potentially skipped when only a single record has been inserted since the last running-xact record. An alternative approach would have been to change GetLastImportantRecPtr()'s definition to point to the end of records, but that would make the checkpoint code more complicated. Author: Andres Freund Discussion: https://postgr.es/m/20170505012447.wsrympaxnfis6ojt@alap3.anarazel.de Backpatch: no, code only present in master
1 parent 334b82c commit e6c44ee

File tree

2 files changed

+7
-3
lines changed

2 files changed

+7
-3
lines changed

src/backend/postmaster/bgwriter.c

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -325,10 +325,13 @@ BackgroundWriterMain(void)
325325

326326
/*
327327
* Only log if enough time has passed and interesting records have
328-
* been inserted since the last snapshot.
328+
* been inserted since the last snapshot. Have to compare with <=
329+
* instead of < because GetLastImportantRecPtr() points at the
330+
* start of a record, whereas last_snapshot_lsn points just past
331+
* the end of the record.
329332
*/
330333
if (now >= timeout &&
331-
last_snapshot_lsn < GetLastImportantRecPtr())
334+
last_snapshot_lsn <= GetLastImportantRecPtr())
332335
{
333336
last_snapshot_lsn = LogStandbySnapshot();
334337
last_snapshot_ts = now;

src/backend/postmaster/checkpointer.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -611,7 +611,8 @@ CheckArchiveTimeout(void)
611611
{
612612
/*
613613
* Switch segment only when "important" WAL has been logged since the
614-
* last segment switch.
614+
* last segment switch (last_switch_lsn points to end of segment
615+
* switch occurred in).
615616
*/
616617
if (GetLastImportantRecPtr() > last_switch_lsn)
617618
{

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy