test repo for public-inbox, cleared periodically
 help / color / mirror / Atom feed
From: "Álvaro Herrera" <alvherre@kurilemu.de>
To: test@public-inbox.org
Subject: Re: Adding REPACK [concurrently]
Date: Tue, 10 Feb 2026 15:14:54 +0100	[thread overview]
Message-ID: <CADzfLwUEH5+LjCN+6kRfSsXwuou8rKXyVV42Wi-O_TG0360Kug@mail.gmail.com> (raw)
In-Reply-To: <CADzfLwVZ_DeU_3avD=G4ZHFJJgZ0EOFzxnmWxwyB23zsS-uxjA@mail.gmail.com>

[-- Attachment #1: nocfbot-stress_tests_for_repack_concurrently.patch --]
[-- Type: application/x-patch, Size: 6800 bytes --]

[-- Attachment #2: nocfbot-Add_`relcheckxmin`_to_track_and_enforce_tuple_visibility_in_`pg_class`.patch --]
[-- Type: application/x-patch, Size: 18839 bytes --]

[-- Attachment #3: q --]
[-- Type: text/plain, Size: 1841 bytes --]

Hello, Antonin!

PART 1:

I started rebasing the MVCC-safe version on top of the multi-snapshot
version and realized it becomes complex.
But, what's really bad about MVCC-unsafety is the ability to access
*incorrect* data and break some logic (or even constraints).

If we may *prevent* such data access with some kind of error (which is
going to be very infrequent) - I don't see any sense to achieve true
MVCC-safety.

I remembered a way it works with indcheckxmin for indexes. And made
something similar for pg_class: it records the rewriting transaction XID
and causes the executor to raise an error if a transaction with an older
snapshot attempts to access the rewritten relation.

For the normal case - check is never executed, no performance regression
here. Also, the flag is automatically cleared by VACUUM once the
transaction ID is frozen.

It also "fixes" ALTER TABLE, not only REPACK concurrently.

Attached patch contains more details (some in the commit message).

PART 2:

I have continued working with stress tests. This time I added your WIP
patch to fix the LR\CLOG race.

I made the following configs:
1) just REPACK CONCURRENTLY - ok
2) + relcheckxmin (see PART1) - ok
3) + worker - ok
4) + multiple snapshots - broken in multiple ways.

You may see example of run here -
https://cirrus-ci.com/build/6359048020295680

Some examples:

1)  'pgbench: error: client 11 script 0 aborted in command 20 query 0:
ERROR:  could not read blocks 0..0 in file "base/5/16414": read only 0 of
8192 bytes
2) at /home/postgres/postgres/contrib/amcheck/t/008_repack_concurrently.pl
line 51.
[15:36:37.204] #                   'pgbench: error: client 5 script 0
aborted in command 28 query 0: ERROR:  division by zero
3)    'pgbench: error: client 12 script 0 aborted in command 6 query 0:
ERROR:  cache lookup failed for relation 17400

       reply	other threads:[~2026-02-10 14:14 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <202512151349.vlq3mpfniyk3@alvherre.pgsql>
     [not found] ` <11247.1767609087@localhost>
     [not found]   ` <11558.1767609632@localhost>
     [not found]     ` <141054.1767891540@localhost>
     [not found]       ` <CADzfLwU-OmxW3t3AoQo9=K7uq4G1yZ-txcetzW3jbcVxV_pJew@mail.gmail.com>
     [not found]         ` <137668.1768235610@localhost>
     [not found]           ` <CADzfLwUJSHKGxYw+vMUZ_Hr2YeuxO2Q5w13HKgUUN1725tjY5Q@mail.gmail.com>
     [not found]             ` <CADzfLwXJ+4s1tJuG9injcxAUP3urj9D6dUAPOCaX33UeiUxrRQ@mail.gmail.com>
     [not found]               ` <74802.1769071060@localhost>
     [not found]                 ` <CADzfLwVZ_DeU_3avD=G4ZHFJJgZ0EOFzxnmWxwyB23zsS-uxjA@mail.gmail.com>
2026-02-10 14:14                   ` Álvaro Herrera [this message]
2026-02-10 14:12                     ` Adding REPACK [concurrently] Álvaro Herrera
2026-02-10 14:07                       ` Álvaro Herrera
2026-02-10  9:54                         ` Álvaro Herrera

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=CADzfLwUEH5+LjCN+6kRfSsXwuou8rKXyVV42Wi-O_TG0360Kug@mail.gmail.com \
    --to=alvherre@kurilemu.de \
    --cc=test@public-inbox.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).