Fix pgpool_setup so that it creates separate archive directory for each DB node.
authorTatsuo Ishii <ishii@sraoss.co.jp>
Sun, 24 Jan 2021 02:55:12 +0000 (11:55 +0900)
committerTatsuo Ishii <ishii@sraoss.co.jp>
Sun, 24 Jan 2021 06:02:29 +0000 (15:02 +0900)
pgpool_setup created single archive directory for all PostgreSQL
nodes. This only works with streaming replication because only the
primary node produces archive log. However for native replication and
snapshot isolation mode this does not work as each node produces WAL.

In this fix dedicated archive directories like archivedir/data0
archivedir/data1 and so on are created.

src/test/pgpool_setup.in

index 48897457f42a3185acd44e89314ab942467ddc8a..8e85380293e7fa0019921be4311a1d51669ca8e3 100755 (executable)
@@ -326,11 +326,11 @@ function set_postgresql_conf
                echo "wal_level = hot_standby" >> $PGCONF
                echo "max_wal_senders = $NUMCLUSTERS" >> $PGCONF
                echo "archive_mode = on" >> $PGCONF
-               echo "archive_command = 'cp %p $BASEDIR/archivedir/%f </dev/null'" >> $PGCONF
+               echo "archive_command = 'cp %p $BASEDIR/archivedir/`basename $1`/%f </dev/null'" >> $PGCONF
        elif [ $MODE = 'r' ];then
                echo "wal_level = archive" >> $PGCONF
                echo "archive_mode = on" >> $PGCONF
-               echo "archive_command = 'cp %p $BASEDIR/archivedir/%f </dev/null'" >> $PGCONF
+               echo "archive_command = 'cp %p $BASEDIR/archivedir/`basename $1`/%f </dev/null'" >> $PGCONF
        fi
 
        ed $1/pg_hba.conf <<EOF
@@ -405,7 +405,7 @@ cat > $DEST_CLUSTER/recovery.conf <<REOF
 standby_mode          = 'on'
 primary_conninfo      = 'host=localhost port=$PORT user=$PGSUPERUSER'
 recovery_target_timeline='latest'
-restore_command = 'cp $DATADIR_BASE/archivedir/%f "%p" 2> /dev/null'
+restore_command = 'cp $DATADIR_BASE/archivedir/`basename $1`/%f "%p" 2> /dev/null'
 REOF
 EOF
 fi
@@ -503,7 +503,7 @@ fi
        -e "/__PGBIN__/s@__PGBIN__@$PGBIN@" \
        -e "/__DATADIR_BASE__/s@__DATADIR_BASE__@$BASEDIR@" \
        -e "/__PGSUPERUSER__/s/__PGSUPERUSER__/$WHOAMI/" \
-       -e "/__ARCHDIR__/s@__ARCHDIR__@$BASEDIR/archivedir@" \
+       -e "/__ARCHDIR__/s@__ARCHDIR__@$BASEDIR/archivedir/\`basename \$1\`@" \
        $1/$SCRIPT
 
 chmod 755 $1/$SCRIPT
@@ -550,7 +550,7 @@ EOF
        -e "/__PGBIN__/s@__PGBIN__@$PGBIN@" \
        -e "/__DATADIR_BASE__/s@__DATADIR_BASE__@$BASEDIR@" \
        -e "/__PGSUPERUSER__/s/__PGSUPERUSER__/$WHOAMI/" \
-       -e "/__ARCHDIR__/s@__ARCHDIR__@$BASEDIR/archivedir@" \
+       -e "/__ARCHDIR__/s@__ARCHDIR__@$BASEDIR/archivedir/\`basename \$1\`@" \
        $1/$SCRIPT
 
 chmod 755 $1/$SCRIPT
@@ -579,7 +579,7 @@ EOF
     cat > $1/$fname <<EOF
 primary_conninfo      = 'host=localhost port=$BASEPORT user=$WHOAMI'
 recovery_target_timeline='latest'
-restore_command = 'cp $BASEDIR/archivedir/%f "%p" 2> /dev/null'
+restore_command = 'cp $BASEDIR/archivedir/`basename $1`/%f "%p" 2> /dev/null'
 EOF
 }
 
@@ -835,6 +835,9 @@ do
 
        echo "#$n port is $PORT" >> README.port
 
+       # create archive directory
+       test ! -d archivedir/$CLUSTER && mkdir -p archivedir/$CLUSTER
+
 done
 
 set_pgpool_conf $CONF
@@ -872,12 +875,9 @@ $PGPOOL_INSTALL_DIR/bin/pg_md5 $WHOAMI >> etc/pcp.conf
 # create pool_passwd
 $PGPOOL_INSTALL_DIR/bin/pg_md5 -m -f etc/pgpool.conf -u $WHOAMI $WHOAMI
 
-# create archive directory
-mkdir archivedir
-
 #-------------------------------------------
 # if streaming replication mode, we need to create data1 and so on, by
-# using on line recovery.
+# using online recovery.
 #-------------------------------------------
 
 if [ $MODE = 's' ];then
@@ -909,6 +909,9 @@ EOF
                n=1
                while [ $n -lt $NUMCLUSTERS ]
                do
+                   # create archive directory
+                   test ! -d $BASEDIR/archivedir/`basename $CLUSTER` && mkdir $BASEDIR/archivedir/`basename $CLUSTER`
+
                # set up pgpool.conf
                        PORT=`expr $PORT + 1`
                        echo "backend_hostname$n = '$PGSOCKET_DIR'" >> $CONF