pgpool2.git / summary / log / commit / refs
commit 3d63b8a94fd22358582c6b69eaed0e2c01e68cab
Author: Tatsuo Ishii <ishii@postgresql.org>
Date: Mon Apr 16 02:47:20 2018 +0000
Allow to use more than 1 standby in pgpool_setup using replication slot.
For this purpose, add recovery target node argument to pgpool_recovery
extension. So extension version is incremented to 1.2.
src/pcp_con/recovery.c | 16 ++++++++------
src/sql/pgpool-recovery/Makefile | 2 +-
src/sql/pgpool-recovery/pgpool-recovery.c | 11 +++++++++-
src/sql/pgpool-recovery/pgpool_recovery.control | 4 ++--
src/test/pgpool_setup | 29 +++++++++++++++++++------
5 files changed, 44 insertions(+), 18 deletions(-)
diff --git a/src/pcp_con/recovery.c b/src/pcp_con/recovery.c
index ead5eeaf7..95ffd3a5d 100644
--- a/src/pcp_con/recovery.c
+++ b/src/pcp_con/recovery.c
@@ -5,7 +5,7 @@
* pgpool: a language independent connection pool server for PostgreSQL
* written by Tatsuo Ishii
*
- * Copyright (c) 2003-2014 PgPool Global Development Group
+ * Copyright (c) 2003-2018 PgPool Global Development Group
*
* Permission to use, copy, modify, and distribute this software and
* its documentation for any purpose and without fee is hereby
@@ -41,7 +41,7 @@
#define SECOND_STAGE 1
static void exec_checkpoint(PGconn *conn);
-static void exec_recovery(PGconn *conn, BackendInfo *master_backend, BackendInfo *recovery_backend, char stage);
+static void exec_recovery(PGconn *conn, BackendInfo *master_backend, BackendInfo *recovery_backend, char stage, int recovery_node);
static void exec_remote_start(PGconn *conn, BackendInfo *backend);
static PGconn *connect_backend_libpq(BackendInfo *backend);
static void check_postmaster_started(BackendInfo *backend);
@@ -97,7 +97,7 @@ void start_recovery(int recovery_node)
(errmsg("node recovery, CHECKPOINT in the 1st stage done")));
}
- exec_recovery(conn, backend, recovery_backend, FIRST_STAGE);
+ exec_recovery(conn, backend, recovery_backend, FIRST_STAGE, recovery_node);
ereport(LOG,
(errmsg("node recovery, 1st stage is done")));
@@ -130,7 +130,7 @@ void start_recovery(int recovery_node)
(errmsg("node recovery"),
errdetail("CHECKPOINT in the 2nd stage done")));
- exec_recovery(conn, backend, recovery_backend, SECOND_STAGE);
+ exec_recovery(conn, backend, recovery_backend, SECOND_STAGE, recovery_node);
}
exec_remote_start(conn, recovery_backend);
@@ -219,7 +219,7 @@ static void exec_checkpoint(PGconn *conn)
/*
* Call pgpool_recovery() function.
*/
-static void exec_recovery(PGconn *conn, BackendInfo *master_backend, BackendInfo *recovery_backend, char stage)
+static void exec_recovery(PGconn *conn, BackendInfo *master_backend, BackendInfo *recovery_backend, char stage, int recovery_node)
{
PGresult *result;
char *hostname;
@@ -244,11 +244,13 @@ static void exec_recovery(PGconn *conn, BackendInfo *master_backend, BackendInfo
*/
snprintf(recovery_command,
sizeof(recovery_command),
- "SELECT pgpool_recovery('%s', '%s', '%s', '%d')",
+ "SELECT pgpool_recovery('%s', '%s', '%s', '%d', %d)",
script,
hostname,
recovery_backend->backend_data_directory,
- master_backend->backend_port);
+ master_backend->backend_port,
+ recovery_node
+ );
ereport(LOG,
(errmsg("executing recovery"),
diff --git a/src/sql/pgpool-recovery/Makefile b/src/sql/pgpool-recovery/Makefile
index be767ba17..63b7812ea 100644
--- a/src/sql/pgpool-recovery/Makefile
+++ b/src/sql/pgpool-recovery/Makefile
@@ -3,7 +3,7 @@ DATA_built = pgpool-recovery.sql
DATA = uninstall_pgpool-recovery.sql
EXTENSION = pgpool_recovery
-DATA = pgpool_recovery--1.1.sql
+DATA = pgpool_recovery--1.2.sql
# if you are using PostgreSQL 8.0 or later,
# using pg_config is recommended.
diff --git a/src/sql/pgpool-recovery/pgpool-recovery.c b/src/sql/pgpool-recovery/pgpool-recovery.c
index c37a57e7a..4c6824d8e 100644
--- a/src/sql/pgpool-recovery/pgpool-recovery.c
+++ b/src/sql/pgpool-recovery/pgpool-recovery.c
@@ -79,7 +79,16 @@ pgpool_recovery(PG_FUNCTION_ARGS)
elog(ERROR, "must be superuser to use pgpool_recovery function");
#endif
- if (PG_NARGS() >= 4) /* post pgpool-II 3.4 */
+ if (PG_NARGS() >= 5) /* Pgpool-II 4.0 or later */
+ {
+ char *remote_port = DatumGetCString(DirectFunctionCall1(textout,
+ PointerGetDatum(PG_GETARG_TEXT_P(3))));
+ int recovery_node = PG_GETARG_INT32(4);
+ snprintf(recovery_script, sizeof(recovery_script), "%s/%s %s %s %s %s %d",
+ DataDir, script, DataDir, remote_host,
+ remote_data_directory, remote_port, recovery_node);
+ }
+ else if (PG_NARGS() >= 4) /* Pgpool-II 3.4 - 3.7 */
{
char *remote_port = DatumGetCString(DirectFunctionCall1(textout,
PointerGetDatum(PG_GETARG_TEXT_P(3))));
diff --git a/src/sql/pgpool-recovery/pgpool_recovery.control b/src/sql/pgpool-recovery/pgpool_recovery.control
index 7324bb923..121163de4 100644
--- a/src/sql/pgpool-recovery/pgpool_recovery.control
+++ b/src/sql/pgpool-recovery/pgpool_recovery.control
@@ -1,5 +1,5 @@
# pgpool-recovery extension
-comment = 'recovery functions for pgpool-II for V3.4 or later'
-default_version = '1.1'
+comment = 'recovery functions for pgpool-II for V4.0 or later'
+default_version = '1.2'
module_pathname = '$libdir/pgpool-recovery'
relocatable = true
diff --git a/src/test/pgpool_setup b/src/test/pgpool_setup
index 54e1b93b9..54f9e724c 100755
--- a/src/test/pgpool_setup
+++ b/src/test/pgpool_setup
@@ -311,7 +311,7 @@ EOF
#-------------------------------------------
# create basebackup.sh for streaming replication mode
-# argument: PostgreSQL database cluster directory
+# argument1: PostgreSQL database cluster
#-------------------------------------------
function create_basebackup_stream {
SCRIPT=basebackup.sh
@@ -325,6 +325,7 @@ master_db_cluster=$1
recovery_node_host_name=$2
DEST_CLUSTER=$3
PORT=$4
+recovery_node=$5
log=$DATADIR_BASE/log/recovery.log
@@ -342,6 +343,15 @@ rm -fr $DEST_CLUSTER/pg_xlog
mkdir $DEST_CLUSTER/pg_xlog
chmod 700 $DEST_CLUSTER/pg_xlog
rm $DEST_CLUSTER/recovery.done
+EOF
+
+if [ $USE_SLOT = "true" ];then
+ cat >> $1/$SCRIPT <<'EOF'
+$psql -p $PORT -c "SELECT * FROM pg_create_physical_replication_slot('pgpool_setup_slot$recovery_node')" postgres
+EOF
+fi
+
+cat >> $1/$SCRIPT <<'EOF'
cat > $DEST_CLUSTER/recovery.conf <<REOF
standby_mode = 'on'
primary_conninfo = 'port=$PORT user=$PGSUPERUSER'
@@ -354,8 +364,8 @@ restore_command = 'cp $DATADIR_BASE/archivedir/%f "%p" 2> /dev/null'
REOF
EOF
else
- cat >> $1/$SCRIPT <<'EOF'
-primary_slot_name = 'pgpool_setup_slot'
+ cat >> $1/$SCRIPT << 'EOF'
+primary_slot_name = 'pgpool_setup_slot$recovery_node'
REOF
EOF
fi
@@ -475,7 +485,7 @@ chmod 755 $1/$SCRIPT
#-------------------------------------------
# create initial recovery.conf
# argument1: PostgreSQL database cluster directory
-# argument2: cluster No. we assume that data0 is primary
+# argument2: cluster No. We assume that data0 is primary
#-------------------------------------------
function create_recovery_conf {
if [ $2 = "0" ];then
@@ -490,7 +500,7 @@ primary_conninfo = 'port=$BASEPORT user=$WHOAMI'
recovery_target_timeline='latest'
EOF
if [ $USE_SLOT = true ];then
- echo "primary_slot_name = 'pgpool_setup_slot'" >> $1/$fname
+ echo "primary_slot_name = 'pgpool_setup_slot$2'" >> $1/$fname
else
cat >> $1/$fname <<EOF
restore_command = 'cp $BASEDIR/archivedir/%f "%p" 2> /dev/null'
@@ -726,7 +736,7 @@ do
echo "creating basebackup.sh"
# create basebackup.sh
if [ $MODE = 's' ];then
- create_basebackup_stream $CLUSTERDIR >&5 2>&1
+ create_basebackup_stream $CLUSTERDIR $n >&5 2>&1
elif [ $MODE = 'r' ];then
create_basebackup_replication $CLUSTERDIR >&5 2>&1
create_pgpool_recovery_pitr $CLUSTERDIR >&5 2>&1
@@ -803,7 +813,12 @@ CREATE EXTENSION pgpool_recovery;
CREATE DATABASE test;
EOF
if [ $USE_SLOT = "true" ];then
- $PSQL -p $BASEPORT template1 -c "SELECT * FROM pg_create_physical_replication_slot('pgpool_setup_slot')" >&5 2>&1
+ n=1
+ while [ $n -lt $NUMCLUSTERS ]
+ do
+ $PSQL -p $BASEPORT template1 -c "SELECT * FROM pg_create_physical_replication_slot('pgpool_setup_slot$n')" >&5 2>&1
+ n=`expr $n + 1`
+ done
fi
n=0
[parent: 4867cf2d2e23]