postgresql/src/backend/utils
Michael Paquier 605994651b Fix assertion failure when updating stats_fetch_consistency in a transaction
An update of the GUC stats_fetch_consistency in a transaction would be
able to trigger an assertion when doing cache->snapshot.  In this case,
when retrieving a pgstat entry after the switch, a new snapshot would be
rebuilt, confusing pgstat_build_snapshot() because a snapshot is already
cached with an unexpected mode ("cache").

In order to fix this problem, this commit adds a flag to force a
snapshot clear each time this GUC is changed.  Some tests are added to
check, while on it.

Some optimizations in avoiding the snapshot clear should be possible
depending on what is cached and the current GUC value, I guess, but this
solution is simple, and ensures that the state of the cache is updated
each time a new pgstat entry is fetched, hence being consistent with the
level wanted by the client that has set the GUC.

Note that cache->none and snapshot->none would not cause issues, as
fetching a pgstat entry would be retrieved from shared memory on the
second attempt, however a snapshot would still be cached.  Similarly,
none->snapshot and none->cache would build a new snapshot on the second
fetch attempt.  Finally, snapshot->cache would cache a new snapshot on
the second attempt.

Reported-by: Alexander Lakhin
Author: Kyotaro Horiguchi
Discussion: https://postgr.es/m/17804-2a118cd046f2d0e5@postgresql.org
backpatch-through: 15
2023-05-10 11:24:30 +09:00
..
activity Fix assertion failure when updating stats_fetch_consistency in a transaction 2023-05-10 11:24:30 +09:00
adt Revert "ICU: do not convert locale 'C' to 'en-US-u-va-posix'." 2023-05-08 20:50:51 -07:00
cache Acquire locks on views in AcquirePlannerLocks, too. 2023-04-05 15:56:35 -04:00
error Update copyright for 2023 2023-01-02 15:00:37 -05:00
fmgr Add SysCacheGetAttrNotNull for guaranteed not-null attrs 2023-03-25 22:49:33 +01:00
hash Update copyright for 2023 2023-01-02 15:00:37 -05:00
init Remove obsolete defense against strxfrm() bugs. 2023-04-20 13:20:14 +12:00
mb Fix typos in comments 2023-05-02 12:23:08 +09:00
misc Fix assertion failure when updating stats_fetch_consistency in a transaction 2023-05-10 11:24:30 +09:00
mmgr Fix various typos and incorrect/outdated name references 2023-04-19 13:50:33 +12:00
resowner Fix various typos 2023-04-18 13:23:23 +12:00
sort Fix various typos and incorrect/outdated name references 2023-04-19 13:50:33 +12:00
time Fix various typos and incorrect/outdated name references 2023-04-19 13:50:33 +12:00
.gitignore Rearrange makefile rules for running Gen_fmgrtab.pl. 2018-05-03 17:54:18 -04:00
Gen_dummy_probes.pl Update copyright for 2023 2023-01-02 15:00:37 -05:00
Gen_dummy_probes.pl.prolog Update copyright for 2023 2023-01-02 15:00:37 -05:00
Gen_dummy_probes.sed Update copyright for 2023 2023-01-02 15:00:37 -05:00
Gen_fmgrtab.pl Update copyright for 2023 2023-01-02 15:00:37 -05:00
Makefile Update copyright for 2023 2023-01-02 15:00:37 -05:00
README.Gen_dummy_probes Tweak generation of Gen_dummy_probes.pl 2021-05-11 20:02:02 -04:00
errcodes.txt Update copyright for 2023 2023-01-02 15:00:37 -05:00
generate-errcodes.pl Update copyright for 2023 2023-01-02 15:00:37 -05:00
meson.build Update copyright for 2023 2023-01-02 15:00:37 -05:00
postprocess_dtrace.sed Update copyright for 2023 2023-01-02 15:00:37 -05:00
probes.d bufmgr: Introduce infrastructure for faster relation extension 2023-04-05 16:21:09 -07:00

README.Gen_dummy_probes

# Generating dummy probes

If Postgres isn't configured with dtrace enabled, we need to generate
dummy probes for the entries in probes.d, that do nothing.

This is accomplished in Unix via the sed script `Gen_dummy_probes.sed`. We
used to use this in MSVC builds using the perl utility `psed`, which mimicked
sed. However, that utility disappeared from Windows perl distributions and so
we converted the sed script to a perl script to be used in MSVC builds.

We still keep the sed script as the authoritative source for generating
these dummy probes because except on Windows perl is not a hard requirement
when building from a tarball.

So, if you need to change the way dummy probes are generated, first change
the sed script, and when it's working generate the perl script. This can
be accomplished by using the perl utility s2p.

s2p is no longer part of the perl core, so it might not be on your system,
but it is available on CPAN and also in many package systems. e.g.
on Fedora it can be installed using `cpan App::s2p` or
`dnf install perl-App-s2p`.

The Makefile contains a recipe for regenerating Gen_dummy_probes.pl, so all
you need to do is once you have s2p installed is `make Gen_dummy_probes.pl`
Note that in a VPATH build this will generate the file in the vpath tree,
not the source tree.