#!/bin/bash
# usage: repro.sh <label>   ; uses $HOME/pginst
set -u
export PATH=$HOME/pginst/bin:$PATH
W=$HOME/cf7587_$1; rm -rf $W; mkdir -p $W; cd $W
PORT=54387
trap 'pg_ctl -D $W/data stop -m fast >/dev/null 2>&1' EXIT
echo "### initdb (checksums off)"
initdb --no-data-checksums -D data -A trust >/dev/null 2>&1 && echo ok
cat >> data/postgresql.conf <<C
summarize_wal=on
port=$PORT
unix_socket_directories='$W'
C
pg_ctl -D data -l data.log -w start >/dev/null
psql -h $W -p $PORT -d postgres -qc "create table t as select g from generate_series(1,10000) g;"
echo "### full backup (checksums off)"
pg_basebackup -h $W -p $PORT -D full -cfast
pg_controldata full | grep -i checksum
psql -h $W -p $PORT -d postgres -qc "update t set g=g+1;"
pg_ctl -D data -w stop >/dev/null
echo "### pg_checksums --enable offline"
pg_checksums --enable -D data | tail -3
pg_ctl -D data -l data.log -w start >/dev/null
psql -h $W -p $PORT -d postgres -qc "update t set g=g+1;"
echo "### incremental backup (checksums on)"
pg_basebackup -h $W -p $PORT -D incr1 -cfast --incremental=full/backup_manifest
pg_controldata incr1 | grep -i checksum
echo "### pg_combinebackup full incr1 (offline-enabled case)"
pg_combinebackup full incr1 -o out1; echo "exit=$?"
echo "### online enable case"
pg_ctl -D data -w stop >/dev/null
pg_checksums --disable -D data | tail -1
pg_ctl -D data -l data.log -w start >/dev/null
pg_basebackup -h $W -p $PORT -D full2 -cfast
psql -h $W -p $PORT -d postgres -qc "update t set g=g+1;"
psql -h $W -p $PORT -d postgres -Atc "select pg_enable_data_checksums()" 2>&1
for i in $(seq 1 60); do s=$(psql -h $W -p $PORT -d postgres -Atc "show data_checksums"); [ "$s" = on ] && break; sleep 1; done
echo "data_checksums=$s"
psql -h $W -p $PORT -d postgres -qc "update t set g=g+1;"
pg_basebackup -h $W -p $PORT -D incr2 -cfast --incremental=full2/backup_manifest
pg_controldata full2 | grep -i checksum; pg_controldata incr2 | grep -i checksum
pg_combinebackup full2 incr2 -o out2; echo "exit=$?"
