#!/usr/bin/env bash
# Konsistensi eventual dan masalah read-your-own-writes di read replica.
# Replica di-restart dengan recovery_min_apply_delay=4s agar jeda replay
# cukup panjang untuk disaksikan: baris yang baru ditulis di primary
# tidak langsung terbaca di replica, lalu muncul setelah jeda terlewati.
# Skrip ini melanjutkan pasangan server dari siapkan-replica.sh.
set -eu

PGBIN=/home/z/my-project/tools/dl/pgdeb/usr/lib/postgresql/17/bin
BASE=/home/z/my-project/tmp/rp_read
STD=$BASE/pgdata_cabang
SOCK=$BASE/sock

# 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: restart replica dengan jeda replay 4 detik =="
"$PGBIN/pg_ctl" -D "$STD" -m fast stop >/dev/null 2>&1
"$PGBIN/pg_ctl" -D "$STD" \
  -o "-p 54362 -k $SOCK -c listen_addresses=127.0.0.1 -c cluster_name=standby_cabang -c recovery_min_apply_delay=4s" \
  -l "$BASE/standby.log" start >/dev/null 2>&1
tunggu 54362 toko "SELECT count(*) FROM pelanggan;" "4"
echo "replica kembali melayani baca"

echo "== Langkah 2: tulis satu pelanggan baru di primary =="
psql -X -h 127.0.0.1 -p 54361 -U postgres -d toko \
  -c "INSERT INTO pelanggan VALUES (5, 'Wati', 'Semarang', 90);"
echo "lomba pencarian pelanggan Wati:"

echo "== Langkah 3: baca SEGERA dari replica — Wati belum ada =="
psql -X -h 127.0.0.1 -p 54362 -U postgres -d toko \
  -c "SELECT count(*) AS baris_replica, count(*) FILTER (WHERE nama = 'Wati') AS ketemu_wati FROM pelanggan;"

echo "== Langkah 4: baca yang sama dari primary — Wati sudah ada =="
psql -X -h 127.0.0.1 -p 54361 -U postgres -d toko \
  -c "SELECT count(*) AS baris_primary, count(*) FILTER (WHERE nama = 'Wati') AS ketemu_wati FROM pelanggan;"

echo "== Langkah 5: setelah jeda 4 detik terlewati, Wati tiba di replica =="
tunggu 54362 toko "SELECT count(*) FROM pelanggan;" "5"
psql -X -h 127.0.0.1 -p 54362 -U postgres -d toko \
  -c "SELECT id, nama, kota, poin FROM pelanggan ORDER BY poin DESC, id;"
