#!/usr/bin/bash
# env
PGBIN=/tmp/fix/bin
#PGBIN=/usr/lib/postgresql/12/bin
PUB=/tmp/pub
SUB=/tmp/sub
PUB_PORT=5432
SUB_PORT=5433
TS=$(date +%FT%T)
PUB_LOG="$PUB"-"$TS".log
SUB_LOG="$SUB"-"$TS".log
unset PGPORT PGHOST PGDATABASE PGDATA LD_LIBRARY_PATH
export PGUSER=postgres
export PGOPTIONS="-c client_min_messages=ERROR"
export PATH="${PGBIN}:${PATH}"
function log {
L=$1; shift
echo "$(date +'%F %T') ${L}: $@"
}
# cleanup
pkill "pgbench"
for i in "$PUB" "$SUB"; do
test -d "$i" || continue
test -f "$i"/postmaster.pid && "$PGBIN"/pg_ctl -w -s -D "$i" -m immediate stop;
log LOG "stopped old instance in $i: $?"
rm -r "$i"
done
# cluster
"$PGBIN"/initdb -U postgres -N "$PUB" &>/dev/null; log LOG "init publisher: $?"
echo "wal_level=logical" >> "$PUB"/postgresql.conf
echo "log_min_messages=debug1" >> "$PUB"/postgresql.conf
echo "log_error_verbosity=verbose" >> "$PUB"/postgresql.conf
"$PGBIN"/initdb -U postgres -N "$SUB" &>/dev/null; log LOG "init subscriber: $?"
echo "log_min_messages=debug1" >> "$SUB"/postgresql.conf
echo "log_error_verbosity=verbose" >> "$SUB"/postgresql.conf
echo "port=$SUB_PORT" >> "$SUB"/postgresql.conf
"$PGBIN"/pg_ctl -w -s -D $PUB -l "$PUB_LOG" start; log LOG "published started: $?"
"$PGBIN"/pg_ctl -w -s -D $SUB -l "$SUB_LOG" start; log LOG "subscriber started: $?"
"$PGBIN"/pgbench -p "$PUB_PORT" -qis 5
"$PGBIN"/pg_dump -p "$PUB_PORT" -s | "$PGBIN"/psql -qXp "$SUB_PORT" -o /dev/null
# fake activity
"$PGBIN"/pgbench -p "$PUB_PORT" -T 300 -c 1 &> /dev/null &
# replication setup
"$PGBIN"/psql -p "$PUB_PORT" -Xc "CREATE PUBLICATION prov FOR ALL TABLES"
"$PGBIN"/psql -p "$SUB_PORT" -Xc "CREATE SUBSCRIPTION sub
CONNECTION 'host=127.0.0.1 port=5432'
PUBLICATION prov"
# wait for the streaming
unset V;
until [ "$V" == "0" ]; do
V=$("$PGBIN"/psql -p "$SUB_PORT" -AtXc "SELECT count(srsubstate)
FROM pg_subscription_rel
WHERE srsubstate <> 'r'"
)
log LOG "waiting for all table to be ready: $V"
sleep 1
done
grep -E "subscription.*has finished" "$SUB_LOG"
sleep 2
log LOG "bugging it"
# this should trigger the bug
"$PGBIN"/psql -h 127.0.0.1 -p "$SUB_PORT" -Xc \
"ALTER TABLE pgbench_branches ADD id INT NOT NULL DEFAULT 0"
sleep 5
grep -E "ERROR|WARNING" "$PUB_LOG" "$SUB_LOG"