| From: | Andres Freund <andres(at)anarazel(dot)de> |
|---|---|
| To: | Antonin Houska <ah(at)cybertec(dot)at> |
| Cc: | Kirill Reshke <reshkekirill(at)gmail(dot)com>, Heikki Linnakangas <hlinnaka(at)iki(dot)fi>, Melanie Plageman <melanieplageman(at)gmail(dot)com>, Matthias van de Meent <boekewurm+postgres(at)gmail(dot)com>, pgsql-hackers(at)postgresql(dot)org, Thomas Munro <thomas(dot)munro(at)gmail(dot)com>, Noah Misch <noah(at)leadboat(dot)com>, Robert Haas <robertmhaas(at)gmail(dot)com>, Michael Paquier <michael(dot)paquier(at)gmail(dot)com> |
| Subject: | Re: Buffer locking is special (hints, checksums, AIO writes) |
| Date: | 2026-03-11 23:09:26 |
| Message-ID: | tc2rw3axtdvxyo7ktjlxvi3di4xi3zqak4st4fveqcblamci2f@hgyllvwarq6f |
| Views: | Whole Thread | Raw Message | Download mbox | Resend email |
| Thread: | |
| Lists: | pgsql-hackers |
Hi,
On 2026-02-12 11:36:08 +0100, Antonin Houska wrote:
> Andres Freund <andres(at)anarazel(dot)de> wrote:
>
> > For something committable, I think we should probably split IsMVCCSnapshot
> > into IsMVCCSnapshot(), just accepting SNAPSHOT_MVCC, and IsMVCCLikeSnapshot()
> > accepting both SNAPSHOT_MVCC and SNAPSHOT_HISTORIC_MVCC. And then go through
> > all the existing callers of IsMVCCSnapshot() - only about half should stay
> > as-is, I think.
>
> The attached patch tries to do that.
Thanks!
> From dcdbaf3095e632a1f7f65f3abc43eccff0249d4c Mon Sep 17 00:00:00 2001
> From: Antonin Houska <ah(at)cybertec(dot)at>
> Date: Thu, 12 Feb 2026 11:14:00 +0100
> Subject: [PATCH] Refine checking of snapshot type.
>
> It appears to be confusing if IsMVCCSnapshot() evaluates to true for both
> "regular" and "historic" MVCC snapshot. This patch restricts the meaning of
> the macro to the "regular" MVCC snapshot, and introduces a new macro
> IsMVCCLikeSnapshot() to recognize both types.
>
> IsMVCCLikeSnapshot() is only used in functions that can (supposedly) be called
> during logical decoding.
I think I agree with where you selected IsMVCCSnapshot() and where you
selected IsMVCCLikeSnapshot().
> diff --git a/src/include/utils/snapmgr.h b/src/include/utils/snapmgr.h
> index b8c01a291a1..dd5aaae6953 100644
> --- a/src/include/utils/snapmgr.h
> +++ b/src/include/utils/snapmgr.h
> @@ -53,12 +53,14 @@ extern PGDLLIMPORT SnapshotData SnapshotToastData;
>
> /* This macro encodes the knowledge of which snapshots are MVCC-safe */
> #define IsMVCCSnapshot(snapshot) \
> - ((snapshot)->snapshot_type == SNAPSHOT_MVCC || \
> - (snapshot)->snapshot_type == SNAPSHOT_HISTORIC_MVCC)
> + ((snapshot)->snapshot_type == SNAPSHOT_MVCC)
>
> #define IsHistoricMVCCSnapshot(snapshot) \
> ((snapshot)->snapshot_type == SNAPSHOT_HISTORIC_MVCC)
>
> +#define IsMVCCLikeSnapshot(snapshot) \
> + (IsMVCCSnapshot(snapshot) || IsHistoricMVCCSnapshot(snapshot))
> +
> extern Snapshot GetTransactionSnapshot(void);
> extern Snapshot GetLatestSnapshot(void);
> extern void SnapshotSetCommandId(CommandId curcid);
Probably need to update the comments a bit. What about something like
/*
* Is the snapshot implemented as an MVCC snapshot (i.e. it uses
* SNAPSHOT_MVCC). If so, there will be at most be one visible row in a chain
* of updated tuples, and each visible tuple will be seen exactly once.
*/
#define IsMVCCSnapshot(snapshot) \
...
/*
* Is the snapshot either an MVCC snapshot or has equivalent visibility
* semantics (see IsMVCCSnapshot()).
*/
#define IsMVCCLikeSnapshot(snapshot) \
Greetings,
Andres Freund
| From | Date | Subject | |
|---|---|---|---|
| Next Message | Henson Choi | 2026-03-11 23:52:08 | Re: Row pattern recognition |
| Previous Message | Alexander Korotkov | 2026-03-11 22:51:47 | Re: Odd code around ginScanToDelete |