Avoid backend hang during temp table cleanup in deferrable transactions Previously, a session that had created temporary objects could hang during exit if its default transaction mode was SERIALIZABLE READ ONLY DEFERRABLE and a concurrent serializable transaction was prepared. During backend exit, temporary-relation cleanup pushed a regular transaction snapshot, which honored the session's default settings and could wait for a safe serializable snapshot. So, if the conflicting transaction was prepared, this wait could last indefinitely.
The wait occurred while the backend was already exiting and interrupts were held off, so even pg_terminate_backend() could not cancel it. The backend therefore remained until the prepared transaction was resolved. Temporary-relation cleanup only needs an active MVCC snapshot for fetching TOAST data from catalog tuples while dropping temporary objects. It does not need a transaction snapshot affected by the user's default isolation settings. So, use a catalog snapshot instead, which provides the needed protection without entering the deferrable safe-snapshot wait. Backpatch to all supported versions. Bug: #19441 Reported-by: Alexander Lakhin <[email protected]> Author: Andrey Rachitskiy <[email protected]> Reviewed-by: Andrey Borodin <[email protected]> Reviewed-by: Fujii Masao <[email protected]> Discussion: https://postgr.es/m/[email protected] Backpatch-through: 14 Branch ------ master Details ------- https://git.postgresql.org/pg/commitdiff/0b776de09ed3e237181def135577321bdd31b548 Modified Files -------------- src/backend/catalog/namespace.c | 10 +++- src/test/modules/test_misc/meson.build | 1 + .../test_misc/t/015_temp_schema_exit_deferrable.pl | 58 ++++++++++++++++++++++ 3 files changed, 68 insertions(+), 1 deletion(-)
