aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMichael Paquier <michael@paquier.xyz>2023-01-12 13:41:22 +0900
committerMichael Paquier <michael@paquier.xyz>2023-01-12 13:41:22 +0900
commit6f25e48774fe9302ca08dae07420df95998d792a (patch)
tree2ea48224f9895ce2bb8ab9108f160ff21c99a0a2 /src
parent38255f2d0059a101c3fb791d6523a9e66e55aa66 (diff)
downloadpostgresql-6f25e48774fe9302ca08dae07420df95998d792a.tar.gz
postgresql-6f25e48774fe9302ca08dae07420df95998d792a.zip
Acquire spinlock when updating 2PC slot data during logical decoding creation
The creation of a logical decoding context in CreateDecodingContext() updates some data of its slot for two-phase transactions if enabled by the caller, but the code forgot to acquire a spinlock when updating these fields like any other code paths. This could lead to the read of inconsistent data. Oversight in a8fd13c. Author: Sawada Masahiko Discussion: https://postgr.es/m/CAD21AoAD8_fp47191LKuecjDd3DYhoQ4TaucFco1_TEr_jQ-Zw@mail.gmail.com Backpatch-through: 15
Diffstat (limited to 'src')
-rw-r--r--src/backend/replication/logical/logical.c2
1 files changed, 2 insertions, 0 deletions
diff --git a/src/backend/replication/logical/logical.c b/src/backend/replication/logical/logical.c
index 625a7f42730..466f30c22d9 100644
--- a/src/backend/replication/logical/logical.c
+++ b/src/backend/replication/logical/logical.c
@@ -555,8 +555,10 @@ CreateDecodingContext(XLogRecPtr start_lsn,
/* Mark slot to allow two_phase decoding if not already marked */
if (ctx->twophase && !slot->data.two_phase)
{
+ SpinLockAcquire(&slot->mutex);
slot->data.two_phase = true;
slot->data.two_phase_at = start_lsn;
+ SpinLockRelease(&slot->mutex);
ReplicationSlotMarkDirty();
ReplicationSlotSave();
SnapBuildSetTwoPhaseAt(ctx->snapshot_builder, start_lsn);