#!/bin/bash
# Write WAL containing XLOG2 records with 19beta3, then read it with the
# pg_waldump of REL_19_STABLE after the revert.  Both use XLOG_PAGE_MAGIC
# 0xD121.
#
# usage: xlog2_magic_demo.sh <beta3 prefix> <REL_19_STABLE prefix>
set -e
BETA3=$1; REL19=$2
D=/tmp/xlog2_magic_demo; PORT=5641
rm -rf $D
$BETA3/bin/initdb -D $D -U postgres --no-data-checksums >/dev/null 2>&1
$BETA3/bin/pg_ctl -D $D -o "-p $PORT -k /tmp -c wal_keep_size=1GB" -l $D/log -w start >/dev/null
trap '$BETA3/bin/pg_ctl -D $D -m fast -w stop >/dev/null 2>&1; rm -rf $D' EXIT
q() { $BETA3/bin/psql -h /tmp -p $PORT -U postgres -XAt postgres -c "$1"; }

START=$(q "SELECT pg_current_wal_lsn()")
q "SELECT pg_enable_data_checksums()" >/dev/null
for i in $(seq 1 120); do [ "$(q 'SHOW data_checksums')" = on ] && break; sleep 0.5; done
END=$(q "SELECT pg_current_wal_insert_lsn()")
SEG1=$(q "SELECT pg_walfile_name('$START')")
SEG2=$(q "SELECT pg_walfile_name('$END')")
echo "19beta3: data_checksums = $(q 'SHOW data_checksums'), WAL $START .. $END ($SEG1 .. $SEG2)"
q "CHECKPOINT" >/dev/null

echo
echo "== pg_waldump of 19beta3, XLOG2 records =="
$BETA3/bin/pg_waldump -p $D/pg_wal -s $START -e $END -r XLOG2 $SEG1 $SEG2 2>&1 | cut -c1-150

echo
echo "== magic in the segment header =="
echo "$SEG1: 0x$(od -An -tx2 -N2 $D/pg_wal/$SEG1 | tr -d ' ' | tr a-f A-F)"

echo
echo "== pg_waldump of REL_19_STABLE (after the revert), same WAL =="
$REL19/bin/pg_waldump -p $D/pg_wal -s $START -e $END $SEG1 $SEG2 2>&1 | grep -v -E '^rmgr: (Heap|Heap2|Btree|Standby|Transaction|Storage|CLOG|Database|Tablespace|MultiXact|RelMap|SPGist|BRIN|CommitTs|ReplicationOrigin|Generic|LogicalMessage|XLOG) ' | cut -c1-150 | head -8
