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]