Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit9353d94

Browse files
Handle parallel index builds on mapped relations.
Commit9da0cc3, which introduced parallel CREATE INDEX, failed topropagate relmapper.c backend local cache state to parallel workerprocesses. This could result in parallel index builds against mappedcatalog relations where the leader process (participating as a worker)scans the new, pristine relfilenode, while worker processes scan theobsolescent relfilenode. When this happened, the final index structurewas typically not consistent with the owning table's structure. Thefinal index structure could contain entries formed from both heaprelfilenodes. Only rebuilds on mapped catalog relations that occur aspart of a VACUUM FULL or CLUSTER could become corrupt in practice, sincetheir mapped relation relfilenode swap is what allows the inconsistencyto arise.On master, fix the problem by propagating the required relmapper.cbackend state as part of standard parallel initialization (Cf. commit29d58fd). On v11, simply disallow builds against mapped catalogrelations by deeming them parallel unsafe.Author: Peter GeogheganReported-By: "death lock"Reviewed-By: Tom Lane, Amit KapilaBug: #15309Discussion:https://postgr.es/m/153329671686.1405.18298309097348420351@wrigleys.postgresql.orgBackpatch: 11-, where parallel CREATE INDEX was introduced.
1 parent1b9d1b0 commit9353d94

File tree

2 files changed

+12
-6
lines changed

2 files changed

+12
-6
lines changed

‎src/backend/optimizer/plan/planner.c

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6093,11 +6093,13 @@ plan_create_index_workers(Oid tableOid, Oid indexOid)
60936093
/*
60946094
* Determine if it's safe to proceed.
60956095
*
6096-
* Currently, parallel workers can't access the leader's temporary tables.
6097-
* Furthermore, any index predicate or index expressions must be parallel
6098-
* safe.
6096+
* Currently, parallel workers can't access the leader's temporary tables,
6097+
* or the leader's relmapper.c state, which is needed for builds on mapped
6098+
* relations. Furthermore, any index predicate or index expressions must
6099+
* be parallel safe.
60996100
*/
61006101
if (heap->rd_rel->relpersistence==RELPERSISTENCE_TEMP||
6102+
RelationIsMapped(heap)||
61016103
!is_parallel_safe(root, (Node*)RelationGetIndexExpressions(index))||
61026104
!is_parallel_safe(root, (Node*)RelationGetIndexPredicate(index)))
61036105
{

‎src/backend/utils/cache/relmapper.c

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -263,13 +263,17 @@ RelationMapUpdateMap(Oid relationId, Oid fileNode, bool shared,
263263
else
264264
{
265265
/*
266-
* We don't currently support map changes within subtransactions. This
267-
* could be done with more bookkeeping infrastructure, but it doesn't
268-
* presently seem worth it.
266+
* We don't currently support map changes within subtransactions, and
267+
* parallel workers must avoid relying on mapping state, since it
268+
* isn't propagated from the leader. This could be done with more
269+
* bookkeeping infrastructure, but it doesn't presently seem worth it.
269270
*/
270271
if (GetCurrentTransactionNestLevel()>1)
271272
elog(ERROR,"cannot change relation mapping within subtransaction");
272273

274+
if (IsInParallelMode())
275+
elog(ERROR,"cannot change relation mapping in parallel mode");
276+
273277
if (immediate)
274278
{
275279
/* Make it active, but only locally */

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp