#!/bin/bash

PORT_PRIMARY=50000 
PORT_STANDBY=50001 
PORT_CASCADE=50002

BASEDIR=`pwd`/data
PRIMARY_PGDATA="${BASEDIR}/primary"
STANDBY_PGDATA="${BASEDIR}/standby"
CASCADE_PGDATA="${BASEDIR}/cascade"


# create dir
mkdir -p ${PRIMARY_PGDATA}
chmod 700 ${PRIMARY_PGDATA}
mkdir ${BASEDIR}/archive
mkdir ${STANDBY_PGDATA}
chmod 700 ${STANDBY_PGDATA}
mkdir ${CASCADE_PGDATA}
chmod 700 ${CASCADE_PGDATA}


# create primary
initdb --no-locale -E UTF8 -D ${PRIMARY_PGDATA}

# modify postgresql.conf
# common parameter
echo "listen_addresses = '*'" >> ${PRIMARY_PGDATA}/postgresql.conf
echo "wal_level = hot_standby" >> ${PRIMARY_PGDATA}/postgresql.conf
echo "wal_keep_segments = 10" >> ${PRIMARY_PGDATA}/postgresql.conf
echo "archive_mode = on" >> ${PRIMARY_PGDATA}/postgresql.conf
echo "archive_command = 'cp %p ${BASEDIR}/archive/%f'" >> ${PRIMARY_PGDATA}/postgresql.conf
echo "max_wal_senders = 10" >> ${PRIMARY_PGDATA}/postgresql.conf
echo "hot_standby = on" >> ${PRIMARY_PGDATA}/postgresql.conf
echo "log_destination = 'stderr,csvlog'" >> ${PRIMARY_PGDATA}/postgresql.conf
echo "logging_collector = on" >> ${PRIMARY_PGDATA}/postgresql.conf
echo "log_filename = 'postgresql_%a.log'" >> ${PRIMARY_PGDATA}/postgresql.conf


cp ${PRIMARY_PGDATA}/postgresql.conf ${BASEDIR}/

# individual parameter
echo "port = ${PORT_PRIMARY}" >> ${PRIMARY_PGDATA}/postgresql.conf

# modify pg_hba.conf
echo "host    replication     all        127.0.0.1/32            trust" >> ${PRIMARY_PGDATA}/pg_hba.conf

pg_ctl start -w -D ${PRIMARY_PGDATA}


# create standby
pg_basebackup -h 127.0.0.1 -p ${PORT_PRIMARY} -D ${STANDBY_PGDATA} --checkpoint=fast --progress

# postgresql.conf
cp ${BASEDIR}/postgresql.conf ${STANDBY_PGDATA}/postgresql.conf
echo "port = ${PORT_STANDBY}" >> ${STANDBY_PGDATA}/postgresql.conf

# recovery.conf
echo "standby_mode = 'on'" > ${STANDBY_PGDATA}/recovery.conf
echo "primary_conninfo = 'host=127.0.0.1 port=${PORT_PRIMARY}'" >> ${STANDBY_PGDATA}/recovery.conf
echo "recovery_target_timeline = 'latest'">> ${STANDBY_PGDATA}/recovery.conf
echo "restore_command = 'sleep 2s && cp ${BASEDIR}/archive/%f %p'">> ${STANDBY_PGDATA}/recovery.conf

pg_ctl start -w -D ${STANDBY_PGDATA}



# create cascade
pg_basebackup -h 127.0.0.1 -p ${PORT_STANDBY} -D ${CASCADE_PGDATA} --checkpoint=fast --progress

# postgresql.conf
cp ${BASEDIR}/postgresql.conf ${CASCADE_PGDATA}/postgresql.conf
echo "port = ${PORT_CASCADE}" >> ${CASCADE_PGDATA}/postgresql.conf

# recovery.conf
echo "standby_mode = 'on'" > ${CASCADE_PGDATA}/recovery.conf
echo "primary_conninfo = 'host=127.0.0.1 port=${PORT_STANDBY}'" >> ${CASCADE_PGDATA}/recovery.conf
echo "recovery_target_timeline = 'latest'">> ${CASCADE_PGDATA}/recovery.conf
echo "restore_command = 'sleep 2s && cp ${BASEDIR}/archive/%f %p'">> ${CASCADE_PGDATA}/recovery.conf

pg_ctl start -w -D ${CASCADE_PGDATA}

echo sleep...
sleep 3s
#insert data

psql -d postgres  -p ${PORT_PRIMARY} -c "create table t1( a int, b text);"
psql -d postgres  -p ${PORT_PRIMARY} -c "insert into t1 select generate_series(1,200000),'aaaaa';"

WAL_SENDER_PID=`psql -d postgres  -p ${PORT_PRIMARY} -t -A -c "select pid from pg_stat_replication;"`
kill -s SIGTERM "${WAL_SENDER_PID}"

psql -d postgres -p ${PORT_PRIMARY} -c "insert into t1 select generate_series(1,200000),'aaaaa';"

sleep 1s
pg_ctl stop -m i -D ${PRIMARY_PGDATA}

pg_ctl promote -D ${STANDBY_PGDATA}

sleep 20s
