Hi hackers!
$subj.
Steps to reproduce:
create extension if not exists amcheck;
create table if not exists t1(i int);
begin;
insert into t1 values(1);
prepare transaction 'x';
create index concurrently i1 on t1(i);
commit prepared 'x';
select bt_index_check('i1', true);
I observe:
NOTICE: heap tuple (1,8) from table "t1" lacks matching index tuple within index "i1"
I expect: awaiting 'x' commit before index is created, correct index after.
This happens because WaitForLockersMultiple() does not take prepared xacts into account. Meanwhile CREATE INDEX
CONCURRENTLYexpects that locks are dropped only when transaction commit is visible.
This issue affects pg_repack and similar machinery based on CIC.
PFA draft of a fix.
Best regards, Andrey Borodin.