#!/usr/bin/env bash
# Mengukur replication lag dalam byte WAL dengan pg_wal_lsn_diff().
# Skrip ini melanjutkan pasangan server dari siapkan-pasangan.sh:
# primary di port 54355, standby di port 54356, database toko.
# Standby di-restart dengan recovery_min_apply_delay=4s untuk
# menghasilkan lag yang stabil dan dapat diukur ulang.
set -eu

PGBIN=/home/z/my-project/tools/dl/pgdeb/usr/lib/postgresql/17/bin
BASE=/home/z/my-project/tmp/rp_lag
PRI=$BASE/pgdata_pusat
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: pasangan sehat — lag byte kembali ke 0 =="
psql -X -h 127.0.0.1 -p 54355 -U postgres -d toko \
  -c "INSERT INTO penjualan VALUES (3, 'Ani', 32000), (4, 'Rudi', 15000);"
tunggu 54356 toko "SELECT count(*) FROM penjualan;" "4"
tunggu 54355 toko \
  "SELECT pg_wal_lsn_diff(pg_current_wal_lsn(), replay_lsn) FROM pg_stat_replication WHERE application_name = 'standby_cabang';" \
  "0"
psql -X -h 127.0.0.1 -p 54355 -U postgres -d toko \
  -c "SELECT pg_wal_lsn_diff(pg_current_wal_lsn(), replay_lsn) AS lag_byte FROM pg_stat_replication;"

echo "== Langkah 2: restart standby dengan jeda replay 4 detik =="
"$PGBIN/pg_ctl" -D "$STD" -m fast stop >/dev/null 2>&1
"$PGBIN/pg_ctl" -D "$STD" \
  -o "-p 54356 -k $SOCK -c listen_addresses=127.0.0.1 -c cluster_name=standby_cabang -c wal_receiver_status_interval=1s -c recovery_min_apply_delay=4s" \
  -l "$BASE/standby.log" start >/dev/null 2>&1
tunggu 54355 toko \
  "SELECT pg_wal_lsn_diff(pg_current_wal_lsn(), replay_lsn) FROM pg_stat_replication WHERE application_name = 'standby_cabang';" \
  "0"
echo "standby kembali tersambung, kini dengan jeda replay"

echo "== Langkah 3: 30 transaksi kecil di primary — ukur lag byte =="
psql -X -h 127.0.0.1 -p 54355 -U postgres -d toko <<'SQL'
INSERT INTO penjualan VALUES (11, 'Budi', 12000);
INSERT INTO penjualan VALUES (12, 'Siti', 9000);
INSERT INTO penjualan VALUES (13, 'Ani', 22000);
INSERT INTO penjualan VALUES (14, 'Rudi', 5000);
INSERT INTO penjualan VALUES (15, 'Budi', 15000);
INSERT INTO penjualan VALUES (16, 'Siti', 31000);
INSERT INTO penjualan VALUES (17, 'Ani', 8000);
INSERT INTO penjualan VALUES (18, 'Rudi', 27000);
INSERT INTO penjualan VALUES (19, 'Budi', 19000);
INSERT INTO penjualan VALUES (20, 'Siti', 6000);
INSERT INTO penjualan VALUES (21, 'Ani', 24000);
INSERT INTO penjualan VALUES (22, 'Rudi', 11000);
INSERT INTO penjualan VALUES (23, 'Budi', 30000);
INSERT INTO penjualan VALUES (24, 'Siti', 17000);
INSERT INTO penjualan VALUES (25, 'Ani', 9000);
INSERT INTO penjualan VALUES (26, 'Rudi', 21000);
INSERT INTO penjualan VALUES (27, 'Budi', 14000);
INSERT INTO penjualan VALUES (28, 'Siti', 26000);
INSERT INTO penjualan VALUES (29, 'Ani', 7000);
INSERT INTO penjualan VALUES (30, 'Rudi', 33000);
INSERT INTO penjualan VALUES (31, 'Budi', 16000);
INSERT INTO penjualan VALUES (32, 'Siti', 28000);
INSERT INTO penjualan VALUES (33, 'Ani', 13000);
INSERT INTO penjualan VALUES (34, 'Rudi', 20000);
INSERT INTO penjualan VALUES (35, 'Budi', 10000);
INSERT INTO penjualan VALUES (36, 'Siti', 25000);
INSERT INTO penjualan VALUES (37, 'Ani', 18000);
INSERT INTO penjualan VALUES (38, 'Rudi', 15000);
INSERT INTO penjualan VALUES (39, 'Budi', 23000);
INSERT INTO penjualan VALUES (40, 'Siti', 12000);
SQL
psql -X -h 127.0.0.1 -p 54355 -U postgres -d toko \
  -c "SELECT pg_wal_lsn_diff(pg_current_wal_lsn(), replay_lsn) AS lag_byte FROM pg_stat_replication;"
echo "jumlah baris di standby (replay tertunda):"
psql -X -h 127.0.0.1 -p 54356 -U postgres -d toko \
  -c "SELECT count(*) AS baris_standby FROM penjualan;"

echo "== Langkah 4: tunggu jeda terlewati — lag menyembuhkan =="
tunggu 54355 toko \
  "SELECT pg_wal_lsn_diff(pg_current_wal_lsn(), replay_lsn) FROM pg_stat_replication WHERE application_name = 'standby_cabang';" \
  "0"
psql -X -h 127.0.0.1 -p 54355 -U postgres -d toko \
  -c "SELECT pg_wal_lsn_diff(pg_current_wal_lsn(), replay_lsn) AS lag_byte FROM pg_stat_replication;"
psql -X -h 127.0.0.1 -p 54356 -U postgres -d toko \
  -c "SELECT count(*) AS baris_standby FROM penjualan;"
