#!/usr/bin/env bash
# Simulasi failover: primary mati mendadak, standby dipromosikan
# menjadi primary baru yang menerima tulisan.
# Skrip ini melanjutkan pasangan server dari siapkan-pasangan.sh:
# primary di port 54365, standby di port 54366, database toko.
# Setelah skrip ini: primary lama mati, standby sudah menjadi
# primary baru (timeline 2) dan tetap berjalan.
set -eu

PGBIN=/home/z/my-project/tools/dl/pgdeb/usr/lib/postgresql/17/bin
BASE=/home/z/my-project/tmp/rp_failover
PRI=$BASE/pgdata_pusat
STD=$BASE/pgdata_cabang

# Polling: tunggu sampai sebuah query mengembalikan nilai yang diharapkan.
tunggu() {  # port database sql nilai_yang_diharapkan
  local port="$1" db="$2" sql="$3" harapan="$4" i hasil
  for i in $(seq 1 150); do
    hasil=$(psql -X -q -t -A -h 127.0.0.1 -p "$port" -U postgres -d "$db" \
            -c "$sql" 2>/dev/null) || true
    if [ "$hasil" = "$harapan" ]; then return 0; fi
    sleep 0.2
  done
  echo "TIMEOUT: menunggu '$sql' menjadi $harapan (port $port)" >&2
  return 1
}

echo "== Langkah 1: tulisan terakhir yang sempat tereplikasi =="
psql -X -h 127.0.0.1 -p 54365 -U postgres -d toko \
  -c "INSERT INTO produk VALUES (4, 'Susu Kental', 9000);"
tunggu 54366 toko "SELECT count(*) FROM produk;" "4"
echo "keempat baris sudah aman di standby"

echo "== Langkah 2: bencana — primary mati mendadak (immediate) =="
"$PGBIN/pg_ctl" -D "$PRI" -m immediate stop >/dev/null 2>&1
echo "primary mati"

echo "== Langkah 3: standby masih melayani pembacaan =="
psql -X -h 127.0.0.1 -p 54366 -U postgres -d toko \
  -c "SELECT count(*) AS baris_tersedia FROM produk;"

echo "== Langkah 4: promosikan standby menjadi primary =="
"$PGBIN/pg_ctl" -D "$STD" -W promote >/dev/null 2>&1
tunggu 54366 toko "SELECT pg_is_in_recovery();" "f"
echo "promosi selesai"

echo "== Langkah 5: primary baru menerima tulisan =="
psql -X -h 127.0.0.1 -p 54366 -U postgres -d toko \
  -c "INSERT INTO produk VALUES (5, 'Keju Slice', 21000);"
psql -X -h 127.0.0.1 -p 54366 -U postgres -d toko \
  -c "SELECT id, nama, harga FROM produk ORDER BY id;"

echo "== Langkah 6: bukti timeline baru di primary hasil promosi =="
psql -X -h 127.0.0.1 -p 54366 -U postgres -d toko \
  -c "CHECKPOINT;" \
  -c "SELECT timeline_id FROM pg_control_checkpoint();"
echo "file riwayat timeline di pg_wal:"
ls "$STD/pg_wal" | grep history
