mirror of
https://github.com/postgres/postgres.git
synced 2025-05-11 05:41:32 +03:00
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
This commit is contained in:
parent
38255f2d00
commit
6f25e48774
@ -555,8 +555,10 @@ CreateDecodingContext(XLogRecPtr start_lsn,
|
|||||||
/* Mark slot to allow two_phase decoding if not already marked */
|
/* Mark slot to allow two_phase decoding if not already marked */
|
||||||
if (ctx->twophase && !slot->data.two_phase)
|
if (ctx->twophase && !slot->data.two_phase)
|
||||||
{
|
{
|
||||||
|
SpinLockAcquire(&slot->mutex);
|
||||||
slot->data.two_phase = true;
|
slot->data.two_phase = true;
|
||||||
slot->data.two_phase_at = start_lsn;
|
slot->data.two_phase_at = start_lsn;
|
||||||
|
SpinLockRelease(&slot->mutex);
|
||||||
ReplicationSlotMarkDirty();
|
ReplicationSlotMarkDirty();
|
||||||
ReplicationSlotSave();
|
ReplicationSlotSave();
|
||||||
SnapBuildSetTwoPhaseAt(ctx->snapshot_builder, start_lsn);
|
SnapBuildSetTwoPhaseAt(ctx->snapshot_builder, start_lsn);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user