From 5c64147714b85a4e62869b7f4bb65c2bedc72939 Mon Sep 17 00:00:00 2001
From: Tatsuo Ishii <ishii@postgresql.org>
Date: Tue, 28 Oct 2025 20:21:49 +0900
Subject: [PATCH v2] Retire Slony mode.

Previously Pgpool-II accepted "slony mode" as one of the
backend_clustering_mode to support Slony-I
(https://www.slony.info/). However the latest Slony-I was released in
2022, nearly 3 years ago at this point. And we heard nothing from
users about retiring Slony mode. This suggests that there would be no
active Slony-I mode users. So let's drop Slony-I support.

Author: Tatsuo Ishii <ishii@postgresql.org>
Reviewed-by: Bo Peng <pengbo@sraoss.co.jp>
Discussion: [pgpool-general: 9486] Retiring slony mode
	    https://www.pgpool.net/pipermail/pgpool-general/2025-May/009489.html
Discussion: https://www.postgresql.org/message-id/20250722.153130.1007226654125839063.ishii%40postgresql.org
---
 doc.ja/src/sgml/connection-settings.sgml      | 23 ---------------
 doc.ja/src/sgml/loadbalance.sgml              |  2 +-
 doc.ja/src/sgml/performance.sgml              |  2 +-
 doc.ja/src/sgml/restrictions.sgml             |  2 +-
 doc.ja/src/sgml/runtime.sgml                  | 26 +----------------
 doc/src/sgml/connection-settings.sgml         | 29 -------------------
 doc/src/sgml/performance.sgml                 |  2 +-
 doc/src/sgml/ref/pgpool_setup.sgml            |  2 +-
 doc/src/sgml/restrictions.sgml                |  2 +-
 doc/src/sgml/runtime.sgml                     | 19 +-----------
 src/config/pool_config_variables.c            |  1 -
 src/context/pool_query_context.c              |  2 +-
 src/include/pool.h                            |  4 +--
 src/include/pool_config.h                     |  8 -----
 src/protocol/pool_proto_modules.c             |  2 +-
 src/sample/pgpool.conf.sample-stream          |  2 +-
 src/test/pgpool_setup.in                      |  7 +----
 .../regression/tests/040.client_auth/test.sh  |  4 +--
 18 files changed, 15 insertions(+), 124 deletions(-)

diff --git a/doc.ja/src/sgml/connection-settings.sgml b/doc.ja/src/sgml/connection-settings.sgml
index 0a39e05ff..d70788340 100644
--- a/doc.ja/src/sgml/connection-settings.sgml
+++ b/doc.ja/src/sgml/connection-settings.sgml
@@ -1660,29 +1660,6 @@ backend_clustering_mode = logical_replication
   </para>
  </sect2>
 
- <sect2 id="runtime-config-slony-mode">
-  <title>Slonyモード</title>
-
-  <para>
-   このモードでは<productname>Pgpool-II</productname>を<acronym>Slony-I</acronym>と組み合わせて使用します。
-   Slony-Iが実際にデータのレプリケーションを行います。
-   このモードを有効にするには<varname>backend_clustering_mode</varname>にslonyを設定してください。
-    <programlisting>
-backend_clustering_mode = slony
-    </programlisting>
-   このモードでは127台までのレプリカサーバを使用できます。
-   また、レプリカサーバをまったく使用しないことも可能です。
-  </para>
-  <para>
-   このモードの難点は、検索問い合わせを負荷分散させた時に、スタンバイサーバのレプリケーション遅延を意識しなければならない点です。
-   ノードをまたがる可視性の一貫性も保証されません。
-   また、DDLやラージオブジェクトなど、一部のデータオブジェクトはレプリケーションされません。
-  </para>
-  <para>
-   ストリーミングレプリケーションやロジカルレプリケーションが登場後、Slony-Iを新規に採用するシステムは少ないので、特に理由がない限りこのモードを使用することはお勧めしません。
-  </para>
- </sect2>
-
  <sect2 id="guc-raw-mode" xreflabel="rawモード">
   <title>rawモード</title>
   <para>
diff --git a/doc.ja/src/sgml/loadbalance.sgml b/doc.ja/src/sgml/loadbalance.sgml
index 87cfa8e97..80cb27da5 100644
--- a/doc.ja/src/sgml/loadbalance.sgml
+++ b/doc.ja/src/sgml/loadbalance.sgml
@@ -8,7 +8,7 @@
 
  <para>
   <productname>Pgpool-II</productname>のSELECTクエリの負荷分散はrawモードを除くすべてのクラスタリングモードで動作します。
-    有効時、<productname>Pgpool-II</productname>は更新を伴うクエリを、ストリーミングレプリケーションモード、ロジカルレプリケーションモード、Slonyモードでは<acronym>プライマリノード</acronym>に、レプリケーションモードでは全てのバックエンドノードに対し送信します。
+    有効時、<productname>Pgpool-II</productname>は更新を伴うクエリを、ストリーミングレプリケーションモード、ロジカルレプリケーションモードでは<acronym>プライマリノード</acronym>に、レプリケーションモードでは全てのバックエンドノードに対し送信します。
     そして、その他のクエリは全てのバックエンドの間で負荷分散されます。
     <xref linkend="guc-statement-level-load-balance">が指定されている場合を除き、負荷分散メカニズムが参照クエリをどのノードに送信するかはセッション開始時に決められ、セッションの終了まで変更されません。
     ただし、いくつかの例外があります。
diff --git a/doc.ja/src/sgml/performance.sgml b/doc.ja/src/sgml/performance.sgml
index 5c188eed0..ae5fc4f83 100644
--- a/doc.ja/src/sgml/performance.sgml
+++ b/doc.ja/src/sgml/performance.sgml
@@ -142,7 +142,7 @@
  <sect1 id="read-query-load-balancing">
   <title>読み出しクエリの負荷分散</title>
   <para>
-   複数の<productname>PostgreSQL</productname>ノードがあり、<productname>Pgpool-II</productname>がストリーミングレプリケーションモード、ロジカルレプリケーションモード、slonyモード、レプリケーションモードで動作していると(これらの動作モードについては<xref linkend="running-mode">を参照のこと)、読み出しクエリをこれらのデータベースノードに分散させ、各々のノードにより少ない数のクエリを処理させることによってより高いスループットを得ることができます。
+   複数の<productname>PostgreSQL</productname>ノードがあり、<productname>Pgpool-II</productname>がストリーミングレプリケーションモード、ロジカルレプリケーションモード、レプリケーションモードで動作していると(これらの動作モードについては<xref linkend="running-mode">を参照のこと)、読み出しクエリをこれらのデータベースノードに分散させ、各々のノードにより少ない数のクエリを処理させることによってより高いスループットを得ることができます。
     この機能を使うためには、<xref linkend="guc-load-balance-mode">をonにする必要があります。
   </para>
 
diff --git a/doc.ja/src/sgml/restrictions.sgml b/doc.ja/src/sgml/restrictions.sgml
index 862dc7390..535b60c06 100644
--- a/doc.ja/src/sgml/restrictions.sgml
+++ b/doc.ja/src/sgml/restrictions.sgml
@@ -182,7 +182,7 @@
       In other mode, including Slony mode, large
       objects are not supported.
       -->
-      Slonyモードも含め、その他のモードではラージオブジェクトはサポートされていません。
+      その他のモードではラージオブジェクトはサポートされていません。
      </para>
     </listitem>
    </varlistentry>
diff --git a/doc.ja/src/sgml/runtime.sgml b/doc.ja/src/sgml/runtime.sgml
index 7bc450b4e..2931dacc9 100644
--- a/doc.ja/src/sgml/runtime.sgml
+++ b/doc.ja/src/sgml/runtime.sgml
@@ -239,10 +239,6 @@
        <entry>ロジカルレプリケーションモード</entry>
        <entry><literal>logical_replication</literal> </entry>
       </row>
-      <row>
-       <entry>slonyモード</entry>
-       <entry><literal>slony</literal></entry>
-      </row>
       <row>
        <entry>スナップショットアイソレーションモード</entry>
        <entry><literal>snapshot_isolation</literal></entry>
@@ -313,7 +309,7 @@
    </indexterm>
 
    <para>
-    <productname>Pgpool-II</>にはストリーミングレプリケーションモード、ロジカルレプリケーションモード、メインレプリカモード(Slonyモード)、ネイティブレプリケーションモード、スナップショットアイソレーションモード、rawモードの6つの<link linkend="guc-backend-clustering-mode">クラスタリングモード</link>があります。
+    <productname>Pgpool-II</>にはストリーミングレプリケーションモード、ロジカルレプリケーションモード、ネイティブレプリケーションモード、スナップショットアイソレーションモード、rawモードの6つの<link linkend="guc-backend-clustering-mode">クラスタリングモード</link>があります。
     いずれのモードにおいても、<productname>Pgpool-II</>はコネクションプーリング、自動フェイルオーバの機能を提供します。
     ストリーミングレプリケーションモード、ネイティブレプリケーションモード、スナップショットアイソレーションモードでは、更新処理を受け付けながらデータベースノードの同期を取り直すオンラインリカバリが利用可能です。
     オンラインリカバリの詳細については<xref linkend="runtime-online-recovery">を参照してください。
@@ -378,26 +374,6 @@ default_transaction_isolation = 'repeatable read'
     このことは、テーブルがレプリケーションされていない場合には、<productname>Pgpool-II</>がサブスクライバー側の更新されていない古いテーブルを見てしまうかもしれないことを意味します。
    </para>
 
-   <para>
-    <!--
-    The <firstterm>native replication mode</firstterm> mode (slony mode)
-    can be used with <productname>PostgreSQL</> servers
-    operating <productname>Slony</>. In this
-    mode, <productname>Slony</>/<productname>PostgreSQL</> is
-    responsible for synchronizing
-    databases. Since <productname>Slony-I</> is being obsoleted by
-    streaming replication, we do not recommend to use this mode
-    unless you have specific reason to
-    use <productname>Slony</>. Load balancing is possible in the
-    mode.
-    -->
-    <firstterm>メインレプリカモード</firstterm>(slonyモード)は<productname>Slony-I</>を使用する<productname>PostgreSQL</>サーバと一緒に使うことができます。
-    このモードでは、<productname>Slony</>/<productname>PostgreSQL</>がデータベースを同期する責任を持ちます。
-    <productname>Slony</>はストリーミングレプリケーションの登場により廃れつつあるため、<productname>Slony</>を使う特別な理由が無い限りこのモードの使用を推奨しません。
-    このモードでは負荷分散が可能です。
-   </para>
-
-
    <para>
     <!--
     In the raw mode, <productname>Pgpool-II</> does not care about the database
diff --git a/doc/src/sgml/connection-settings.sgml b/doc/src/sgml/connection-settings.sgml
index 0f78b9931..97eafa0fb 100644
--- a/doc/src/sgml/connection-settings.sgml
+++ b/doc/src/sgml/connection-settings.sgml
@@ -1212,35 +1212,6 @@ backend_clustering_mode = logical_replication
 
  </sect2>
 
- <sect2 id="runtime-config-slony-mode">
-  <title>Slony mode</title>
-
-  <para>
-   This mode is used to couple <productname>Pgpool-II</productname>
-   with <acronym>Slony-I</acronym>.  Slony-I is responsible for doing
-   the actual data replication. To enable this mode, use slony for
-   <varname>backend_clustering_mode</varname>.
-    <programlisting>
-backend_clustering_mode = slony
-    </programlisting>
-   In this mode you can have up to 127 replica servers.  Also it is
-   possible not to have replica server at all.
-  </para>
-
-  <para>
-   The drawback of this mode is, it is necessary to consider the
-   replication delay while distributing read queries. The visibility
-   consistency among nodes is not guaranteed either.  Also certain
-   kind of objects such as DDL and large objects are not replicated.
-  </para>
-
-  <para>
-   After streaming replication and logical replication are introduced,
-   there are few systems that employ Slony-I.  If there's no
-   particular reason, it is not recommended to use this mode.
-  </para>
- </sect2>
-
  <sect2 id="guc-raw-mode" xreflabel="raw mode">
   <title>Raw mode</title>
   <para>
diff --git a/doc/src/sgml/performance.sgml b/doc/src/sgml/performance.sgml
index 8657ea97d..be9f0c72f 100644
--- a/doc/src/sgml/performance.sgml
+++ b/doc/src/sgml/performance.sgml
@@ -202,7 +202,7 @@
   <para>
    If there are multiple <productname>PostgreSQL</productname>
    nodes and <productname>Pgpool-II</productname> operates in
-   streaming replication mode, logical replication mode, slony mode
+   streaming replication mode, logical replication mode,
    or replication mode (for those running mode
    see <xref linkend="running-mode"> for more details), it is
     possible to distribute read queries among those database nodes
diff --git a/doc/src/sgml/ref/pgpool_setup.sgml b/doc/src/sgml/ref/pgpool_setup.sgml
index 57d735a90..ab8fd2771 100644
--- a/doc/src/sgml/ref/pgpool_setup.sgml
+++ b/doc/src/sgml/ref/pgpool_setup.sgml
@@ -73,7 +73,7 @@ Pgpool-II documentation
        Specifies the running mode.  <replaceable>mode</replaceable>
        can be <literal>r</literal> (native replication mode), <literal>s</literal> (streaming replication mode),
        <literal>n</literal> (raw mode), <literal>l</literal>
-       (logical replication mode), <literal>y</literal> (slony mode) or <literal>i</literal> (snapshot isolation mode).  If this is
+       (logical replication mode), or <literal>i</literal> (snapshot isolation mode).  If this is
        omitted, <literal>s</literal> is assumed.
       </para>
      </listitem>
diff --git a/doc/src/sgml/restrictions.sgml b/doc/src/sgml/restrictions.sgml
index f1f5eb687..c8444b5c4 100644
--- a/doc/src/sgml/restrictions.sgml
+++ b/doc/src/sgml/restrictions.sgml
@@ -124,7 +124,7 @@
       supported, however.
      </para>
      <para>
-      In other mode, including Slony mode, large
+      In other mode, large
       objects are not supported.
      </para>
     </listitem>
diff --git a/doc/src/sgml/runtime.sgml b/doc/src/sgml/runtime.sgml
index 0fe7ecabc..077b0e014 100644
--- a/doc/src/sgml/runtime.sgml
+++ b/doc/src/sgml/runtime.sgml
@@ -167,10 +167,6 @@
        <entry>Logical replication mode</entry>
        <entry><literal>logical_replication</literal> </entry>
       </row>
-      <row>
-       <entry>Slony mode</entry>
-       <entry><literal>slony</literal></entry>
-      </row>
       <row>
        <entry>Snapshot isolation mode</entry>
        <entry><literal>snapshot_isolation</literal></entry>
@@ -221,7 +217,7 @@
    <para>
     There are six different <link linkend="guc-backend-clustering-mode">clustering modes</link> in
     <productname>Pgpool-II</>: streaming replication mode, logical
-    replication mode, main replica mode (slony mode), native
+    replication mode, native
     replication mode, raw mode and snapshot isolation mode. In any
     mode, <productname>Pgpool-II</> provides connection pooling, and
     automatic fail over.  Online recovery can be used only with
@@ -305,19 +301,6 @@ default_transaction_isolation = 'repeatable read'
     in the subscriber side.
    </para>
 
-   <para>
-    The <firstterm>main replica mode</firstterm> (slony mode)
-    can be used with <productname>PostgreSQL</> servers
-    operating <productname>Slony</>. In this
-    mode, <productname>Slony</>/<productname>PostgreSQL</> is
-    responsible for synchronizing
-    databases. Since <productname>Slony-I</> is being obsoleted by
-    streaming replication, we do not recommend to use this mode
-    unless you have specific reason to
-    use <productname>Slony</>. Load balancing is possible in the
-    mode.
-   </para>
-
    <para>
     In the <firstterm>raw
      mode</firstterm>, <productname>Pgpool-II</> does not care about
diff --git a/src/config/pool_config_variables.c b/src/config/pool_config_variables.c
index 50f0b0e03..62a05979a 100644
--- a/src/config/pool_config_variables.c
+++ b/src/config/pool_config_variables.c
@@ -232,7 +232,6 @@ static const struct config_enum_entry backend_clustering_mode_options[] = {
 	{"streaming_replication", CM_STREAMING_REPLICATION, false},
 	{"native_replication", CM_NATIVE_REPLICATION, false},
 	{"logical_replication", CM_LOGICAL_REPLICATION, false},
-	{"slony", CM_SLONY, false},
 	{"raw", CM_RAW, false},
 	{"snapshot_isolation", CM_SNAPSHOT_ISOLATION, false},
 	{NULL, 0, false}
diff --git a/src/context/pool_query_context.c b/src/context/pool_query_context.c
index a4800d94b..1a13168c6 100644
--- a/src/context/pool_query_context.c
+++ b/src/context/pool_query_context.c
@@ -1983,7 +1983,7 @@ dml_adaptive(Node *node, char *query)
 
 /*
  * Decide the backend node to be sent in streaming replication mode, logical
- * replication mode and slony mode.  Called by pool_where_to_send.
+ * replication mode.  Called by pool_where_to_send.
  */
 static void
 where_to_send_main_replica(POOL_QUERY_CONTEXT *query_context, char *query, Node *node)
diff --git a/src/include/pool.h b/src/include/pool.h
index 6f94c4b07..ea6f87e12 100644
--- a/src/include/pool.h
+++ b/src/include/pool.h
@@ -410,11 +410,9 @@ typedef enum
 #define REPLICATION (pool_config->backend_clustering_mode == CM_NATIVE_REPLICATION || \
 					 pool_config->backend_clustering_mode == CM_SNAPSHOT_ISOLATION)
 #define MAIN_REPLICA (pool_config->backend_clustering_mode == CM_STREAMING_REPLICATION || \
-					  pool_config->backend_clustering_mode == CM_LOGICAL_REPLICATION || \
-					  pool_config->backend_clustering_mode == CM_SLONY)
+					  pool_config->backend_clustering_mode == CM_LOGICAL_REPLICATION)
 #define STREAM (pool_config->backend_clustering_mode == CM_STREAMING_REPLICATION)
 #define LOGICAL (pool_config->backend_clustering_mode == CM_LOGICAL_REPLICATION)
-#define SLONY (pool_config->backend_clustering_mode == CM_SLONY)
 #define RAW_MODE (pool_config->backend_clustering_mode == CM_RAW)
 #define SL_MODE (STREAM || LOGICAL) /* streaming or logical replication mode */
 
diff --git a/src/include/pool_config.h b/src/include/pool_config.h
index 7cf5460f3..9160a31c8 100644
--- a/src/include/pool_config.h
+++ b/src/include/pool_config.h
@@ -70,19 +70,11 @@ typedef enum ProcessManagementSstrategies
 	PM_STRATEGY_LAZY
 } ProcessManagementSstrategies;
 
-typedef enum NativeReplicationSubModes
-{
-	SLONY_MODE = 1,
-	STREAM_MODE,
-	LOGICAL_MODE
-}			NativeReplicationSubModes;
-
 typedef enum ClusteringModes
 {
 	CM_STREAMING_REPLICATION = 1,
 	CM_NATIVE_REPLICATION,
 	CM_LOGICAL_REPLICATION,
-	CM_SLONY,
 	CM_RAW,
 	CM_SNAPSHOT_ISOLATION
 } ClusteringModes;
diff --git a/src/protocol/pool_proto_modules.c b/src/protocol/pool_proto_modules.c
index 4560cab6d..9f31442b7 100644
--- a/src/protocol/pool_proto_modules.c
+++ b/src/protocol/pool_proto_modules.c
@@ -1609,7 +1609,7 @@ Parse(POOL_CONNECTION *frontend, POOL_CONNECTION_POOL *backend,
 		}
 	}
 
-	if (REPLICATION || SLONY)
+	if (REPLICATION)
 	{
 		/*
 		 * We must synchronize because Parse message acquires table locks.
diff --git a/src/sample/pgpool.conf.sample-stream b/src/sample/pgpool.conf.sample-stream
index dcccb57a6..ba6b923b0 100644
--- a/src/sample/pgpool.conf.sample-stream
+++ b/src/sample/pgpool.conf.sample-stream
@@ -20,7 +20,7 @@
 #------------------------------------------------------------------------------
 # BACKEND CLUSTERING MODE
 # Choose one of: streaming_replication, native_replication,
-#	logical_replication, slony, raw or snapshot_isolation
+#	logical_replication, raw or snapshot_isolation
 # (change requires restart)
 #------------------------------------------------------------------------------
 
diff --git a/src/test/pgpool_setup.in b/src/test/pgpool_setup.in
index d44cf5b59..8715e1d26 100644
--- a/src/test/pgpool_setup.in
+++ b/src/test/pgpool_setup.in
@@ -23,7 +23,6 @@
 # -m r: create an installation as native replication mode.
 # -m n: create an installation as raw mode.
 # -m l: create an installation as logical replication mode.
-# -m y: create an installation as slony mode.
 # -m i: create an installation as snapshot isolation mode.
 # -n num_clusters: create num_clusters PostgreSQL database cluster nodes
 # -p base_port: specify base port. pgpool port is base_port.
@@ -1171,7 +1170,7 @@ EOF
 ################################################################################
 function usage()
 {
-	echo "usage: $0 [-m r|s|n|l|y|i] [-n num_clusters] [-p base_port] [-pg pg_base_port][--no-stop] [-d] [-s] [-r] [-e] [-t] [-c]";exit 1
+	echo "usage: $0 [-m r|s|n|l|i] [-n num_clusters] [-p base_port] [-pg pg_base_port][--no-stop] [-d] [-s] [-r] [-e] [-t] [-c]";exit 1
 }
 
 #-------------------------------------------
@@ -1195,7 +1194,6 @@ do
 			s ) MODE="s";;
 			n ) MODE="n";;
 			l ) MODE="l";;
-			y ) MODE="y";;
 			i ) MODE="i";;
 			* ) usage;;
 		esac
@@ -1247,9 +1245,6 @@ case $MODE in
 	l ) MODENAME="logical replication mode"
 	    CLUSTERING_MODE_STR="logical_replication"
 	    ;;
-	y ) MODENAME="slony mode"
-	    CLUSTERING_MODE_STR="slony"
-	    ;;
 	i ) MODENAME="snapshot isolation mode"
 	    CLUSTERING_MODE_STR="snapshot_isolation"
 	    ;;
diff --git a/src/test/regression/tests/040.client_auth/test.sh b/src/test/regression/tests/040.client_auth/test.sh
index 964e9293e..c0b2c3331 100755
--- a/src/test/regression/tests/040.client_auth/test.sh
+++ b/src/test/regression/tests/040.client_auth/test.sh
@@ -278,9 +278,9 @@ function do_auth
 
 	    add_user $username $pg_hba $PGPORT
 
-	    # for logical replication and slony, we need to manually
+	    # for logical replication, we need to manually
 	    # add PostgreSQL user to node 1.
-	    if [ $mode = 'l' -o $mode = 'y' ];then
+	    if [ $mode = 'l' ];then
 		add_user $username $pg_hba "11003"
 	    fi
 	    add_pool_hba $username $pool_hba $PGPOOL_VERSION_DIGIT
-- 
2.43.0

