#!/bin/bash

set -x

PGPATH=${PGPATH:-"$HOME/pg18/bin"}
PGDATA1=/c/pgdata1
PGDATA2=/c/pgdata2
PGDATA3=/c/pgdata3
PGPORT1=9991
PGPORT2=9992
PGPORT3=9993
PGDATABASE=postgres
PAGER=""

PGSCALEFACTOR=1
PGCLIENTS=1
PGTESTDURATION=2

export LANG=C
export PAGER
ulimit -c unlimited

if [ -f $PGDATA1/postmaster.pid ]; then
	$PGPATH/pg_ctl stop -D $PGDATA1
fi

if [ -f $PGDATA2/postmaster.pid ]; then
	$PGPATH/pg_ctl stop -D $PGDATA2
fi

if [ -f $PGDATA3/postmaster.pid ]; then
	$PGPATH/pg_ctl stop -D $PGDATA3
fi

if [ -d $PGDATA1 ]; then
	rm -rf $PGDATA1
fi
if [ -d $PGDATA2 ]; then
	rm -rf $PGDATA2
fi
if [ -d $PGDATA3 ]; then
	rm -rf $PGDATA3
fi

$PGPATH/initdb -D $PGDATA1
$PGPATH/initdb -D $PGDATA2

echo "wal_level = logical" >> $PGDATA1/postgresql.conf
echo "logging_collector = on" >> $PGDATA1/postgresql.conf
echo "log_filename = 'postgresql.log'" >> $PGDATA1/postgresql.conf
echo "port = $PGPORT1" >> $PGDATA1/postgresql.conf
#echo "log_min_messages = debug2" >> $PGDATA1/postgresql.conf

echo "wal_level = logical" >> $PGDATA2/postgresql.conf
echo "logging_collector = on" >> $PGDATA2/postgresql.conf
echo "log_filename = 'postgresql.log'" >> $PGDATA2/postgresql.conf
#echo "log_min_messages = debug2" >> $PGDATA2/postgresql.conf
echo "port = $PGPORT2" >> $PGDATA2/postgresql.conf

$PGPATH/pg_ctl start -w -D $PGDATA1
$PGPATH/pg_ctl start -w -D $PGDATA2

$PGPATH/pgbench -i -s $PGSCALEFACTOR -p $PGPORT1 $PGDATABASE

# add primary key to pgbench_history
$PGPATH/psql -X -c "BEGIN; ALTER TABLE pgbench_history REPLICA IDENTITY FULL; COMMIT;" -p $PGPORT1 $PGDATABASE

# copy schema to subscriber
$PGPATH/pg_dump -s -p $PGPORT1 $PGDATABASE | $PGPATH/psql -f - -p $PGPORT2 $PGDATABASE

# create publication on publisher
$PGPATH/psql -X -c "CREATE PUBLICATION pub1 FOR TABLE pgbench_accounts" -p $PGPORT1 $PGDATABASE
$PGPATH/psql -X -c "CREATE PUBLICATION pub2 FOR TABLE pgbench_tellers, pgbench_branches" -p $PGPORT1 $PGDATABASE
$PGPATH/psql -X -c "CREATE PUBLICATION pub3 FOR TABLE pgbench_history" -p $PGPORT1 $PGDATABASE

# create subscription on subscriber
$PGPATH/psql -X -c "CREATE SUBSCRIPTION sub1 CONNECTION 'port=$PGPORT1 dbname=$PGDATABASE' PUBLICATION pub1" -p $PGPORT2 $PGDATABASE
$PGPATH/psql -X -c "CREATE SUBSCRIPTION sub2 CONNECTION 'port=$PGPORT1 dbname=$PGDATABASE' PUBLICATION pub2" -p $PGPORT2 $PGDATABASE
$PGPATH/psql -X -c "CREATE SUBSCRIPTION sub3 CONNECTION 'port=$PGPORT1 dbname=$PGDATABASE' PUBLICATION pub3" -p $PGPORT2 $PGDATABASE

# execute some transactions
$PGPATH/pgbench -T $PGTESTDURATION -c $PGCLIENTS -p $PGPORT1 $PGDATABASE

# check replication monitoring
$PGPATH/psql -X -c "SELECT pg_current_wal_lsn() <= write_lsn AND state = 'streaming' FROM pg_catalog.pg_stat_replication WHERE application_name = 'sub1'" -p $PGPORT1 $PGDATABASE
#$PGPATH/psql -X -c "SELECT * FROM pg_catalog.pg_replication_slots" -p $PGPORT1 $PGDATABASE
#$PGPATH/psql -X -c "SELECT * FROM pg_catalog.pg_stat_replication_slots" -p $PGPORT1 $PGDATABASE
#$PGPATH/psql -X -c "SELECT * FROM pg_catalog.pg_stat_replication" -p $PGPORT1 $PGDATABASE
#$PGPATH/psql -X -c "SELECT * FROM pg_catalog.pg_stat_activity where backend_type = 'walsender'" -p $PGPORT1 $PGDATABASE
#$PGPATH/psql -X -c "SELECT * FROM pg_catalog.pg_subscription_rel" -p $PGPORT2 $PGDATABASE

# create physical replica from subscriber
$PGPATH/pg_basebackup -D $PGDATA3 -R -X stream -c fast -P -v -p $PGPORT2 -C -S primaryslot
sed -i "s/port = $PGPORT2/port = $PGPORT3/" $PGDATA3/postgresql.conf
rm -rf $PGDATA3/log/*.log

# start standby
$PGPATH/pg_ctl start -w -D $PGDATA3

# reduce GUC
echo "max_active_replication_origins = 1" >> $PGDATA3/postgresql.conf
#echo "max_replication_slots = 1" >> $PGDATA3/postgresql.conf

# start standby
$PGPATH/pg_ctl restart -w -D $PGDATA3

#grep -E 'PANIC|FATAL|ERROR' $PGDATA3/log/postgresql.log

$PGPATH/pg_ctl stop -D $PGDATA1
$PGPATH/pg_ctl stop -D $PGDATA2
$PGPATH/pg_ctl stop -D $PGDATA3

tail -n 15 $PGDATA3/log/postgresql.log
