pgpool2.git / summary / log / commit / refs
commit dfc568688ef03d41fc327b55d0a2bccb015a497d
Author: Tatsuo Ishii <ishii@sraoss.co.jp>
Date: Tue Feb 25 08:05:16 2020 +0000
Add pgpool_adm's pcp_health_check_stats function.
doc.ja/src/sgml/ref/allfiles.sgml | 1 +
.../ref/pgpool_adm_pcp_health_check_stats.sgml | 163 +++++++++++++++++++++
doc.ja/src/sgml/reference.sgml | 1 +
doc/src/sgml/ref/allfiles.sgml | 1 +
.../ref/pgpool_adm_pcp_health_check_stats.sgml | 162 ++++++++++++++++++++
doc/src/sgml/reference.sgml | 1 +
src/sql/pgpool_adm/Makefile | 3 +-
src/sql/pgpool_adm/pgpool_adm--1.1--1.2.sql | 6 +-
src/sql/pgpool_adm/pgpool_adm--1.2--1.3.sql | 10 ++
src/sql/pgpool_adm/pgpool_adm--1.3.sql | 101 +++++++++++++
src/sql/pgpool_adm/pgpool_adm.c | 163 ++++++++++++++++++++-
src/sql/pgpool_adm/pgpool_adm.control | 2 +-
src/sql/pgpool_adm/pgpool_adm.h | 2 +
13 files changed, 608 insertions(+), 8 deletions(-)
diff --git a/doc.ja/src/sgml/ref/allfiles.sgml b/doc.ja/src/sgml/ref/allfiles.sgml
index 195ae28db..ec82045ab 100644
--- a/doc.ja/src/sgml/ref/allfiles.sgml
+++ b/doc.ja/src/sgml/ref/allfiles.sgml
@@ -34,6 +34,7 @@ Complete list of usable sgml source files in this directory.
<!ENTITY showPoolCache SYSTEM "show_pool_cache.sgml">
<!ENTITY showPoolHealthCheckStats SYSTEM "show_pool_health_check_stats.sgml">
<!ENTITY pgpoolAdmPcpNodeInfo SYSTEM "pgpool_adm_pcp_node_info.sgml">
+<!ENTITY pgpoolAdmPcpHealthCheckStats SYSTEM "pgpool_adm_pcp_health_check_stats.sgml">
<!ENTITY pgpoolAdmPcpPoolStatus SYSTEM "pgpool_adm_pcp_pool_status.sgml">
<!ENTITY pgpoolAdmPcpNodeCount SYSTEM "pgpool_adm_pcp_node_count.sgml">
<!ENTITY pgpoolAdmPcpAttachNode SYSTEM "pgpool_adm_pcp_attach_node.sgml">
diff --git a/doc.ja/src/sgml/ref/pgpool_adm_pcp_health_check_stats.sgml b/doc.ja/src/sgml/ref/pgpool_adm_pcp_health_check_stats.sgml
new file mode 100644
index 000000000..cbbe263c7
--- /dev/null
+++ b/doc.ja/src/sgml/ref/pgpool_adm_pcp_health_check_stats.sgml
@@ -0,0 +1,163 @@
+<!--
+doc/src/sgml/ref/pgpool_adm_pcp_health_check_stats.sgml
+Pgpool-II documentation
+-->
+
+<refentry id="PGPOOL-ADM-PCP-HEAlTH-CHECK-STATS">
+ <indexterm zone="pgpool-adm-pcp-health-check-stats">
+ <primary>pgpool_adm_pcp_health_check_stats</primary>
+ </indexterm>
+
+ <refmeta>
+ <refentrytitle>pgpool_adm_pcp_health_check_stats</refentrytitle>
+ <manvolnum>3</manvolnum>
+ <refmiscinfo>pgpool_adm extension</refmiscinfo>
+ </refmeta>
+
+ <refnamediv>
+ <refname>pgpool_adm_pcp_health_check_stats</refname>
+ <refpurpose>
+ 与えられたノードIDのヘルスチェック統計データを表示する関数
+ </refpurpose>
+ </refnamediv>
+
+ <refsynopsisdiv>
+ <funcsynopsis>
+ <funcprototype>
+ <funcdef><function>pcp_health_check_stats</function> returns record</funcdef>
+ <paramdef>integer <parameter>node_id</parameter></paramdef>
+ <paramdef>text <parameter>host</parameter></paramdef>
+ <paramdef>integer <parameter>port</parameter></paramdef>
+ <paramdef>text <parameter>username</parameter></paramdef>
+ <paramdef>text <parameter>password</parameter></paramdef>
+ <paramdef>out <parameter>node_id integer</parameter></paramdef>
+ <paramdef>out <parameter>host text</parameter></paramdef>
+ <paramdef>out <parameter>port integer</parameter></paramdef>
+ <paramdef>out <parameter>status text</parameter></paramdef>
+ <paramdef>out <parameter>role text</parameter></paramdef>
+ <paramdef>out <parameter>last_status_change timestamp</parameter></paramdef>
+ <paramdef>out <parameter>total_count bigint</parameter></paramdef>
+ <paramdef>out <parameter>success_count bigint</parameter></paramdef>
+ <paramdef>out <parameter>fail_count bigint</parameter></paramdef>
+ <paramdef>out <parameter>skip_count bigint</parameter></paramdef>
+ <paramdef>out <parameter>retry_count bigint</parameter></paramdef>
+ <paramdef>out <parameter>average_retry_count bigint</parameter></paramdef>
+ <paramdef>out <parameter>max_retry_count bigint</parameter></paramdef>
+ <paramdef>out <parameter>max_health_check_duration bigint</parameter></paramdef>
+ <paramdef>out <parameter>min_health_check_duration bigint</parameter></paramdef>
+ <paramdef>out <parameter>average_health_check_duration float4</parameter></paramdef>
+ <paramdef>out <parameter>last_health_check timestamp</parameter></paramdef>
+ <paramdef>out <parameter>last_successful_health_check timestamp</parameter></paramdef>
+ <paramdef>out <parameter>last_skip_health_check timestamp</parameter></paramdef>
+ <paramdef>out <parameter>last_failed_health_check timestamp</parameter></paramdef>
+ </funcprototype>
+
+ <funcprototype>
+ <funcdef><function>pcp_health_check_stats</function> returns record</funcdef>
+ <paramdef>integer <parameter>node_id</parameter></paramdef>
+ <paramdef>text <parameter>pcp_server</parameter></paramdef>
+ <paramdef>out <parameter>node_id integer</parameter></paramdef>
+ <paramdef>out <parameter>host text</parameter></paramdef>
+ <paramdef>out <parameter>port integer</parameter></paramdef>
+ <paramdef>out <parameter>status text</parameter></paramdef>
+ <paramdef>out <parameter>role text</parameter></paramdef>
+ <paramdef>out <parameter>last_status_change timestamp</parameter></paramdef>
+ <paramdef>out <parameter>total_count bigint</parameter></paramdef>
+ <paramdef>out <parameter>success_count bigint</parameter></paramdef>
+ <paramdef>out <parameter>fail_count bigint</parameter></paramdef>
+ <paramdef>out <parameter>skip_count bigint</parameter></paramdef>
+ <paramdef>out <parameter>retry_count bigint</parameter></paramdef>
+ <paramdef>out <parameter>average_retry_count bigint</parameter></paramdef>
+ <paramdef>out <parameter>max_retry_count bigint</parameter></paramdef>
+ <paramdef>out <parameter>max_health_check_duration bigint</parameter></paramdef>
+ <paramdef>out <parameter>min_health_check_duration bigint</parameter></paramdef>
+ <paramdef>out <parameter>average_health_check_duration float4</parameter></paramdef>
+ <paramdef>out <parameter>last_health_check timestamp</parameter></paramdef>
+ <paramdef>out <parameter>last_successful_health_check timestamp</parameter></paramdef>
+ <paramdef>out <parameter>last_skip_health_check timestamp</parameter></paramdef>
+ <paramdef>out <parameter>last_failed_health_check timestamp</parameter></paramdef>
+ </funcprototype>
+
+ </funcsynopsis>
+ </refsynopsisdiv>
+
+ <refsect1 id="R3-PCP-HEALTH-CHECK-STATS-3">
+ <title>説明</title>
+ <para>
+ <function>pcp_health_check_stats</function>
+ 与えられたノードIDのヘルスチェック統計データを表示します。
+ </para>
+ </refsect1>
+
+ <refsect1>
+ <title>引数</title>
+ <para>
+ <variablelist>
+
+ <varlistentry>
+ <term><replaceable class="parameter">node_id</replaceable></term>
+ <listitem>
+ <para>
+ 情報を取得するバックエンドノード
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><replaceable class="parameter">pcp_server</replaceable></term>
+ <listitem>
+ <para>
+ pcpサーバの外部サーバ名
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><option>他の引数</option></term>
+ <listitem>
+ <para>
+ <xref linkend="pcp-common-options">を参照ください。
+ </para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </para>
+ </refsect1>
+
+ <refsect1>
+ <title>使用例</title>
+ <para>
+ 使用例です。
+ <programlisting>
+test=# select * from pcp_health_check_stats(0,'',11001,'t-ishii','t-ishii');
+-[ RECORD 1 ]-----------------+--------------------
+node_id | 0
+host | /tmp
+port | 11002
+status | up
+role | primary
+last_status_change | 2020-02-25 16:05:29
+total_count | 3
+success_count | 3
+fail_count | 0
+skip_count | 0
+retry_count | 0
+average_retry_count | 0
+max_retry_count | 0
+max_health_check_duration | 5
+min_health_check_duration | 3
+average_health_check_duration | 4.333333
+last_health_check | 2020-02-25 16:05:47
+last_successful_health_check | 2020-02-25 16:05:47
+last_skip_health_check |
+last_failed_health_check |
+ </programlisting>
+ </para>
+
+ <para>
+ 表示データの詳細に関しては<xref linkend="health-check-stats-data-table">をご覧ください。
+ </para>
+
+ </refsect1>
+
+</refentry>
diff --git a/doc.ja/src/sgml/reference.sgml b/doc.ja/src/sgml/reference.sgml
index 2393fef0f..4333af8d9 100644
--- a/doc.ja/src/sgml/reference.sgml
+++ b/doc.ja/src/sgml/reference.sgml
@@ -345,6 +345,7 @@
</partintro>
&pgpoolAdmPcpNodeInfo
+ &pgpoolAdmPcpHealthCheckStats
&pgpoolAdmPcpPoolStatus
&pgpoolAdmPcpNodeCount
&pgpoolAdmPcpAttachNode
diff --git a/doc/src/sgml/ref/allfiles.sgml b/doc/src/sgml/ref/allfiles.sgml
index 195ae28db..ec82045ab 100644
--- a/doc/src/sgml/ref/allfiles.sgml
+++ b/doc/src/sgml/ref/allfiles.sgml
@@ -34,6 +34,7 @@ Complete list of usable sgml source files in this directory.
<!ENTITY showPoolCache SYSTEM "show_pool_cache.sgml">
<!ENTITY showPoolHealthCheckStats SYSTEM "show_pool_health_check_stats.sgml">
<!ENTITY pgpoolAdmPcpNodeInfo SYSTEM "pgpool_adm_pcp_node_info.sgml">
+<!ENTITY pgpoolAdmPcpHealthCheckStats SYSTEM "pgpool_adm_pcp_health_check_stats.sgml">
<!ENTITY pgpoolAdmPcpPoolStatus SYSTEM "pgpool_adm_pcp_pool_status.sgml">
<!ENTITY pgpoolAdmPcpNodeCount SYSTEM "pgpool_adm_pcp_node_count.sgml">
<!ENTITY pgpoolAdmPcpAttachNode SYSTEM "pgpool_adm_pcp_attach_node.sgml">
diff --git a/doc/src/sgml/ref/pgpool_adm_pcp_health_check_stats.sgml b/doc/src/sgml/ref/pgpool_adm_pcp_health_check_stats.sgml
new file mode 100644
index 000000000..aa454918f
--- /dev/null
+++ b/doc/src/sgml/ref/pgpool_adm_pcp_health_check_stats.sgml
@@ -0,0 +1,162 @@
+<!--
+doc/src/sgml/ref/pgpool_adm_pcp_health_check_stats.sgml
+Pgpool-II documentation
+-->
+
+<refentry id="PGPOOL-ADM-PCP-HEAlTH-CHECK-STATS">
+ <indexterm zone="pgpool-adm-pcp-health-check-stats">
+ <primary>pgpool_adm_pcp_health_check_stats</primary>
+ </indexterm>
+
+ <refmeta>
+ <refentrytitle>pgpool_adm_pcp_health_check_stats</refentrytitle>
+ <manvolnum>3</manvolnum>
+ <refmiscinfo>pgpool_adm extension</refmiscinfo>
+ </refmeta>
+
+ <refnamediv>
+ <refname>pgpool_adm_pcp_health_check_stats</refname>
+ <refpurpose>
+ a function to display health check statistics data on given node ID</refpurpose>
+ </refnamediv>
+
+ <refsynopsisdiv>
+ <funcsynopsis>
+ <funcprototype>
+ <funcdef><function>pcp_health_check_stats</function> returns record</funcdef>
+ <paramdef>integer <parameter>node_id</parameter></paramdef>
+ <paramdef>text <parameter>host</parameter></paramdef>
+ <paramdef>integer <parameter>port</parameter></paramdef>
+ <paramdef>text <parameter>username</parameter></paramdef>
+ <paramdef>text <parameter>password</parameter></paramdef>
+ <paramdef>out <parameter>node_id integer</parameter></paramdef>
+ <paramdef>out <parameter>host text</parameter></paramdef>
+ <paramdef>out <parameter>port integer</parameter></paramdef>
+ <paramdef>out <parameter>status text</parameter></paramdef>
+ <paramdef>out <parameter>role text</parameter></paramdef>
+ <paramdef>out <parameter>last_status_change timestamp</parameter></paramdef>
+ <paramdef>out <parameter>total_count bigint</parameter></paramdef>
+ <paramdef>out <parameter>success_count bigint</parameter></paramdef>
+ <paramdef>out <parameter>fail_count bigint</parameter></paramdef>
+ <paramdef>out <parameter>skip_count bigint</parameter></paramdef>
+ <paramdef>out <parameter>retry_count bigint</parameter></paramdef>
+ <paramdef>out <parameter>average_retry_count bigint</parameter></paramdef>
+ <paramdef>out <parameter>max_retry_count bigint</parameter></paramdef>
+ <paramdef>out <parameter>max_health_check_duration bigint</parameter></paramdef>
+ <paramdef>out <parameter>min_health_check_duration bigint</parameter></paramdef>
+ <paramdef>out <parameter>average_health_check_duration float4</parameter></paramdef>
+ <paramdef>out <parameter>last_health_check timestamp</parameter></paramdef>
+ <paramdef>out <parameter>last_successful_health_check timestamp</parameter></paramdef>
+ <paramdef>out <parameter>last_skip_health_check timestamp</parameter></paramdef>
+ <paramdef>out <parameter>last_failed_health_check timestamp</parameter></paramdef>
+ </funcprototype>
+
+ <funcprototype>
+ <funcdef><function>pcp_health_check_stats</function> returns record</funcdef>
+ <paramdef>integer <parameter>node_id</parameter></paramdef>
+ <paramdef>text <parameter>pcp_server</parameter></paramdef>
+ <paramdef>out <parameter>node_id integer</parameter></paramdef>
+ <paramdef>out <parameter>host text</parameter></paramdef>
+ <paramdef>out <parameter>port integer</parameter></paramdef>
+ <paramdef>out <parameter>status text</parameter></paramdef>
+ <paramdef>out <parameter>role text</parameter></paramdef>
+ <paramdef>out <parameter>last_status_change timestamp</parameter></paramdef>
+ <paramdef>out <parameter>total_count bigint</parameter></paramdef>
+ <paramdef>out <parameter>success_count bigint</parameter></paramdef>
+ <paramdef>out <parameter>fail_count bigint</parameter></paramdef>
+ <paramdef>out <parameter>skip_count bigint</parameter></paramdef>
+ <paramdef>out <parameter>retry_count bigint</parameter></paramdef>
+ <paramdef>out <parameter>average_retry_count bigint</parameter></paramdef>
+ <paramdef>out <parameter>max_retry_count bigint</parameter></paramdef>
+ <paramdef>out <parameter>max_health_check_duration bigint</parameter></paramdef>
+ <paramdef>out <parameter>min_health_check_duration bigint</parameter></paramdef>
+ <paramdef>out <parameter>average_health_check_duration float4</parameter></paramdef>
+ <paramdef>out <parameter>last_health_check timestamp</parameter></paramdef>
+ <paramdef>out <parameter>last_successful_health_check timestamp</parameter></paramdef>
+ <paramdef>out <parameter>last_skip_health_check timestamp</parameter></paramdef>
+ <paramdef>out <parameter>last_failed_health_check timestamp</parameter></paramdef>
+ </funcprototype>
+
+ </funcsynopsis>
+ </refsynopsisdiv>
+
+ <refsect1 id="R3-PCP-HEALTH-CHECK-STATS-3">
+ <title>Description</title>
+ <para>
+ <function>pcp_health_check_stats</function>
+ displays health check statistics data on given node ID.
+ </para>
+ </refsect1>
+
+ <refsect1>
+ <title>Arguments</title>
+ <para>
+ <variablelist>
+
+ <varlistentry>
+ <term><replaceable class="parameter">node_id</replaceable></term>
+ <listitem>
+ <para>
+ The index of backend node to get information of.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><replaceable class="parameter">pcp_server</replaceable></term>
+ <listitem>
+ <para>
+ The foreign server name for pcp server.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><option>Other arguments </option></term>
+ <listitem>
+ <para>
+ See <xref linkend="pcp-common-options">.
+ </para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </para>
+ </refsect1>
+
+ <refsect1>
+ <title>Example</title>
+ <para>
+ Here is an example output:
+ <programlisting>
+test=# select * from pcp_health_check_stats(0,'',11001,'t-ishii','t-ishii');
+-[ RECORD 1 ]-----------------+--------------------
+node_id | 0
+host | /tmp
+port | 11002
+status | up
+role | primary
+last_status_change | 2020-02-25 16:05:29
+total_count | 3
+success_count | 3
+fail_count | 0
+skip_count | 0
+retry_count | 0
+average_retry_count | 0
+max_retry_count | 0
+max_health_check_duration | 5
+min_health_check_duration | 3
+average_health_check_duration | 4.333333
+last_health_check | 2020-02-25 16:05:47
+last_successful_health_check | 2020-02-25 16:05:47
+last_skip_health_check |
+last_failed_health_check |
+ </programlisting>
+ </para>
+
+ <para>
+ See <xref linkend="health-check-stats-data-table"> for details of data.
+ </para>
+
+ </refsect1>
+
+</refentry>
diff --git a/doc/src/sgml/reference.sgml b/doc/src/sgml/reference.sgml
index 5ba2892fb..41fb2e672 100644
--- a/doc/src/sgml/reference.sgml
+++ b/doc/src/sgml/reference.sgml
@@ -239,6 +239,7 @@
</partintro>
&pgpoolAdmPcpNodeInfo
+ &pgpoolAdmPcpHealthCheckStats
&pgpoolAdmPcpPoolStatus
&pgpoolAdmPcpNodeCount
&pgpoolAdmPcpAttachNode
diff --git a/src/sql/pgpool_adm/Makefile b/src/sql/pgpool_adm/Makefile
index cb8c5c007..abd457fc8 100644
--- a/src/sql/pgpool_adm/Makefile
+++ b/src/sql/pgpool_adm/Makefile
@@ -5,7 +5,8 @@ OBJS = pgpool_adm.o
PG_CPPFLAGS = -I$(libpq_srcdir) -I../../include/pcp
EXTENSION = pgpool_adm
-DATA = pgpool_adm--1.0.sql pgpool_adm--1.1.sql pgpool_adm--1.2.sql pgpool_adm--1.0--1.1.sql pgpool_adm--1.1--1.2.sql
+DATA = pgpool_adm--1.0.sql pgpool_adm--1.1.sql pgpool_adm--1.2.sql pgpool_adm--1.3.sql \
+pgpool_adm--1.0--1.1.sql pgpool_adm--1.1--1.2.sql pgpool_adm--1.2--1.3.sql
SHLIB_LINK = -L../../libs/pcp/.libs -lpcp -Wl,--as-needed -Wl,-rpath,'${prefix}/lib',--enable-new-dtags
# if you are using PostgreSQL 8.0 or later,
# using pg_config is recommended.
diff --git a/src/sql/pgpool_adm/pgpool_adm--1.1--1.2.sql b/src/sql/pgpool_adm/pgpool_adm--1.1--1.2.sql
index 547e2a15a..9d84671b7 100644
--- a/src/sql/pgpool_adm/pgpool_adm--1.1--1.2.sql
+++ b/src/sql/pgpool_adm/pgpool_adm--1.1--1.2.sql
@@ -3,9 +3,7 @@
-- complain if script is sourced in psql, rather than via ALTER EXTENSION
\echo Use "ALTER EXTENSION pgpool_adm UPDATE TO '1.1'" to load this file. \quit
-ALTER EXTENSION pgpool_adm DROP FUNCTION CREATE FUNCTION pcp_node_info(integer, text, integer, text, text, OUT host text, OUT port integer, OUT status text, OUT weight float4, OUT role text, OUT replication_delay bigint, OUT last_status_change timestamp)
-
-CREATE FUNCTION pcp_node_info(integer, text, integer, text, text, OUT host text, OUT port integer, OUT status text, OUT weight float4, OUT role text, OUT replication_delay bigint, OUT replication_state text, OUT replication_sync_state text, OUT last_status_change timestamp)
+CREATE FUNCTION pcp_health_check_stats(integer, text, integer, text, text, OUT host text, OUT port integer, OUT status text, OUT role text, OUT last_status_change timestamp, OUT total_count bigint, OUT fail_count bigint, OUT skip_count bigint, OUT retry_count bigint, OUT average_retry_count float4, OUT max_retry_count bigint, OUT max_health_check_duration bigint, OUT min_health_check_duration bigint, OUT average_health_check_duration float4, OUT last_health_check timestamp, OUT last_successful_health_check timestamp, OUT last_skip_health_check timestamp, OUT last_failed_health_check timestamp);
RETURNS record
-AS 'MODULE_PATHNAME', '_pcp_node_info'
+AS 'MODULE_PATHNAME', '_pcp_health_check_stats'
LANGUAGE C VOLATILE STRICT;
diff --git a/src/sql/pgpool_adm/pgpool_adm--1.2--1.3.sql b/src/sql/pgpool_adm/pgpool_adm--1.2--1.3.sql
new file mode 100644
index 000000000..8c84f64c7
--- /dev/null
+++ b/src/sql/pgpool_adm/pgpool_adm--1.2--1.3.sql
@@ -0,0 +1,10 @@
+/* contrib/pgpool_adm/pgpool_adm--1.2--1.3.sql */
+
+-- complain if script is sourced in psql, rather than via ALTER EXTENSION
+\echo Use "ALTER EXTENSION pgpool_adm UPDATE TO '1.3'" to load this file. \quit
+
+CREATE FUNCTION pcp_health_check_stats(integer, text, integer, text, text, OUT node_id integer, OUT host text, OUT port integer, OUT status text, OUT role text, OUT last_status_change timestamp, OUT total_count bigint, OUT success_count bigint, OUT fail_count bigint, OUT skip_count bigint, OUT retry_count bigint, OUT average_retry_count float4, OUT max_retry_count bigint, OUT max_health_check_duration bigint, OUT min_health_check_duration bigint, OUT average_health_check_duration float4, OUT last_health_check timestamp, OUT last_successful_health_check timestamp, OUT last_skip_health_check timestamp, OUT last_failed_health_check timestamp)
+RETURNS record
+AS 'MODULE_PATHNAME', '_pcp_health_check_stats'
+LANGUAGE C VOLATILE STRICT;
+
diff --git a/src/sql/pgpool_adm/pgpool_adm--1.3.sql b/src/sql/pgpool_adm/pgpool_adm--1.3.sql
new file mode 100644
index 000000000..069f88652
--- /dev/null
+++ b/src/sql/pgpool_adm/pgpool_adm--1.3.sql
@@ -0,0 +1,101 @@
+/* contrib/pgpool_adm/pgpool_adm--1.3.sql */
+
+/* ***********************************************
+ * Administrative functions for pgPool
+ * *********************************************** */
+
+/**
+ * input parameters: node_id, host, port, username, password
+ */
+CREATE FUNCTION pcp_node_info(integer, text, integer, text, text, OUT host text, OUT port integer, OUT status text, OUT weight float4, OUT role text, OUT replication_delay bigint, OUT replication_state text, OUT replication_sync_state text, OUT last_status_change timestamp)
+RETURNS record
+AS 'MODULE_PATHNAME', '_pcp_node_info'
+LANGUAGE C VOLATILE STRICT;
+
+/**
+ * input parameters: node_id, server_name
+ */
+CREATE FUNCTION pcp_node_info(integer, text, OUT host text, OUT port integer, OUT status text, OUT weight float4)
+RETURNS record
+AS 'MODULE_PATHNAME', '_pcp_node_info'
+LANGUAGE C VOLATILE STRICT;
+
+/**
+ * input parameters: node_id, host, port, username, password
+ */
+CREATE FUNCTION pcp_health_check_stats(integer, text, integer, text, text, OUT node_id integer, OUT host text, OUT port integer, OUT status text, OUT role text, OUT last_status_change timestamp, OUT total_count bigint, OUT success_count bigint, OUT fail_count bigint, OUT skip_count bigint, OUT retry_count bigint, OUT average_retry_count float4, OUT max_retry_count bigint, OUT max_health_check_duration bigint, OUT min_health_check_duration bigint, OUT average_health_check_duration float4, OUT last_health_check timestamp, OUT last_successful_health_check timestamp, OUT last_skip_health_check timestamp, OUT last_failed_health_check timestamp)
+RETURNS record
+AS 'MODULE_PATHNAME', '_pcp_health_check_stats'
+LANGUAGE C VOLATILE STRICT;
+
+/**
+ * input parameters: node_id, server_name
+ */
+CREATE FUNCTION pcp_health_check_stats(integer, text, OUT host text, OUT port integer, OUT status text, OUT weight float4)
+RETURNS record
+AS 'MODULE_PATHNAME', '_pcp_health_check_stats'
+LANGUAGE C VOLATILE STRICT;
+
+/**
+ * input parameters: host, port, username, password
+ */
+CREATE FUNCTION pcp_pool_status(text, integer, text, text, OUT item text, OUT value text, OUT description text)
+RETURNS record
+AS 'MODULE_PATHNAME', '_pcp_pool_status'
+LANGUAGE C VOLATILE STRICT;
+
+/**
+ * input parameters: server_name
+ */
+CREATE FUNCTION pcp_pool_status(text, OUT item text, OUT value text, OUT description text)
+RETURNS record
+AS 'MODULE_PATHNAME', '_pcp_pool_status'
+LANGUAGE C VOLATILE STRICT;
+
+/**
+ * input parameters: host, port, username, password
+ */
+CREATE FUNCTION pcp_node_count(text, integer, text, text, OUT node_count integer)
+RETURNS integer
+AS 'MODULE_PATHNAME', '_pcp_node_count'
+LANGUAGE C VOLATILE STRICT;
+
+/**
+ * input parameters: server_name
+ */
+CREATE FUNCTION pcp_node_count(text, OUT node_count integer)
+RETURNS integer
+AS 'MODULE_PATHNAME', '_pcp_node_count'
+LANGUAGE C VOLATILE STRICT;
+
+/**
+ * input parameters: node_id, host, port, username, password
+ */
+CREATE FUNCTION pcp_attach_node(integer, text, integer, text, text, OUT node_attached boolean)
+RETURNS boolean
+AS 'MODULE_PATHNAME', '_pcp_attach_node'
+LANGUAGE C VOLATILE STRICT;
+
+/**
+ * input parameters: node_id, server_name
+ */
+CREATE FUNCTION pcp_attach_node(integer, text, OUT node_attached boolean)
+RETURNS boolean
+AS 'MODULE_PATHNAME', '_pcp_attach_node'
+LANGUAGE C VOLATILE STRICT;
+
+/**
+ * input parameters: node_id, gracefully, host, port, username, password
+ */
+CREATE FUNCTION pcp_detach_node(integer, boolean, text, integer, text, text, OUT node_detached boolean)
+RETURNS boolean
+AS 'MODULE_PATHNAME', '_pcp_detach_node'
+LANGUAGE C VOLATILE STRICT;
+
+/**
+ * input parameters: node_id, gracefully, server_name
+ */
+CREATE FUNCTION pcp_detach_node(integer, boolean, text, OUT node_detached boolean)
+RETURNS boolean
+AS 'MODULE_PATHNAME', '_pcp_detach_node'
+LANGUAGE C VOLATILE STRICT;
diff --git a/src/sql/pgpool_adm/pgpool_adm.c b/src/sql/pgpool_adm/pgpool_adm.c
index 85b73ca57..f2295d908 100644
--- a/src/sql/pgpool_adm/pgpool_adm.c
+++ b/src/sql/pgpool_adm/pgpool_adm.c
@@ -3,7 +3,7 @@
* pgpool_adm.c
*
*
- * Copyright (c) 2002-2019, PostgreSQL Global Development Group
+ * Copyright (c) 2002-2020, PostgreSQL Global Development Group
*
* Author: Jehan-Guillaume (ioguix) de Rorthais <jgdr@dalibo.com>
*
@@ -38,7 +38,7 @@
static PCPConnInfo * connect_to_server(char *host, int port, char *user, char *pass);
static PCPConnInfo * connect_to_server_from_foreign_server(char *name);
-
+static Timestamp str2timestamp(char *str);
/**
* Wrapper around pcp_connect
@@ -570,3 +570,162 @@ _pcp_detach_node(PG_FUNCTION_ARGS)
PG_RETURN_BOOL(true);
}
+
+/**
+ * nodeID: the node id to get info from
+ * host_or_srv: server name or ip address of the pgpool server
+ * port: pcp port number
+ * user: user to connect with
+ * pass: password
+ **/
+Datum
+_pcp_health_check_stats(PG_FUNCTION_ARGS)
+{
+ int16 nodeID = PG_GETARG_INT16(0);
+ char *host_or_srv = text_to_cstring(PG_GETARG_TEXT_PP(1));
+
+ PCPConnInfo *pcpConnInfo;
+ PCPResultInfo *pcpResInfo;
+
+ POOL_HEALTH_CHECK_STATS *stats;
+ Datum values[20]; /* values to build the returned tuple from */
+ bool nulls[] = {false, false, false, false, false, false, false, false, false, false,
+ false, false, false, false, false, false, false, false, false, false};
+ TupleDesc tupledesc;
+ HeapTuple tuple;
+ AttrNumber an;
+ int i;
+
+ if (nodeID < 0 || nodeID >= MAX_NUM_BACKENDS)
+ ereport(ERROR, (0, errmsg("NodeID is out of range.")));
+
+ if (PG_NARGS() == 5)
+ {
+ char *user,
+ *pass;
+ int port;
+
+ port = PG_GETARG_INT16(2);
+ user = text_to_cstring(PG_GETARG_TEXT_PP(3));
+ pass = text_to_cstring(PG_GETARG_TEXT_PP(4));
+ pcpConnInfo = connect_to_server(host_or_srv, port, user, pass);
+ }
+ else if (PG_NARGS() == 2)
+ {
+ pcpConnInfo = connect_to_server_from_foreign_server(host_or_srv);
+ }
+ else
+ {
+ ereport(ERROR, (0, errmsg("Wrong number of argument.")));
+ }
+
+ pcpResInfo = pcp_health_check_stats(pcpConnInfo, nodeID);
+ if (pcpResInfo == NULL || PCPResultStatus(pcpResInfo) != PCP_RES_COMMAND_OK)
+ {
+ char *error = pcp_get_last_error(pcpConnInfo) ? pstrdup(pcp_get_last_error(pcpConnInfo)) : NULL;
+
+ pcp_disconnect(pcpConnInfo);
+ pcp_free_connection(pcpConnInfo);
+ ereport(ERROR, (0,
+ errmsg("failed to get node information"),
+ errdetail("%s\n", error ? error : "unknown reason")));
+ }
+
+ /**
+ * Construct a tuple descriptor for the result rows.
+ **/
+#if defined(PG_VERSION_NUM) && (PG_VERSION_NUM >= 120000)
+ tupledesc = CreateTemplateTupleDesc(20);
+#else
+ tupledesc = CreateTemplateTupleDesc(20, false);
+#endif
+ an = 1;
+ TupleDescInitEntry(tupledesc, an++, "node_id", INT4OID, -1, 0);
+ TupleDescInitEntry(tupledesc, an++, "hostname", TEXTOID, -1, 0);
+ TupleDescInitEntry(tupledesc, an++, "port", INT4OID, -1, 0);
+ TupleDescInitEntry(tupledesc, an++, "status", TEXTOID, -1, 0);
+ TupleDescInitEntry(tupledesc, an++, "role", TEXTOID, -1, 0);
+ TupleDescInitEntry(tupledesc, an++, "last_status_change", TIMESTAMPOID, -1, 0);
+ TupleDescInitEntry(tupledesc, an++, "total_count", INT8OID, -1, 0);
+ TupleDescInitEntry(tupledesc, an++, "success_count", INT8OID, -1, 0);
+ TupleDescInitEntry(tupledesc, an++, "fail_count", INT8OID, -1, 0);
+ TupleDescInitEntry(tupledesc, an++, "skip_count", INT8OID, -1, 0);
+ TupleDescInitEntry(tupledesc, an++, "retry_count", INT8OID, -1, 0);
+ TupleDescInitEntry(tupledesc, an++, "average_retry_count", FLOAT4OID, -1, 0);
+ TupleDescInitEntry(tupledesc, an++, "max_retry_count", INT8OID, -1, 0);
+ TupleDescInitEntry(tupledesc, an++, "max_health_check_duration", INT8OID, -1, 0);
+ TupleDescInitEntry(tupledesc, an++, "min_health_check_duration", INT8OID, -1, 0);
+ TupleDescInitEntry(tupledesc, an++, "average_health_check_duration", FLOAT4OID, -1, 0);
+ TupleDescInitEntry(tupledesc, an++, "last_health_check", TIMESTAMPOID, -1, 0);
+ TupleDescInitEntry(tupledesc, an++, "last_successful_health_check", TIMESTAMPOID, -1, 0);
+ TupleDescInitEntry(tupledesc, an++, "last_skip_health_check", TIMESTAMPOID, -1, 0);
+ TupleDescInitEntry(tupledesc, an++, "last_failed_health_check", TIMESTAMPOID, -1, 0);
+
+ tupledesc = BlessTupleDesc(tupledesc);
+
+ stats = (POOL_HEALTH_CHECK_STATS *) pcp_get_binary_data(pcpResInfo, 0);
+
+ /* set values */
+ i = 0;
+ values[i++] = Int32GetDatum(nodeID);
+ values[i++] = CStringGetTextDatum(stats->hostname);
+ values[i++] = Int32GetDatum(atoi(stats->port));
+ values[i++] = CStringGetTextDatum(stats->status);
+ values[i++] = CStringGetTextDatum(stats->role);
+
+ if (*stats->last_status_change == '\0')
+ nulls[i++] = true;
+ else
+ values[i++] = str2timestamp(stats->last_status_change);
+
+ values[i++] = Int64GetDatum(atol(stats->total_count));
+ values[i++] = Int64GetDatum(atol(stats->success_count));
+ values[i++] = Int64GetDatum(atol(stats->fail_count));
+ values[i++] = Int64GetDatum(atol(stats->skip_count));
+ values[i++] = Int64GetDatum(atol(stats->retry_count));
+ values[i++] = Float4GetDatum(atof(stats->average_retry_count));
+ values[i++] = Int64GetDatum(atol(stats->max_retry_count));
+ values[i++] = Int64GetDatum(atol(stats->max_health_check_duration));
+ values[i++] = Int64GetDatum(atol(stats->min_health_check_duration));
+ values[i++] = Float4GetDatum(atof(stats->average_health_check_duration));
+
+ if (*stats->last_health_check =='\0' )
+ nulls[i++] = true;
+ else
+ values[i++] = str2timestamp(stats->last_health_check);
+
+ if (*stats->last_successful_health_check == '\0')
+ nulls[i++] = true;
+ else
+ values[i++] = str2timestamp(stats->last_successful_health_check);
+
+ if (*stats->last_skip_health_check == '\0')
+ nulls[i++] = true;
+ else
+ values[i++] = str2timestamp(stats->last_skip_health_check);
+
+ if (*stats->last_failed_health_check == '\0')
+ nulls[i++] = true;
+ else
+ values[i++] = str2timestamp(stats->last_failed_health_check);
+
+ pcp_disconnect(pcpConnInfo);
+ pcp_free_connection(pcpConnInfo);
+
+ /* build and return the tuple */
+ tuple = heap_form_tuple(tupledesc, values, nulls);
+
+ ReleaseTupleDesc(tupledesc);
+
+ PG_RETURN_DATUM(HeapTupleGetDatum(tuple));
+}
+
+static
+Timestamp str2timestamp(char *str)
+{
+ return (DatumGetTimestamp(DirectFunctionCall3(timestamp_in,
+ CStringGetDatum(str),
+ ObjectIdGetDatum(InvalidOid),
+ Int32GetDatum(-1))));
+}
+
diff --git a/src/sql/pgpool_adm/pgpool_adm.control b/src/sql/pgpool_adm/pgpool_adm.control
index fc550df3d..9310ca0ad 100644
--- a/src/sql/pgpool_adm/pgpool_adm.control
+++ b/src/sql/pgpool_adm/pgpool_adm.control
@@ -1,5 +1,5 @@
# pcp extension
comment = 'Administrative functions for pgPool'
-default_version = '1.2'
+default_version = '1.3'
module_pathname = '$libdir/pgpool_adm'
relocatable = true
diff --git a/src/sql/pgpool_adm/pgpool_adm.h b/src/sql/pgpool_adm/pgpool_adm.h
index 7dbbd9ec5..e10e81e56 100644
--- a/src/sql/pgpool_adm/pgpool_adm.h
+++ b/src/sql/pgpool_adm/pgpool_adm.h
@@ -20,12 +20,14 @@ PG_MODULE_MAGIC;
Datum _pcp_node_info(PG_FUNCTION_ARGS);
+Datum _pcp_health_check_stats(PG_FUNCTION_ARGS);
Datum _pcp_pool_status(PG_FUNCTION_ARGS);
Datum _pcp_node_count(PG_FUNCTION_ARGS);
Datum _pcp_attach_node(PG_FUNCTION_ARGS);
Datum _pcp_detach_node(PG_FUNCTION_ARGS);
PG_FUNCTION_INFO_V1(_pcp_node_info);
+PG_FUNCTION_INFO_V1(_pcp_health_check_stats);
PG_FUNCTION_INFO_V1(_pcp_pool_status);
PG_FUNCTION_INFO_V1(_pcp_node_count);
PG_FUNCTION_INFO_V1(_pcp_attach_node);
[parent: fbf29db03a36]