[postgis-tickets] [PostGIS] #5371: Parallel ST_Union segfaults
PostGIS
trac at osgeo.org
Mon Apr 17 12:29:27 PDT 2023
#5371: Parallel ST_Union segfaults
---------------------+---------------------------
Reporter: ewie | Owner: pramsey
Type: defect | Status: new
Priority: medium | Milestone: PostGIS 3.3.3
Component: postgis | Version: 3.3.x
Keywords: |
---------------------+---------------------------
Parallel `ST_Union` segfaults with PostGIS 3.3.2 on Postgres 11.19 and
12.14 but not on 13.10.
The query to trigger the segfault (see below for setup):
{{{
BEGIN;
SET LOCAL max_parallel_workers_per_gather = 2;
--EXPLAIN
SELECT r.name, st_union(a.geom)
FROM area a
JOIN region r ON r.id = a.region
GROUP BY r.name;
ROLLBACK;
}}}
Produces this query plan on 11.19, 12.14, and 13.10:
{{{
QUERY PLAN
------------------------------------------------------------------------------------------------------
Finalize GroupAggregate (cost=5198.72..5255.39 rows=200 width=35)
Group Key: r.name
-> Gather Merge (cost=5198.72..5245.39 rows=400 width=35)
Workers Planned: 2
-> Sort (cost=4198.70..4199.20 rows=200 width=35)
Sort Key: r.name
-> Partial HashAggregate (cost=4188.55..4191.05 rows=200
width=35)
Group Key: r.name
-> Hash Join (cost=6.50..3874.92 rows=62727
width=123)
Hash Cond: (a.region = r.id)
-> Parallel Seq Scan on area a
(cost=0.00..3700.27 rows=62727 width=128)
-> Hash (cost=4.00..4.00 rows=200 width=11)
-> Seq Scan on region r
(cost=0.00..4.00 rows=200 width=11)
(13 rows)
}}}
The query does not segfault when disabling parallel queries with
`max_parallel_workers_per_gather = 0`.
Setup of schema and data (increase `num_areas` and `num_regions` if the
query does not generate a parallel query plan):
{{{
BEGIN;
-- May need more rows to trigger a parallel query. Increase as necessary.
\set num_areas 150000
\set num_regions 200
CREATE EXTENSION IF NOT EXISTS postgis;
DROP TABLE IF EXISTS area;
DROP TABLE IF EXISTS region;
CREATE TABLE region (
id bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
name text NOT NULL
);
CREATE TABLE area (
id bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
geom geometry NOT NULL,
region bigint NOT NULL,
FOREIGN KEY (region) REFERENCES region (id)
);
INSERT INTO region (name)
SELECT
s::text
FROM
generate_series(1, :num_regions) s;
INSERT INTO area (geom, region)
SELECT
grid.geom,
((grid.i * grid.j) % :num_regions) + 1
FROM
st_squaregrid(
1 / sqrt(:num_areas),
st_geomfromtext('polygon ((0 0, 0 1, 1 1, 1 0, 0 0))')
) grid;
ANALYZE area, region;
COMMIT;
}}}
Backtrace on 11.19:
{{{
Program received signal SIGSEGV, Segmentation fault.
pfree (pointer=0x560e05e96408) at utils/mmgr/mcxt.c:1035
1035 context->methods->free_p(context, pointer);
#0 pfree (pointer=0x560e05e96408) at utils/mmgr/mcxt.c:1035
#1 list_free_private (deep=false, list=0x560e05f53dd8) at
nodes/list.c:1117
#2 list_free (list=0x560e05f53dd8) at nodes/list.c:1135
#3 0x00007f23d20e4045 in state_combine (state2=0x560e04d56c58,
state1=0x560e03675f00) at
/usr/src/debug/postgis33_11-3.3.2-1.f37.x86_64/postgis/lwgeom_union.c:254
#4 pgis_geometry_union_parallel_combinefn (fcinfo=<optimized out>) at
/usr/src/debug/postgis33_11-3.3.2-1.f37.x86_64/postgis/lwgeom_union.c:107
#5 0x0000560e027703a6 in ExecInterpExpr (state=0x560e05e4e040,
econtext=0x560e03740768, isnull=<optimized out>) at
executor/execExprInterp.c:1667
#6 0x0000560e0278d93d in ExecEvalExprSwitchContext
(isNull=0x7ffd4969af07, econtext=<optimized out>, state=<optimized out>)
at executor/../../../src/include/executor/executor.h:320
#7 advance_aggregates (aggstate=0x560e03740540) at executor/nodeAgg.c:670
#8 agg_retrieve_direct (aggstate=0x560e03740540) at
executor/nodeAgg.c:1838
#9 ExecAgg (pstate=0x560e03740540) at executor/nodeAgg.c:1561
#10 0x0000560e0277937a in ExecProcNode (node=0x560e03740540) at
executor/../../../src/include/executor/executor.h:248
#11 ExecutePlan (execute_once=<optimized out>, dest=0x560e0461ec50,
direction=<optimized out>, numberTuples=0, sendTuples=true,
operation=CMD_SELECT, use_parallel_mode=<optimized out>,
planstate=0x560e03740540, estate=0x560e03740300) at
executor/execMain.c:1712
#12 standard_ExecutorRun (queryDesc=0x560e048feaf0, direction=<optimized
out>, count=0, execute_once=<optimized out>) at executor/execMain.c:353
#13 0x0000560e028ecb15 in ExecutorRun (execute_once=<optimized out>,
count=0, direction=ForwardScanDirection, queryDesc=0x560e048feaf0) at
executor/execMain.c:296
#14 PortalRunSelect (portal=portal at entry=0x560e036f4f00,
forward=forward at entry=true, count=0, count at entry=9223372036854775807,
dest=dest at entry=0x560e0461ec50) at tcop/pquery.c:941
#15 0x0000560e028ed41e in PortalRun (portal=portal at entry=0x560e036f4f00,
count=count at entry=9223372036854775807, isTopLevel=isTopLevel at entry=true,
run_once=run_once at entry=true, dest=dest at entry=0x560e0461ec50,
altdest=altdest at entry=0x560e0461ec50, completionTag=0x7ffd4969b170 "") at
tcop/pquery.c:782
#16 0x0000560e028ed912 in exec_simple_query (query_string=0x560e0364ef90
"SELECT\n r.name,\n st_union(a.geom) AS geom\nFROM area a\nJOIN region r
ON r.id = a.region\nGROUP BY r.name;") at tcop/postgres.c:1144
#17 0x0000560e028ef441 in PostgresMain (argc=<optimized out>,
argv=<optimized out>, dbname=<optimized out>, username=<optimized out>) at
tcop/postgres.c:4229
#18 0x0000560e02873cd9 in BackendRun (port=0x560e036b7040) at
postmaster/postmaster.c:4429
#19 BackendStartup (port=0x560e036b7040) at postmaster/postmaster.c:4093
#20 ServerLoop () at postmaster/postmaster.c:1728
#21 0x0000560e02874c3c in PostmasterMain (argc=<optimized out>,
argv=0x560e036498c0) at postmaster/postmaster.c:1401
#22 0x0000560e025c1595 in main (argc=3, argv=0x560e036498c0) at
main/main.c:228
}}}
Backtrace on 12.14:
{{{
Program received signal SIGSEGV, Segmentation fault.
pfree (pointer=0x7f4c5faed7f8) at utils/mmgr/mcxt.c:1035
1035 context->methods->free_p(context, pointer);
#0 pfree (pointer=0x7f4c5faed7f8) at utils/mmgr/mcxt.c:1035
#1 list_free_private (deep=false, list=0x55db196c55c8) at
nodes/list.c:1120
#2 list_free (list=0x55db196c55c8) at nodes/list.c:1138
#3 0x00007f4c60a31fa5 in state_combine (state2=0x55db196e2438,
state1=0x55db195c2b90) at
/usr/src/debug/postgis33_12-3.3.2-1.f37.x86_64/postgis/lwgeom_union.c:254
#4 pgis_geometry_union_parallel_combinefn (fcinfo=<optimized out>) at
/usr/src/debug/postgis33_12-3.3.2-1.f37.x86_64/postgis/lwgeom_union.c:107
#5 0x000055db1865a4dc in ExecInterpExpr (state=0x55db19614b80,
econtext=0x55db195a1898, isnull=<optimized out>) at
executor/execExprInterp.c:1650
#6 0x000055db186732dd in ExecEvalExprSwitchContext
(isNull=0x7ffca8d295b7, econtext=<optimized out>, state=<optimized out>)
at executor/../../../src/include/executor/executor.h:316
#7 advance_aggregates (aggstate=0x55db195a1670) at executor/nodeAgg.c:669
#8 agg_retrieve_direct (aggstate=0x55db195a1670) at
executor/nodeAgg.c:1838
#9 ExecAgg (pstate=0x55db195a1670) at executor/nodeAgg.c:1563
#10 0x000055db1865d972 in ExecProcNode (node=0x55db195a1670) at
executor/../../../src/include/executor/executor.h:242
#11 ExecutePlan (execute_once=<optimized out>, dest=0x55db195a7438,
direction=<optimized out>, numberTuples=0, sendTuples=true,
operation=CMD_SELECT, use_parallel_mode=<optimized out>,
planstate=0x55db195a1670, estate=0x55db195a13d0) at
executor/execMain.c:1632
#12 standard_ExecutorRun (queryDesc=0x55db194f6c20, direction=<optimized
out>, count=0, execute_once=<optimized out>) at executor/execMain.c:350
#13 0x000055db187e00d5 in ExecutorRun (execute_once=<optimized out>,
count=0, direction=ForwardScanDirection, queryDesc=0x55db194f6c20) at
executor/execMain.c:294
#14 PortalRunSelect (portal=portal at entry=0x55db1953cc60,
forward=forward at entry=true, count=0, count at entry=9223372036854775807,
dest=dest at entry=0x55db195a7438) at tcop/pquery.c:938
#15 0x000055db187e1b9e in PortalRun (portal=portal at entry=0x55db1953cc60,
count=count at entry=9223372036854775807, isTopLevel=isTopLevel at entry=true,
run_once=run_once at entry=true, dest=dest at entry=0x55db195a7438,
altdest=altdest at entry=0x55db195a7438, completionTag=0x7ffca8d29820 "") at
tcop/pquery.c:779
#16 0x000055db187e209a in exec_simple_query (query_string=0x55db194cea90
"SELECT\n r.name,\n st_union(a.geom) AS geom\nFROM area a\nJOIN region r
ON r.id = a.region\nGROUP BY r.name;") at tcop/postgres.c:1214
#17 0x000055db187e412d in PostgresMain (argc=<optimized out>,
argv=<optimized out>, dbname=<optimized out>, username=<optimized out>) at
tcop/postgres.c:4293
#18 0x000055db18768587 in BackendRun (port=0x55db194f3fb0) at
postmaster/postmaster.c:4517
#19 BackendStartup (port=0x55db194f3fb0) at postmaster/postmaster.c:4200
#20 ServerLoop () at postmaster/postmaster.c:1725
#21 0x000055db187694b1 in PostmasterMain (argc=<optimized out>,
argv=0x55db194898c0) at postmaster/postmaster.c:1398
#22 0x000055db1849cf79 in main (argc=3, argv=0x55db194898c0) at
main/main.c:228
}}}
System:
{{{
Linux fedora 6.2.10-200.fc37.x86_64 #1 SMP PREEMPT_DYNAMIC Thu Apr 6
23:30:41 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux
}}}
Postgres 11:
{{{
-[ RECORD 1
]--------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------
version | PostgreSQL 11.19 on x86_64-pc-linux-gnu, compiled
by gcc (GCC) 12.2.1 20221121 (Red Hat 12.2.1-4), 64-bit
postgis_full_version | POSTGIS="3.3.2 4975da8" [EXTENSION] PGSQL="110"
GEOS="3.11.2-CAPI-1.17.2" PROJ="9.0.1" LIBXML="2.10.3" LIBJSON="0.16"
LIBPROTOBUF="1.4.1" WAGYU="0.5.0 (Internal)"
}}}
Postgres 12:
{{{
-[ RECORD 1
]--------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------
version | PostgreSQL 12.14 on x86_64-pc-linux-gnu, compiled
by gcc (GCC) 12.2.1 20221121 (Red Hat 12.2.1-4), 64-bit
postgis_full_version | POSTGIS="3.3.2 4975da8" [EXTENSION] PGSQL="120"
GEOS="3.11.2-CAPI-1.17.2" PROJ="9.0.1" LIBXML="2.10.3" LIBJSON="0.16"
LIBPROTOBUF="1.4.1" WAGYU="0.5.0 (Internal)"
}}}
Postgres 13:
{{{
-[ RECORD 1
]--------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------
version | PostgreSQL 13.10 on x86_64-pc-linux-gnu, compiled
by gcc (GCC) 12.2.1 20221121 (Red Hat 12.2.1-4), 64-bit
postgis_full_version | POSTGIS="3.3.2 4975da8" [EXTENSION] PGSQL="130"
GEOS="3.11.2-CAPI-1.17.2" PROJ="9.0.1" LIBXML="2.10.3" LIBJSON="0.16"
LIBPROTOBUF="1.4.1" WAGYU="0.5.0 (Internal)"
}}}
--
Ticket URL: <https://trac.osgeo.org/postgis/ticket/5371>
PostGIS <http://trac.osgeo.org/postgis/>
The PostGIS Trac is used for bug, enhancement & task tracking, a user and developer wiki, and a view into the subversion code repository of PostGIS project.
More information about the postgis-tickets
mailing list