#!/bin/sh
# DF-0945 focused experiment v3 — logs to persistent /root/, lighter pressure.
set -u
LOG=/root/df0945_exp3.log
SWAP_MB="${1:-8}"
STRESS_MB="${2:-3250}"
RUNS="${3:-200}"
VNDEV=vn1
SF=/tmp/sf.img

log() { echo "$@" >> $LOG; }

echo "=== DF-0945 exp3 $(date) SWAP_MB=$SWAP_MB STRESS_MB=$STRESS_MB RUNS=$RUNS ===" > $LOG

swapoff /dev/$VNDEV 2>/dev/null
vnconfig -u $VNDEV 2>/dev/null
rm -f $SF
swapoff /dev/vbd0s1b 2>/dev/null; sleep 0.5
swapon /dev/vbd0s1b; sleep 0.2
dd if=/dev/zero of=$SF bs=1m count=$SWAP_MB 2>>$LOG
vnconfig -c $VNDEV $SF
swapon /dev/$VNDEV; sleep 0.2
log "--- initial swap ---"
swapctl -l >> $LOG 2>&1

log "--- starting stressor $STRESS_MB MB for 120s ---"
su -m maxx -c "/home/maxx/poc/DF-0945/stress $STRESS_MB 120" &
SP=$!

log "--- waiting 25s for dirty+swap ---"
sleep 25
log "--- PRE-TOGGLE swap state ---"
sysctl vm.swap_anon_use vm.swap_free vm.stats.vm.v_free_count >> $LOG 2>&1

log "--- TOGGLE LOOP ($RUNS iterations) ---"
i=0; ok=0; fail=0
while [ "$i" -lt "$RUNS" ]; do
    i=$((i + 1))
    swapoff /dev/$VNDEV 2>/dev/null
    rc=$?
    case $rc in
        0) ok=$((ok + 1)) ;;
        *) fail=$((fail + 1)) ;;
    esac
    swapon /dev/$VNDEV 2>/dev/null
    if [ "$((i % 20))" -eq 0 ]; then
        sa=$(sysctl -n vm.swap_anon_use 2>/dev/null)
        sf=$(sysctl -n vm.swap_free 2>/dev/null)
        fc=$(sysctl -n vm.stats.vm.v_free_count 2>/dev/null)
        log "  iter=$i ok=$ok fail=$fail swap_anon=$sa swap_free=$sf free=$fc"
    fi
done
log "--- DONE: $RUNS iters ok=$ok fail=$fail ---"
log "--- POST-TOGGLE ---"
sysctl vm.swap_anon_use vm.swap_free vm.stats.vm.v_free_count >> $LOG 2>&1
swapctl -l >> $LOG 2>&1

kill -TERM $SP 2>/dev/null; kill -KILL $SP 2>/dev/null; wait 2>/dev/null
swapoff /dev/$VNDEV 2>/dev/null; vnconfig -u $VNDEV 2>/dev/null; rm -f $SF
log "=== complete $(date) ==="
