pgsql: Fix temporary object cleanup failing due to toast access without

From: Andres Freund <andres(at)anarazel(dot)de>
To: pgsql-committers(at)lists(dot)postgresql(dot)org
Subject: pgsql: Fix temporary object cleanup failing due to toast access without
Date: 2022-02-21 18:35:29
Message-ID: E1nMDX0-0001MM-7i@gemulon.postgresql.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-committers

Fix temporary object cleanup failing due to toast access without snapshot.

When cleaning up temporary objects during process exit the cleanup could fail
with:
FATAL: cannot fetch toast data without an active snapshot

The bug is caused by RemoveTempRelationsCallback() not setting up a
snapshot. If an object with toasted catalog data needs to be cleaned up,
init_toast_snapshot() could fail with the above error.

Most of the time however the the problem is masked due to cached catalog
snapshots being returned by GetOldestSnapshot(). But dropping an object can
cause catalog invalidations to be emitted. If no further catalog accesses are
necessary between the invalidation processing and the next toast datum
deletion, the bug becomes visible.

It's easy to miss this bug because it typically happens after clients
disconnect and the FATAL error just ends up in the log.

Luckily temporary table cleanup at the next use of the same temporary schema
or during DISCARD ALL does not have the same problem.

Fix the bug by pushing a snapshot in RemoveTempRelationsCallback(). Also add
isolation tests for temporary object cleanup, including objects with toasted
catalog data.

A future HEAD only commit will add an assertion trying to make this more
visible.

Reported-By: Miles Delahunty
Author: Andres Freund
Discussion: https://postgr.es/m/CAOFAq3BU5Mf2TTvu8D9n_ZOoFAeQswuzk7yziAb7xuw_qyw5gw@mail.gmail.com
Backpatch: 10-

Branch
------
master

Details
-------
https://git.postgresql.org/pg/commitdiff/7c38ef2a5d6cf6d8dc3834399d7a1c364d64ce64

Modified Files
--------------
src/backend/catalog/namespace.c | 3 +
.../isolation/expected/temp-schema-cleanup.out | 115 +++++++++++++++++++++
src/test/isolation/isolation_schedule | 1 +
src/test/isolation/specs/temp-schema-cleanup.spec | 85 +++++++++++++++
4 files changed, 204 insertions(+)

Browse pgsql-committers by date

  From Date Subject
Next Message Tom Lane 2022-02-21 19:11:09 pgsql: Disallow setting bogus GUCs within an extension's reserved names
Previous Message Andres Freund 2022-02-21 16:35:27 pgsql: pg_upgrade: Don't print progress status when output is not a tty