#!/bin/bash
# Simulasi dua pekerja maintenance yang sama-sama ingin mengunci job:
# pekerja A sudah memegang kunci advisory dan tetap tersambung;
# pekerja B memanggil pg_try_advisory_lock dan mendapat jawaban false.

: "${PGDATABASE:=latihan}"
export PGDATABASE

TMPD=$(mktemp -d)
mkfifo "$TMPD/komando.fifo"

# Pekerja A: sesi psql yang tetap hidup, perintah dikirim lewat fifo
PGAPPNAME=pekerja-a psql -X < "$TMPD/komando.fifo" > "$TMPD/a.log" 2>&1 &
SESIA=$!
exec 3>"$TMPD/komando.fifo"

printf 'SELECT pg_advisory_lock(987654321);\n' >&3

# Tunggu sampai kunci advisory benar-benar terpasang di pg_locks
for i in $(seq 1 100); do
  n=$(psql -X -tA -c "SELECT count(*) FROM pg_locks
                      WHERE locktype = 'advisory' AND objid = 987654321
                        AND database = (SELECT oid FROM pg_database
                                         WHERE datname = current_database())")
  [ "$n" = "1" ] && break
  sleep 0.05
done

# Pekerja B: mencoba kunci yang sama tanpa menunggu
PGAPPNAME=pekerja-b psql -X \
  -c "SELECT pg_try_advisory_lock(987654321) AS kunci_berhasil;" \
  > "$TMPD/b.log" 2>&1

# Pekerja A melepas kunci setelah pekerjaannya selesai
printf 'SELECT pg_advisory_unlock(987654321);\n' >&3
exec 3>&-
wait $SESIA

echo "== Pekerja A (memegang kunci, lalu melepasnya) =="
cat "$TMPD/a.log"
echo
echo "== Pekerja B (kunci sudah dipegang orang lain) =="
cat "$TMPD/b.log"

rm -rf "$TMPD"
