#!/usr/bin/env bash
# VICIfast Research, Report 01: The Two Bottlenecks Inside a Busy VICIdial Server
# Test harness. FOR A TEST SERVER, NOT A LIVE FLOOR. Read it before you run it.
# The report load used in the engine side-by-side (section 4): heavy reads of
# vicidial_log in loops, and one OPTIMIZE TABLE vicidial_log. Test servers only.
#
# Identical report load for the engine A/B: the heavy reads seen on a production floor
# (2026-10-22). Read-only except the one OPTIMIZE, which stands in for VICIdial's nightly job.
# usage: reportload.sh <seconds> <optimize_at_seconds>
DB=$(awk -F'=> *' '/^VARDB_database/{print $2}' /etc/astguiclient.conf | tr -d ' \r')
DUR=$1; OPT=$2; END=$(( $(date +%s) + DUR ))
L=/root/vf-engine-ab/pressure/reportload.$(date +%H%M).log
q() { local s=$(date +%s.%N); mysql -N "$DB" -e "$1" >/dev/null 2>&1; echo "$2 $(echo "$(date +%s.%N) - $s" | bc)" >> "$L"; }
loop() { while [ $(date +%s) -lt $END ]; do q "$2" "$1"; sleep "$3"; done; }
loop floor "SELECT COUNT(*), SUM(status IN ('DROP','XDROP')), SUM(status='SALE'), SUM(length_in_sec) FROM vicidial_log WHERE call_date >= CURDATE()" 20 &
loop pace  "SELECT DATEDIFF(CURDATE(), DATE(call_date)) d, HOUR(call_date) h, COUNT(*) FROM vicidial_log WHERE call_date >= CURDATE() - INTERVAL 7 DAY AND status='SALE' GROUP BY d, h" 30 &
loop ustat "SELECT count(*), status, sum(length_in_sec) FROM vicidial_log WHERE user=(SELECT user FROM vicidial_live_agents ORDER BY RAND() LIMIT 1) AND call_date >= CURDATE() GROUP BY status" 15 &
loop camp  "SELECT campaign_id, status, COUNT(*) FROM vicidial_log WHERE call_date >= CURDATE() GROUP BY campaign_id, status" 30 &
( sleep "$OPT"; q "OPTIMIZE TABLE vicidial_log" optimize ) &
wait
awk '{n[$1]++; s[$1]+=$2; if($2>m[$1])m[$1]=$2} END{for(k in n) printf "   load %-8s runs %3d  avg %6.2fs  max %6.2fs\n", k, n[k], s[k]/n[k], m[k]}' "$L" | sort
