Re: Adding REPACK [concurrently]
Mihail Nikalayeu <mihailnikalayeu@gmail.com>
Hello, Antonin!
On Thu, Jan 8, 2026 at 7:59 PM Antonin Houska <ah@cybertec.at> wrote:
> v29 tries to fix the problem.
Some comments for 0001-0004.
------ 0001 -----
> src/bin/scripts/t/103_repackdb.pl:1:
> # Copyright (c) 2021-2025
Update year for 2026.
> * FIXME: this is missing a way to specify the index to use to repack one
> * table, or whether to pass a WITH INDEX clause when multiple tables are
> * used. Something like --index[=indexname]. Adding that bleeds into
> * vacuuming.c as well.
Comments look stale.
> return "???";
I think it is better to add Assert(false); before (done that way in a
few places).
> command <link linkend="sql-repack"><command>REPACK</command></link> There
need .
> “An utility”
Should be “A utility”
> else if (pg_strcasecmp(cmd, "CLUSTER") == 0)
> cmdtype = PROGRESS_COMMAND_CLUSTER;
Should we set PROGRESS_COMMAND_REPACK here? Because cluster is not
used anywhere. Probably we may even delete PROGRESS_COMMAND_CLUSTER.
> CLUOPT_RECHECK_ISCLUSTERED
It is not set anymore... Probably something is wrong here or we need
to just remove that constant and check for it.
------ 0002 -----
> rebuild_relation(Relation OldHeap, Relation index, bool verbose)
It removes unused cmd parameter, but I think it is better to not add
it in the previous commit.
------ 0003 -----
> int newxcnt = 0;
I think it is better to use uint32 for consistency here.
Also, I think it is worth adding Assert(snapshot->snapshot_type ==
SNAPSHOT_HISTORIC_MVCC)
------ 0004 -----
> /* Is REPACK (CONCURRENTLY) being run by this backend? */
> if (am_decoding_for_repack())
We should check change_useless_for_repack here - to avoid looking and
TRUNCATE of unrelated tables.
> /* For the same reason, unlock TOAST relation. */
> if (OldHeap->rd_rel->reltoastrelid)
> LockRelationOid(OldHeap->rd_rel->reltoastrelid, AccessExclusiveLock);
Hm, we are locking here instead of unlocking ;)
> (errhint("Relation \"%s\" has no identity index.",
> RelationGetRelationName(rel)))));
One level of braces may be removed.
> * to decode on behalf of REPACK (CONCURRENT)?
CONCURRENTLY
> * If recheck is required, it must have been preformed on the source
"performed"
> * On exit,'*scan_p' contains the scan descriptor used. The caller must close
> * it when he no longer needs the tuple returned.
There is no scan_p argument here.
> * Copyright (c) 2012-2025, PostgreSQL Global Development Group
2026
> newtuple = change->data.tp.newtuple != NULL ?
> change->data.tp.newtuple : NULL;
> oldtuple = change->data.tp.oldtuple != NULL ?
> change->data.tp.oldtuple : NULL;
> newtuple = change->data.tp.newtuple != NULL ?
> change->data.tp.newtuple : NULL;
Hm, should it be just x = y ?
> apply_concurrent_insert
Double newline at function start.
> heap2_decode
Should we check for change_useless_for_repack here also? (for multi
insert, for example).
Best regards,
Mikhail.
Commits
GET /api/v1/messages/:b64id/commits
the thread's linked commits as JSON, with link sources.
API reference →
-
Allow old WAL recycling during REPACK CONCURRENTLY
- 45b02984e2fa 19 (unreleased) landed
-
Advance restart_lsn more eagerly in LogicalConfirmReceivedLocation
- 38470c2c1ea7 19 (unreleased) landed
-
Remove unnecessary signal handler change
- 5d48d3b14e0e 19 (unreleased) landed
-
Improve REPACK (CONCURRENTLY) error messages some more
- 378dffaf8c80 19 (unreleased) landed
-
Revert "Allow logical replication snapshots to be database-specific"
- 01a80f062146 19 (unreleased) landed
-
Move REPACK (CONCURRENTLY) test out of stock regression tests
- 4b2aa4b39cba 19 (unreleased) landed
-
REPACK: do not require REPLICATION or LOGIN
- 5dbb63fc82b7 19 (unreleased) landed
-
Add missing initialization
- 05c401d5786a 19 (unreleased) landed
-
Simplify declaration of memcpy target
- 2cff363715ef 19 (unreleased) landed
-
Reserve replication slots specifically for REPACK
- e76d8c749c31 19 (unreleased) landed
-
doc: Add an example of REPACK (CONCURRENTLY)
- 8fb95a8ab6e5 19 (unreleased) landed
-
Allow logical replication snapshots to be database-specific
- 0d3dba38c777 19 (unreleased) landed
-
Avoid different-size pointer-to-integer cast
- a3b069ef90bd 19 (unreleased) landed
-
Fix valgrind failure
- 5bcc3fbd196c 19 (unreleased) landed
-
Add CONCURRENTLY option to REPACK
- 28d534e2ae0a 19 (unreleased) landed
-
Rename cluster.c to repack.c (and corresponding .h)
- c0b53ec06309 19 (unreleased) landed
-
Allow index_create to suppress index_build progress reporting
- caec9d9fadf1 19 (unreleased) landed
-
Make index_concurrently_create_copy more general
- 33bf7318f94c 19 (unreleased) landed
-
Document the 'command' column of pg_stat_progress_repack
- a630ac5c2016 19 (unreleased) landed
-
Introduce the REPACK command
- ac58465e0618 19 (unreleased) landed
-
Toggle logical decoding dynamically based on logical slot presence.
- 67c20979ce72 19 (unreleased) cited
-
Split vacuumdb to create vacuuming.c/h
- c4067383cb2c 19 (unreleased) landed
-
Remove ReorderBufferTupleBuf structure.
- 08e6344fd642 17.0 cited
-
Revert changes to CONCURRENTLY that "sped up" Xmin advance
- 042b584c7f7d 14.4 cited
-
VACUUM: ignore indexing operations with CONCURRENTLY
- d9d076222f5b 14.0 cited