From: Álvaro Herrera Date: Mon, 20 Apr 2026 13:44:23 +0000 (+0200) Subject: REPACK: do not require REPLICATION or LOGIN X-Git-Url: http://git.ipfire.org/index.cgi?a=commitdiff_plain;h=5dbb63fc82b72ccc6f9e7be0361efdeee5deeb50;p=thirdparty%2Fpostgresql.git REPACK: do not require REPLICATION or LOGIN Although REPACK (CONCURRENTLY) uses replication slots, there is no concern that the slot will leak data of other users, because the MAINTAIN privilege on the table is required anyway; requiring REPLICATION is user-unfriendly without providing any actual protection. A related aspect is that the REPLICATION attribute is not needed to prevent REPACK from stealing slots from logical replication, since commit e76d8c749c31 made REPACK use a separate pool of replication slots. Similarly, there's no reason to require that the table owner has the LOGIN privilege. Bypass the default behavior in the background worker launch sequence. Because there are now successful concurrent repack runs in the regression tests, we're forced to run test_plan_advice under wal_level=replica, so add that. Also, move the cluster.sql test to a different parallel group in parallel_schedule: apparently the use of the repack worker causes it to exceed the maximum limit of processes in some runs (the actual limit reached is the number of XIDs in a snapshot's xip array). Author: Antonin Houska Reported-by: Justin Pryzby Reviewed-by: Chao Li Discussion: https://postgr.es/m/aeJHPNmL4vVy3oPw@pryzbyj2023 --- diff --git a/src/backend/commands/repack_worker.c b/src/backend/commands/repack_worker.c index b17edd771e2..c40f8c98e06 100644 --- a/src/backend/commands/repack_worker.c +++ b/src/backend/commands/repack_worker.c @@ -106,8 +106,9 @@ RepackWorkerMain(Datum main_arg) pq_set_parallel_leader(shared->backend_pid, shared->backend_proc_number); - /* Connect to the database. */ - BackgroundWorkerInitializeConnectionByOid(shared->dbid, shared->roleid, 0); + /* Connect to the database. LOGIN is not required. */ + BackgroundWorkerInitializeConnectionByOid(shared->dbid, shared->roleid, + BGWORKER_BYPASS_ROLELOGINCHECK); /* * Transaction is needed to open relation, and it also provides us with a @@ -214,7 +215,6 @@ repack_setup_logical_decoding(Oid relid) /* * Make sure we can use logical decoding. */ - CheckSlotPermissions(); CheckLogicalDecodingRequirements(true); /* diff --git a/src/test/modules/test_plan_advice/t/001_replan_regress.pl b/src/test/modules/test_plan_advice/t/001_replan_regress.pl index 38ffa4d11ae..452b179a665 100644 --- a/src/test/modules/test_plan_advice/t/001_replan_regress.pl +++ b/src/test/modules/test_plan_advice/t/001_replan_regress.pl @@ -18,6 +18,7 @@ $node->init(); # Set up our desired configuration. $node->append_conf('postgresql.conf', <