agora inbox for pgsql-hackers@postgresql.orghelp / color / mirror / Atom feed
[PATCH v3 6/7] Handle pg_get_expr default args in system_functions.sql 494+ messages / 2 participants [nested] [flat]
* [PATCH v3 6/7] Handle pg_get_expr default args in system_functions.sql @ 2025-12-09 19:17 Mark Wong <markwkm@gmail.com> 0 siblings, 0 replies; 494+ messages in thread From: Mark Wong @ 2025-12-09 19:17 UTC (permalink / raw) Modernize pg_get_expr to use CREATE OR REPLACE FUNCTION to handle the optional pretty argument. --- src/backend/catalog/system_functions.sql | 7 +++++++ src/backend/commands/tablecmds.c | 4 ++-- src/backend/utils/adt/ruleutils.c | 17 ----------------- src/include/catalog/pg_proc.dat | 5 +---- src/include/catalog/pg_retired.dat | 3 ++- 5 files changed, 12 insertions(+), 24 deletions(-) diff --git a/src/backend/catalog/system_functions.sql b/src/backend/catalog/system_functions.sql index 1824faab231..a6f7cdf3a36 100644 --- a/src/backend/catalog/system_functions.sql +++ b/src/backend/catalog/system_functions.sql @@ -692,6 +692,13 @@ LANGUAGE INTERNAL PARALLEL SAFE AS 'pg_get_constraintdef'; +CREATE OR REPLACE FUNCTION + pg_get_expr(expr pg_node_tree, relation oid, pretty bool DEFAULT false) +RETURNS TEXT +LANGUAGE INTERNAL +PARALLEL SAFE +AS 'pg_get_expr'; + -- -- The default permissions for functions mean that anyone can execute them. -- A number of functions shouldn't be executable by just anyone, but rather diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c index f976c0e5c7e..12c4ce08437 100644 --- a/src/backend/commands/tablecmds.c +++ b/src/backend/commands/tablecmds.c @@ -17480,8 +17480,8 @@ decompile_conbin(HeapTuple contup, TupleDesc tupdesc) if (isnull) elog(ERROR, "null conbin for constraint %u", con->oid); - expr = DirectFunctionCall2(pg_get_expr, attr, - ObjectIdGetDatum(con->conrelid)); + expr = DirectFunctionCall3(pg_get_expr, attr, + ObjectIdGetDatum(con->conrelid), false); return TextDatumGetCString(expr); } diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c index 4f2c93f1ee2..d87b361a093 100644 --- a/src/backend/utils/adt/ruleutils.c +++ b/src/backend/utils/adt/ruleutils.c @@ -2573,23 +2573,6 @@ decompile_column_index_array(Datum column_index_array, Oid relId, */ Datum pg_get_expr(PG_FUNCTION_ARGS) -{ - text *expr = PG_GETARG_TEXT_PP(0); - Oid relid = PG_GETARG_OID(1); - text *result; - int prettyFlags; - - prettyFlags = PRETTYFLAG_INDENT; - - result = pg_get_expr_worker(expr, relid, prettyFlags); - if (result) - PG_RETURN_TEXT_P(result); - else - PG_RETURN_NULL(); -} - -Datum -pg_get_expr_ext(PG_FUNCTION_ARGS) { text *expr = PG_GETARG_TEXT_PP(0); Oid relid = PG_GETARG_OID(1); diff --git a/src/include/catalog/pg_proc.dat b/src/include/catalog/pg_proc.dat index ffec11c5539..4304ab220ba 100644 --- a/src/include/catalog/pg_proc.dat +++ b/src/include/catalog/pg_proc.dat @@ -3986,9 +3986,6 @@ { oid => '1662', descr => 'trigger description', proname => 'pg_get_triggerdef', provolatile => 's', prorettype => 'text', proargtypes => 'oid', prosrc => 'pg_get_triggerdef' }, -{ oid => '1716', descr => 'deparse an encoded expression', - proname => 'pg_get_expr', provolatile => 's', prorettype => 'text', - proargtypes => 'pg_node_tree oid', prosrc => 'pg_get_expr' }, { oid => '1665', descr => 'name of sequence for a serial column', proname => 'pg_get_serial_sequence', provolatile => 's', prorettype => 'text', proargtypes => 'text text', prosrc => 'pg_get_serial_sequence' }, @@ -8518,7 +8515,7 @@ { oid => '2509', descr => 'deparse an encoded expression with pretty-print option', proname => 'pg_get_expr', provolatile => 's', prorettype => 'text', - proargtypes => 'pg_node_tree oid bool', prosrc => 'pg_get_expr_ext' }, + proargtypes => 'pg_node_tree oid bool', prosrc => 'pg_get_expr' }, { oid => '2510', descr => 'get the prepared statements for this session', proname => 'pg_prepared_statement', prorows => '1000', proretset => 't', provolatile => 's', proparallel => 'r', prorettype => 'record', diff --git a/src/include/catalog/pg_retired.dat b/src/include/catalog/pg_retired.dat index 90928a9cb00..8b5f58850f6 100644 --- a/src/include/catalog/pg_retired.dat +++ b/src/include/catalog/pg_retired.dat @@ -21,6 +21,7 @@ { oid => '1573', proname => 'pg_get_ruledef' }, { oid => '1640', proname => 'pg_get_viewdef' }, { oid => '1641', proname => 'pg_get_viewdef' }, -{ oid => '1643', proname => 'pg_get_indexdef' } +{ oid => '1643', proname => 'pg_get_indexdef' }, +{ oid => '1716', proname => 'pg_get_expr' } ] -- 2.43.0 --zd8Z8rlPOcTi77n/ Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v3-0007-Handle-pg_get_triggerdef-default-args-in-system_f.patch" ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
* [PATCH] Do not push the active snapshot for copy_table_data before it's needed. @ 2026-04-10 10:17 Antonin Houska <ah@cybertec.at> 0 siblings, 0 replies; 494+ messages in thread From: Antonin Houska @ 2026-04-10 10:17 UTC (permalink / raw) make_new_heap() can launch parallel workers when building index on TOAST relation. If the snapshot for copy_table_data() is already the active snapshot, the workers can incorrectly consider it their transaction snapshot. --- src/backend/commands/repack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 58e3867246f..08fd132a4e3 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -1013,8 +1013,6 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, * Wait until the worker has the initial snapshot and retrieve it. */ snapshot = get_initial_snapshot(decoding_worker); - - PushActiveSnapshot(snapshot); } /* for CLUSTER or REPACK USING INDEX, mark the index as the one to use */ @@ -1038,6 +1036,8 @@ rebuild_relation(Relation OldHeap, Relation index, bool verbose, NewHeap = table_open(OIDNewHeap, NoLock); /* Copy the heap data into the new table in the desired order */ + if (snapshot) + PushActiveSnapshot(snapshot); copy_table_data(NewHeap, OldHeap, index, snapshot, verbose, &swap_toast_by_content, &frozenXid, &cutoffMulti); -- 2.47.3 --=-=-=-- ^ permalink raw reply [nested|flat] 494+ messages in thread
end of thread, other threads:[~2026-04-10 10:17 UTC | newest] Thread overview: 494+ messages (download: mbox mbox.gz follow: Atom feed) -- links below jump to the message on this page -- 2025-12-09 19:17 [PATCH v3 6/7] Handle pg_get_expr default args in system_functions.sql Mark Wong <markwkm@gmail.com> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at> 2026-04-10 10:17 [PATCH] Do not push the active snapshot for copy_table_data before it's needed. Antonin Houska <ah@cybertec.at>
This inbox is served by agora; see mirroring instructions for how to clone and mirror all data and code used for this inbox