aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Paquier <michael@paquier.xyz>2022-01-21 14:54:47 +0900
committerMichael Paquier <michael@paquier.xyz>2022-01-21 14:54:47 +0900
commit84db5169d4715904b0bffa25509f3c77fcd52188 (patch)
tree1a268789f41dae2845bb92e84933aeb16a05a9ad
parentcf680bd6538a5a05020ab4d193b43563e9eb0c5e (diff)
downloadpostgresql-84db5169d4715904b0bffa25509f3c77fcd52188.tar.gz
postgresql-84db5169d4715904b0bffa25509f3c77fcd52188.zip
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
-rw-r--r--src/backend/access/transam/commit_ts.c8
1 files changed, 5 insertions, 3 deletions
diff --git a/src/backend/access/transam/commit_ts.c b/src/backend/access/transam/commit_ts.c
index 0985fa155ca..edbe3cf6b55 100644
--- a/src/backend/access/transam/commit_ts.c
+++ b/src/backend/access/transam/commit_ts.c
@@ -167,7 +167,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;
@@ -183,7 +185,7 @@ TransactionTreeSetCommitTsData(TransactionId xid, int nsubxids,
pageno);
/* if we wrote out all subxids, we're done. */
- if (j + 1 >= nsubxids)
+ if (j >= nsubxids)
break;
/*
@@ -191,7 +193,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 */