From 3cb828dbe26087e7754f49f3cfe3ed036d5af439 Mon Sep 17 00:00:00 2001 From: Amit Kapila Date: Thu, 17 Jun 2021 09:56:05 +0530 Subject: [PATCH] Document a few caveats in synchronous logical replication. In a synchronous logical setup, locking [user] catalog tables can cause deadlock. This is because logical decoding of transactions can lock catalog tables to access them so exclusively locking those in transactions can lead to deadlock. To avoid this users must refrain from having exclusive locks on catalog tables. Author: Takamichi Osumi Reviewed-by: Vignesh C, Amit Kapila Backpatch-through: 9.6 Discussion: https://www.postgresql.org/message-id/20210222222847.tpnb6eg3yiykzpky%40alap3.anarazel.de --- doc/src/sgml/logicaldecoding.sgml | 100 +++++++++++++++++++++++------- 1 file changed, 78 insertions(+), 22 deletions(-) diff --git a/doc/src/sgml/logicaldecoding.sgml b/doc/src/sgml/logicaldecoding.sgml index d2c6e15566..1765ea6c87 100644 --- a/doc/src/sgml/logicaldecoding.sgml +++ b/doc/src/sgml/logicaldecoding.sgml @@ -1066,28 +1066,83 @@ OutputPluginWrite(ctx, true); Synchronous Replication Support for Logical Decoding + + Overview - - Logical decoding can be used to build - synchronous - replication solutions with the same user interface as synchronous - replication for streaming - replication. To do this, the streaming replication interface - (see ) must be used to stream out - data. Clients have to send Standby status update (F) - (see ) messages, just like streaming - replication clients do. - - - - A synchronous replica receiving changes via logical decoding will work in - the scope of a single database. Since, in contrast to - that, synchronous_standby_names currently is - server wide, this means this technique will not work properly if more - than one database is actively used. + Logical decoding can be used to build + synchronous + replication solutions with the same user interface as synchronous + replication for streaming + replication. To do this, the streaming replication interface + (see ) must be used to stream out + data. Clients have to send Standby status update (F) + (see ) messages, just like streaming + replication clients do. + + + + + A synchronous replica receiving changes via logical decoding will work in + the scope of a single database. Since, in contrast to + that, synchronous_standby_names currently is + server wide, this means this technique will not work properly if more + than one database is actively used. - + + + + + Caveats + + + In synchronous replication setup, a deadlock can happen, if the transaction + has locked [user] catalog tables exclusively. This is because logical decoding of + transactions can lock catalog tables to access them. To avoid this users + must refrain from taking an exclusive lock on [user] catalog tables. This can + happen in the following ways: + + + + + Issuing an explicit LOCK on pg_class + (or any other catalog table) in a transaction. + + + + + + Perform CLUSTER on pg_class in + a transaction. + + + + + + PREPARE TRANSACTION after LOCK command + on pg_class and allow logical decoding of two-phase + transactions. + + + + + + PREPARE TRANSACTION after CLUSTER + command on pg_trigger and allow logical decoding of + two-phase transactions. This will lead to deadlock only when published table + have a trigger. + + + + + + Executing TRUNCATE on [user] catalog table in a + transaction. + + + + + @@ -1253,9 +1308,10 @@ stream_commit_cb(...); <-- commit of the streamed transaction The logical replication solution that builds distributed two phase commit using this feature can deadlock if the prepared transaction has locked - [user] catalog tables exclusively. They need to inform users to not have - locks on catalog tables (via explicit LOCK command) in - such transactions. + [user] catalog tables exclusively. To avoid this users must refrain from + having locks on catalog tables (e.g. explicit LOCK command) + in such transactions. + (See for the details.) -- 2.39.5