#! /bin/sh
set -ex

# set "oldbin" and "newbin" in the environment

data=upgrade-timeline
PGDATABASE=upgrade_timeline
PGPORT=1
export PGDATABASE PGPORT
unset PGUSER PGDATA

# master
$oldbin/initdb -D m1$data
cat >m1$data/pg_hba.conf <<EOF
local all all ident
local replication all ident
EOF
cat >m1$data/postgresql.conf <<EOF
log_statement = all
log_line_prefix = '%p %m '
log_filename = l
autovacuum = off
listen_addresses = ''
log_min_messages = debug1
max_connections = 40
shared_buffers = 24MB
datestyle = 'iso, mdy'
lc_messages = 'en_US.UTF-8'
lc_monetary = 'en_US.UTF-8'
lc_numeric = 'en_US.UTF-8'
lc_time = 'en_US.UTF-8'
default_text_search_config = 'pg_catalog.english'

logging_collector = on
hot_standby = on
wal_level = hot_standby
archive_mode = on
archive_command = ':'
max_wal_senders = 1
wal_keep_segments = 5
#vacuum_defer_cleanup_age = 10000
max_standby_archive_delay = 0
max_standby_streaming_delay = 0
EOF
$oldbin/pg_ctl -w -D m1$data start
$oldbin/createdb
$oldbin/psql -c "SELECT pg_start_backup('foo', true)"
cp -a m1$data s1$data
$oldbin/psql -c 'SELECT pg_stop_backup()'

# standby
rm s1$data/postmaster.pid
cat >s1$data/recovery.conf <<EOF
standby_mode = 'on'
primary_conninfo = 'port=1'
EOF
PGPORT=2 $oldbin/pg_ctl -w -D s1$data start

# promote, stop
PGPORT=2 $oldbin/pg_ctl -D s1$data promote
PGPORT=2 $oldbin/pg_ctl -w -D s1$data -m fast stop
$oldbin/pg_ctl -w -D m1$data -m fast stop

# upgrade, track TLI assignments
gettli() { $1/pg_controldata $2 | grep -i timeline; }
$newbin/initdb -D m2$data
cp s1$data/pg_hba.conf s1$data/postgresql.conf m2$data
gettli $newbin m2$data
$newbin/pg_upgrade -d s1$data -D m2$data -b "$oldbin" -B "$newbin"
gettli $oldbin m1$data
gettli $oldbin s1$data
gettli $newbin m2$data

$newbin/pg_ctl -w -D m2$data start
$newbin/psql -c "SELECT pg_start_backup('foo', true)"
cp -a m2$data s2$data
$newbin/psql -c 'SELECT pg_stop_backup()'

# new standby
#   may fail to start due to this problem:
#   http://www.postgresql.org/message-id/flat/D5359E0908278642BB1747131D62694DAB22560F@AUSMXMBX01.mrws.biz
rm s2$data/postmaster.pid
cat >s2$data/recovery.conf <<EOF
standby_mode = 'on'
primary_conninfo = 'port=1'
EOF
PGPORT=2 $newbin/pg_ctl -w -D s2$data start

PGPORT=2 $newbin/pg_ctl -w -D s2$data -m fast stop
PGPORT=1 $newbin/pg_ctl -w -D m2$data -m fast stop
