postgres.git / summary / log / commit / refs

commit    1c0452c48ca4e5fcdc56808a2f475bbf6b546b86
Author:   Michael Paquier <michael@paquier.xyz>
Date:     Fri Jan 21 05:54:55 2022 +0000
First released in: 15.0, 10.20, 11.15, 12.10, 13.6, 14.2

    Fix one-off bug causing missing commit timestamps for subtransactions
    
    The logic in charge of writing commit timestamps (enabled with
    track_commit_timestamp) for subtransactions had a one-bug bug,
    where it would be possible that commit timestamps go missing for the
    last subtransaction committed.
    
    While on it, simplify a bit the iteration logic in the loop writing the
    commit timestamps, as per suggestions from Kyotaro Horiguchi and Tom
    Lane, so as some variable initializations are not part of the loop
    itself.
    
    Issue introduced in 73c986a.
    
    Analyzed-by: Alex Kingsborough
    Author: Alex Kingsborough, Kyotaro Horiguchi
    Discussion: https://postgr.es/m/73A66172-4050-4F2A-B7F1-13508EDA2144@amazon.com
    Backpatch-through: 10


src/backend/access/transam/commit_ts.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/backend/access/transam/commit_ts.c b/src/backend/access/transam/commit_ts.c index 9cfacc620c2..8325d2610b6 100644 --- a/src/backend/access/transam/commit_ts.c +++ b/src/backend/access/transam/commit_ts.c @@ -184,7 +184,9 @@ TransactionTreeSetCommitTsData(TransactionId xid, int nsubxids, * subxid not on the previous page as head. This way, we only have to * lock/modify each SLRU page once. */ - for (i = 0, headxid = xid;;) + headxid = xid; + i = 0; + for (;;) { int pageno = TransactionIdToCTsPage(headxid); int j; @@ -200,7 +202,7 @@ TransactionTreeSetCommitTsData(TransactionId xid, int nsubxids, pageno); /* if we wrote out all subxids, we're done. */ - if (j + 1 >= nsubxids) + if (j >= nsubxids) break; /* @@ -208,7 +210,7 @@ TransactionTreeSetCommitTsData(TransactionId xid, int nsubxids, * just wrote. */ headxid = subxids[j]; - i += j - i + 1; + i = j + 1; } /* update the cached value in shared memory */ [parent: f0b0b1ddb53a]