diff --git a/doc/src/sgml/logicaldecoding.sgml b/doc/src/sgml/logicaldecoding.sgml
index d2c6e155662..1765ea6c87e 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.)