mirror of
https://github.com/postgres/postgres.git
synced 2025-11-09 06:21:09 +03:00
Add test to prevent premature removal of conflict-relevant data.
A test has been added to ensure that conflict-relevant data is not prematurely removed when a concurrent prepared transaction is being committed on the publisher. This test introduces an injection point that simulates the presence of a prepared transaction in the commit phase, validating that the system correctly delays conflict slot advancement until the transaction is fully committed. Additionally, the test serves as a safeguard for developers, ensuring that the acquisition of the commit timestamp does not occur before marking DELAY_CHKPT_IN_COMMIT in RecordTransactionCommitPrepared. Reported-by: Robert Haas <robertmhaas@gmail.com> Author: Zhijie Hou <houzj.fnst@fujitsu.com> Reviewed-by: shveta malik <shveta.malik@gmail.com> Reviewed-by: Amit Kapila <amit.kapila16@gmail.com> Discussion: https://postgr.es/m/OS9PR01MB16913F67856B0DA2A909788129400A@OS9PR01MB16913.jpnprd01.prod.outlook.com
This commit is contained in:
@@ -103,6 +103,7 @@
|
||||
#include "storage/proc.h"
|
||||
#include "storage/procarray.h"
|
||||
#include "utils/builtins.h"
|
||||
#include "utils/injection_point.h"
|
||||
#include "utils/memutils.h"
|
||||
#include "utils/timestamp.h"
|
||||
|
||||
@@ -2332,12 +2333,17 @@ RecordTransactionCommitPrepared(TransactionId xid,
|
||||
replorigin = (replorigin_session_origin != InvalidRepOriginId &&
|
||||
replorigin_session_origin != DoNotReplicateId);
|
||||
|
||||
/* Load the injection point before entering the critical section */
|
||||
INJECTION_POINT_LOAD("commit-after-delay-checkpoint");
|
||||
|
||||
START_CRIT_SECTION();
|
||||
|
||||
/* See notes in RecordTransactionCommit */
|
||||
Assert((MyProc->delayChkptFlags & DELAY_CHKPT_IN_COMMIT) == 0);
|
||||
MyProc->delayChkptFlags |= DELAY_CHKPT_IN_COMMIT;
|
||||
|
||||
INJECTION_POINT_CACHED("commit-after-delay-checkpoint", NULL);
|
||||
|
||||
/*
|
||||
* Ensures the DELAY_CHKPT_IN_COMMIT flag write is globally visible before
|
||||
* commit time is written.
|
||||
|
||||
Reference in New Issue
Block a user