Re: STRATEGY=WAL_LOG missing checkpoint interlocks and sync

From: Noah Misch <noah(at)leadboat(dot)com>
To: pgsql-bugs(at)postgresql(dot)org, dilipbalaut(at)gmail(dot)com
Cc: robertmhaas(at)gmail(dot)com
Subject: Re: STRATEGY=WAL_LOG missing checkpoint interlocks and sync
Date: 2024-02-01 23:28:28
Message-ID: 20240201232828.b1.nmisch@google.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-bugs

On Tue, Jan 30, 2024 at 11:50:03AM -0800, Noah Misch wrote:
> (1) CreateDirAndVersionFile() uses a code sequence: XLogInsert(), XLogFlush(),
> write(PG_VERSION). This is missing the interlock with checkpoints, which
> pd_lsn usually secures. This breaks when one takes a base backup between the
> XLogInsert() and the write(). The transam/README "action first and then write
> a WAL entry" strategy works well. createdb_failure_callback() will remove the
> whole directory on failure.
>
> (2) RelationMapCopy() reasons that it doesn't need RelationMappingLock.
> CheckPointRelationMap() relies on RelationMappingLock to avoid completing a
> checkpoint between the WAL and the sync. A base backup taken in the middle of
> write_relmap_file() has no relmap after recovery.
>
> (3) CreateDirAndVersionFile() populates the PG_VERSION file without syncing
> it. An OS crash after the next checkpoint may leave PG_VERSION empty or
> missing. Let's fsync the file immediately. I used LazyFS to confirm the
> defect and fix. Though I was skeptical about adding a wait event in back
> branches, I plan to do so anyway. Commit 368ffde got away with it, and we do
> have this pattern of the sync event being separate from the write event.

Pushed at commit 0b6517a.

In response to

Browse pgsql-bugs by date

  From Date Subject
Next Message Peter Smith 2024-02-02 00:35:41 Re: BUG #18319: Logical Replication updates causing duplication of row if evaluation filter is set to the same field
Previous Message Tom Lane 2024-02-01 22:34:29 Re: BUG #18322: pg_dump fails with "incorrect version found" (with no good reason)