From: Michael Paquier Date: Thu, 12 Jan 2023 04:40:33 +0000 (+0900) Subject: Acquire spinlock when updating 2PC slot data during logical decoding creation X-Git-Tag: REL_16_BETA1~944 X-Git-Url: http://git.postgresql.org/gitweb/?a=commitdiff_plain;h=5ad165d2c024ae2fdc0a5ddd17522d5c92d7aa1a;p=postgresql.git 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 --- diff --git a/src/backend/replication/logical/logical.c b/src/backend/replication/logical/logical.c index 52d1fe62691..1a58dd76497 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);