Fix bug in WAL replay of COMMIT_TS_SETTS record.
authorFujii Masao <[email protected]>
Thu, 25 Mar 2021 02:23:30 +0000 (11:23 +0900)
committerFujii Masao <[email protected]>
Thu, 25 Mar 2021 02:23:30 +0000 (11:23 +0900)
Previously the WAL replay of COMMIT_TS_SETTS record called
TransactionTreeSetCommitTsData() with the argument write_xlog=true,
which generated and wrote new COMMIT_TS_SETTS record.
This should not be acceptable because it's during recovery.

This commit fixes the WAL replay of COMMIT_TS_SETTS record
so that it calls TransactionTreeSetCommitTsData() with write_xlog=false
and doesn't generate new WAL during recovery.

Back-patch to all supported branches.

Reported-by: lx zou <[email protected]>
Author: Fujii Masao
Reviewed-by: Alvaro Herrera
Discussion: https://postgr.es/m/16931-620d0f2fdc6108f1@postgresql.org

src/backend/access/transam/commit_ts.c

index 48e8d662860872d039ec50d51b2ed624a782a78e..268bdba3398226ed45ff362bb1f90fddea5d28a8 100644 (file)
@@ -1074,7 +1074,7 @@ commit_ts_redo(XLogReaderState *record)
            subxids = NULL;
 
        TransactionTreeSetCommitTsData(setts->mainxid, nsubxids, subxids,
-                                      setts->timestamp, setts->nodeid, true);
+                                      setts->timestamp, setts->nodeid, false);
        if (subxids)
            pfree(subxids);
    }