I don't quite understand why TransactionIdIsCurrentTransactionId() implements binary search in ParallelCurrentXids "from scratch" instead of using bsearch().
If I read the code correctly, the contents of the ParallelCurrentXids is composed in SerializeTransactionState(), which uses xidComparator: qsort(workspace, nxids, sizeof(TransactionId), xidComparator); so it should be o.k. to use bsearch(..., xidComparator). For example, ReorderBufferCopySnap() also uses xidComparator to sort the 'subxip' array, and HeapTupleSatisfiesHistoricMVCC() then uses TransactionIdInArray() (which is effectively bsearch(..., xidComparator)) to search for particular XID in the array. -- Antonin Houska Web: https://www.cybertec-postgresql.com
diff --git a/src/backend/access/transam/xact.c b/src/backend/access/transam/xact.c index d119ab909d..8540e70e70 100644 --- a/src/backend/access/transam/xact.c +++ b/src/backend/access/transam/xact.c @@ -965,29 +965,9 @@ TransactionIdIsCurrentTransactionId(TransactionId xid) * the XIDs in this array are sorted numerically rather than according to * transactionIdPrecedes order. */ - if (nParallelCurrentXids > 0) - { - int low, - high; - - low = 0; - high = nParallelCurrentXids - 1; - while (low <= high) - { - int middle; - TransactionId probe; - - middle = low + (high - low) / 2; - probe = ParallelCurrentXids[middle]; - if (probe == xid) - return true; - else if (probe < xid) - low = middle + 1; - else - high = middle - 1; - } - return false; - } + if (bsearch(&xid, ParallelCurrentXids, nParallelCurrentXids, + sizeof(TransactionId), xidComparator)) + return true; /* * We will return true for the Xid of the current subtransaction, any of