summaryrefslogtreecommitdiff
path: root/doc/src
diff options
context:
space:
mode:
authorAmit Kapila <akapila@postgresql.org>2021-06-17 11:32:46 +0530
committerAmit Kapila <akapila@postgresql.org>2021-06-17 11:32:46 +0530
commitff33be61f212a521449565829904adab3e738524 (patch)
treee0e49a11f42ba4ca2a546c28645bb78b09d8cf12 /doc/src
parentfeac82fa8550b4ae483993674e1676911ebe0546 (diff)
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
Diffstat (limited to 'doc/src')
-rw-r--r--doc/src/sgml/logicaldecoding.sgml76
1 files changed, 57 insertions, 19 deletions
diff --git a/doc/src/sgml/logicaldecoding.sgml b/doc/src/sgml/logicaldecoding.sgml
index 42c004f1512..9b05636fa4e 100644
--- a/doc/src/sgml/logicaldecoding.sgml
+++ b/doc/src/sgml/logicaldecoding.sgml
@@ -691,27 +691,65 @@ OutputPluginWrite(ctx, true);
<sect1 id="logicaldecoding-synchronous">
<title>Synchronous Replication Support for Logical Decoding</title>
+ <sect2>
+ <title>Overview</title>
- <para>
- Logical decoding can be used to build
- <link linkend="synchronous-replication">synchronous
- replication</link> solutions with the same user interface as synchronous
- replication for <link linkend="streaming-replication">streaming
- replication</link>. To do this, the streaming replication interface
- (see <xref linkend="logicaldecoding-walsender">) must be used to stream out
- data. Clients have to send <literal>Standby status update (F)</literal>
- (see <xref linkend="protocol-replication">) messages, just like streaming
- replication clients do.
- </para>
-
- <note>
<para>
- A synchronous replica receiving changes via logical decoding will work in
- the scope of a single database. Since, in contrast to
- that, <parameter>synchronous_standby_names</parameter> 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
+ <link linkend="synchronous-replication">synchronous
+ replication</link> solutions with the same user interface as synchronous
+ replication for <link linkend="streaming-replication">streaming
+ replication</link>. To do this, the streaming replication interface
+ (see <xref linkend="logicaldecoding-walsender">) must be used to stream out
+ data. Clients have to send <literal>Standby status update (F)</literal>
+ (see <xref linkend="protocol-replication">) messages, just like streaming
+ replication clients do.
+ </para>
+
+ <note>
+ <para>
+ A synchronous replica receiving changes via logical decoding will work in
+ the scope of a single database. Since, in contrast to
+ that, <parameter>synchronous_standby_names</parameter> currently is
+ server wide, this means this technique will not work properly if more
+ than one database is actively used.
</para>
- </note>
+ </note>
+ </sect2>
+
+ <sect2 id="logicaldecoding-synchronous-caveats">
+ <title>Caveats</title>
+
+ <para>
+ 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:
+
+ <itemizedlist>
+ <listitem>
+ <para>
+ Issuing an explicit <command>LOCK</command> on <structname>pg_class</structname>
+ (or any other catalog table) in a transaction.
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+ Perform <command>CLUSTER</command> on <structname>pg_class</structname> in a
+ transaction.
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+ Executing <command>TRUNCATE</command> on [user] catalog table in a
+ transaction.
+ </para>
+ </listitem>
+ </itemizedlist>
+ </para>
+ </sect2>
</sect1>
</chapter>