Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1vhs8C-008MMG-15 for pgsql-hackers@arkaria.postgresql.org; Mon, 19 Jan 2026 16:29:33 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1vhs8B-00DqH0-1b for pgsql-hackers@arkaria.postgresql.org; Mon, 19 Jan 2026 16:29:31 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1vhs8A-00DqGn-2z for pgsql-hackers@lists.postgresql.org; Mon, 19 Jan 2026 16:29:31 +0000 Received: from mail-wm1-x32b.google.com ([2a00:1450:4864:20::32b]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.96) (envelope-from ) id 1vhs88-001Gqm-0G for pgsql-hackers@lists.postgresql.org; Mon, 19 Jan 2026 16:29:30 +0000 Received: by mail-wm1-x32b.google.com with SMTP id 5b1f17b1804b1-47fedb7c68dso30339465e9.2 for ; Mon, 19 Jan 2026 08:29:28 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=cybertec.at; s=google; t=1768840167; x=1769444967; darn=lists.postgresql.org; h=message-id:date:mime-version:subject:to:from:from:to:cc:subject :date:message-id:reply-to; bh=TxCCyAbX205Bcv3sHmr7bOJSWqa2yx9eLnnksGCbZ54=; b=iEM2ctd0gXxvpP9j+IEvlnMvSeyHnMXF4Q0ddfJx7du0ShUTmmyyKXdt8XCvoNb+3j Om0wXw3ZDs1dqyJj0Y3d8cuB1mI7xQlxwdOuNT9LgG5WlSIDuEoWXnIsiPJdF3XfN/ZX yFYKijp2Q2dECwL/mU9ii7L5YP8VJlpkLQKz4fcIDOP/0d7d6/iS+S3Pbh6WhScuQ6qt 8+5HBtFXSGQeNfpHlZAuNNpnbS/7RBn98bCpz2agRgXas9oGyW4lnaIpxzzT8lo4NQ89 VzERuquyJ1YTtJYw2Mcdj9KSE5FKUvChqc7c9hVAVI0fXkB0Zn09GM5JYO8ZK7D7pps+ l9pw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1768840167; x=1769444967; h=message-id:date:mime-version:subject:to:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=TxCCyAbX205Bcv3sHmr7bOJSWqa2yx9eLnnksGCbZ54=; b=GlgqRldkr2ZOmwfKWg5fT6HTKsRdxurASeadRvSV6jVtcnmuiV23vMExtqqnLwPzVJ syF664R7JmwcTioEOCukSnJuolp3QVvGOhIQsy6DOzXdglxslRaBPkZ9/rjL1wBJGVxZ 8tIZehdQci+rFysXAeMZdkSwpvqbXvsv0vccXATxZkGZTL0umoEcEv2QHDVDxBZbT606 kMTqDZ39AOlGfANYDYSnvM5m8XZfkc2BQGDwQ7hBGoKsopbPQsDgvt6/Qm/0VQEeg641 pUWe3SSbmcgAJlCJ6WshVyntGEDsk4DGIE6haV1DCCN9+Mpfw6Hsxj5j9S1tuZpkbTBm ytdg== X-Gm-Message-State: AOJu0YwIvb5J6+i1NsCMxx1YWq2BrLT8sSqh88APystCZk8N77ZltmyW Dhr2Iy9IOrDXNa33IxgoYJF7fGx/FL7pXRzx58NnsoZ6Y4kw3/6jzObL+Q5bR81Qt9KEIBgzCFX laQ8c X-Gm-Gg: AY/fxX7y2NCW5avK3YnH0Z+Z8IVMRwiFDzw8lRQysAxZ/DS6TvimSE+vbFUgHv8+M/0 9ZnVBm8NZTwL7SJlnt+PVzUHYMNSw8ZSfKA248x1CmiK/B/0V9HKbC2pFbVy5uila1PoLPjYDju 96UJ+LJDgmHW7wDrrbsHP8wz6KNCFjSVKcFabFqKrD7Mf8zmRs+iQmxzGCKcbY8vvJWARaC3cIp W+/eqBd7UmY/muMUop7T10RuZ5Ggra2+lyIcjVCV/MT9BDpBBwpYNbP+o4fthjQU1vdZV/GtQF/ E/4OQOoCKQg9DHHsJRShxG39AaNE/8Fn7EbM1GKkD+wy8JUomeVjTfpQMKFvTB7ZOlY8UJ4NN+7 RsuuU1BCUiSESFhGJvsVa59lSKnyD2dgkMe4LHmxPe2Iuy6BgGW5iQGmbwfGA3V02HpuSLjVH9k BXgn/GEy9hY4LoF8ZJ0G0JYY1a X-Received: by 2002:a05:600c:458d:b0:47f:f952:d207 with SMTP id 5b1f17b1804b1-4801e341e2emr124665335e9.19.1768840166591; Mon, 19 Jan 2026 08:29:26 -0800 (PST) Received: from localhost (109-81-168-246.rct.o2.cz. [109.81.168.246]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-47f429071a2sm254180905e9.11.2026.01.19.08.29.25 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 19 Jan 2026 08:29:25 -0800 (PST) From: Antonin Houska To: pgsql-hackers@lists.postgresql.org Subject: Race conditions in logical decoding X-Mailer: MH-E 8.6+git; nmh 1.8; GNU Emacs 28.3 MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" Date: Mon, 19 Jan 2026 17:29:25 +0100 Message-ID: <85833.1768840165@localhost> List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --=-=-= Content-Type: text/plain A stress test [1] for the REPACK patch [1] revealed data corruption. Eventually I found out that the problem is in postgres core. In particular, it can happen that a COMMIT record is decoded, but before the commit could be recorded in CLOG, a snapshot that takes the commit into account is created and even used. Visibility checks then work incorrectly until the CLOG gets updated. In logical replication, the consequences are not only wrong data on the subscriber, but also corrutped table on publisher - this is due to incorrectly set commit hint bits. Attached is a spec file that demonstrates the issue. I did not add it to Makefile because I don't expect the current version to be merged (see the commit message for details. I'm not sure yet how to fix the problem. I tried to call XactLockTableWait() from SnapBuildAddCommittedTxn() (like it happens in SnapBuildWaitSnapshot()), but it made at least one regression test (subscription/t/010_truncate.pl) stuck - probably a deadlock. I can spend more time on it, but maybe someone can come up with a good idea sooner than me. [1] https://www.postgresql.org/message-id/CADzfLwU78as45To9a%3D-Qkr5jEg3tMxc5rUtdKy2MTv4r_SDGng%40mail.gmail.com [2] https://commitfest.postgresql.org/patch/5117/ -- Antonin Houska Web: https://www.cybertec-postgresql.com --=-=-= Content-Type: text/x-diff Content-Disposition: attachment; filename=0001-Demonstrate-possible-race-conditions-in-logical-decoding.patch