Fix use of wrong index in ComputeXidHorizons().
authorAndres Freund <andres@anarazel.de>
Sun, 16 Aug 2020 21:21:37 +0000 (14:21 -0700)
committerAndres Freund <andres@anarazel.de>
Sun, 16 Aug 2020 21:21:37 +0000 (14:21 -0700)
This bug, recently introduced in 941697c3c1a, at least lead to vacuum
failing because it found tuples inserted by a running transaction, but
below the freeze limit. The freeze limit in turn is directly affected
by the aforementioned bug.

Thanks to Tom Lane figuring how to make the bug reproducible.

We should add a few more assertions to make sure this type of bug
isn't as hard to notice, but it's not yet clear how to best do so.

Co-Diagnosed-By: Tom Lane <tgl@sss.pgh.pa.us>
Author: Andres Freund <andres@anarazel.de>
Discussion: https://postgr.es/m/1013484.1597609043@sss.pgh.pa.us

src/backend/storage/ipc/procarray.c

index 8262abd42e6bd2a95dd13ef44107878dcaf53441..96e4a87857602f03f9c856edefaa16af5e22e636 100644 (file)
@@ -1663,7 +1663,7 @@ ComputeXidHorizons(ComputeXidHorizonsResult *h)
                TransactionId xmin;
 
                /* Fetch xid just once - see GetNewTransactionId */
-               xid = UINT32_ACCESS_ONCE(other_xids[pgprocno]);
+               xid = UINT32_ACCESS_ONCE(other_xids[index]);
                xmin = UINT32_ACCESS_ONCE(proc->xmin);
 
                /*