Skip to content

Commit aeaaf52

Browse files
committed
Mark pageinspect's disk-accessing functions as parallel restricted.
These functions have been marked parallel safe, but the buildfarm's response to commit e2933a6 exposed the flaw in that thinking: if you try to use them on a temporary table, and they run inside a parallel worker, they'll fail with "cannot access temporary tables during a parallel operation". Fix that by marking them parallel restricted instead. Maybe someday we'll have a better answer and can reverse this decision. Back-patch to v15. To go back further, we'd have to devise variant versions of pre-1.10 pageinspect versions. Given the lack of field complaints, it doesn't seem worth the trouble. We'll just deem this case unsupported pre-v15. (If anyone does complain, it might be good enough to update the markings manually in their DBs.) Discussion: https://postgr.es/m/E1ox94a-000EHu-VH@gemulon.postgresql.org
1 parent 51b5834 commit aeaaf52

File tree

4 files changed

+32
-2
lines changed

4 files changed

+32
-2
lines changed

contrib/pageinspect/Makefile

+2-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@ OBJS = \
1313
rawpage.o
1414

1515
EXTENSION = pageinspect
16-
DATA = pageinspect--1.9--1.10.sql pageinspect--1.8--1.9.sql \
16+
DATA = pageinspect--1.10--1.11.sql \
17+
pageinspect--1.9--1.10.sql pageinspect--1.8--1.9.sql \
1718
pageinspect--1.7--1.8.sql pageinspect--1.6--1.7.sql \
1819
pageinspect--1.5.sql pageinspect--1.5--1.6.sql \
1920
pageinspect--1.4--1.5.sql pageinspect--1.3--1.4.sql \

contrib/pageinspect/meson.build

+1
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ install_data(
3333
'pageinspect--1.7--1.8.sql',
3434
'pageinspect--1.8--1.9.sql',
3535
'pageinspect--1.9--1.10.sql',
36+
'pageinspect--1.10--1.11.sql',
3637
'pageinspect.control',
3738
kwargs: contrib_data_args,
3839
)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
/* contrib/pageinspect/pageinspect--1.10--1.11.sql */
2+
3+
-- complain if script is sourced in psql, rather than via ALTER EXTENSION
4+
\echo Use "ALTER EXTENSION pageinspect UPDATE TO '1.11'" to load this file. \quit
5+
6+
--
7+
-- Functions that fetch relation pages must be PARALLEL RESTRICTED,
8+
-- not PARALLEL SAFE, otherwise they will fail when run on a
9+
-- temporary table in a parallel worker process.
10+
--
11+
12+
ALTER FUNCTION get_raw_page(text, int8) PARALLEL RESTRICTED;
13+
ALTER FUNCTION get_raw_page(text, text, int8) PARALLEL RESTRICTED;
14+
-- tuple_data_split must be restricted because it may fetch TOAST data.
15+
ALTER FUNCTION tuple_data_split(oid, bytea, integer, integer, text) PARALLEL RESTRICTED;
16+
ALTER FUNCTION tuple_data_split(oid, bytea, integer, integer, text, bool) PARALLEL RESTRICTED;
17+
-- heap_page_item_attrs must be restricted because it calls tuple_data_split.
18+
ALTER FUNCTION heap_page_item_attrs(bytea, regclass, bool) PARALLEL RESTRICTED;
19+
ALTER FUNCTION heap_page_item_attrs(bytea, regclass) PARALLEL RESTRICTED;
20+
ALTER FUNCTION bt_metap(text) PARALLEL RESTRICTED;
21+
ALTER FUNCTION bt_page_stats(text, int8) PARALLEL RESTRICTED;
22+
ALTER FUNCTION bt_page_items(text, int8) PARALLEL RESTRICTED;
23+
ALTER FUNCTION hash_bitmap_info(regclass, int8) PARALLEL RESTRICTED;
24+
-- brin_page_items might be parallel safe, because it seems to touch
25+
-- only index metadata, but I don't think there's a point in risking it.
26+
-- Likewise for gist_page_items.
27+
ALTER FUNCTION brin_page_items(bytea, regclass) PARALLEL RESTRICTED;
28+
ALTER FUNCTION gist_page_items(bytea, regclass) PARALLEL RESTRICTED;
+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
# pageinspect extension
22
comment = 'inspect the contents of database pages at a low level'
3-
default_version = '1.10'
3+
default_version = '1.11'
44
module_pathname = '$libdir/pageinspect'
55
relocatable = true

0 commit comments

Comments
 (0)