#!/bin/bash
# driver.sh <exp...>: run mitigation experiments back to back, resetting state between them.
D=180
reset() {
  systemctl stop systemd-oomd 2>/dev/null
  rm -rf /etc/systemd/system/agent.slice.d /etc/systemd/system/thrash.slice.d /etc/systemd/oomd.conf.d
  systemctl daemon-reload
  echo n > /sys/kernel/mm/lru_gen/enabled; echo 0 > /sys/kernel/mm/lru_gen/min_ttl_ms
  swapoff -a 2>/dev/null; [ -e /sys/block/zram0 ] && echo 1 > /sys/block/zram0/reset
  [ -e /sys/fs/cgroup/thrash.slice/io.max ] && echo "259:0 rbps=max wbps=max riops=max wiops=max" > /sys/fs/cgroup/thrash.slice/io.max
  unset AGENT_PROPS APP_PROPS; sleep 20
}
dropin() { mkdir -p /etc/systemd/system/$1.d; printf "[Slice]\n$2\n" > /etc/systemd/system/$1.d/lab.conf; systemctl daemon-reload; }
zram() { modprobe zram; a=$(tr " " "\n" < /sys/block/zram0/comp_algorithm | tr -d "[]" | grep -m1 -E "^(zstd|lz4|lzo-rle|lzo)$"); echo $a > /sys/block/zram0/comp_algorithm; echo zram_alg=$a; echo 512M > /sys/block/zram0/disksize; mkswap /dev/zram0 >/dev/null; swapon -p 100 /dev/zram0; }
for e in "$@"; do
  reset
  case $e in
    r0-baseline) ./run.sh $e $D ;;
    r1-memlow)   dropin agent.slice "MemoryLow=64M"; export AGENT_PROPS="-p MemoryLow=64M"; ./run.sh $e $D ;;
    r2-iomax)    dropin thrash.slice "IOReadBandwidthMax=/dev/nvme0n1 20M"; ./run.sh $e $D ;;
    r3-mglru)    echo y > /sys/kernel/mm/lru_gen/enabled; ./run.sh $e $D ;;
    r4-mglru-ttl) echo y > /sys/kernel/mm/lru_gen/enabled; echo 1000 > /sys/kernel/mm/lru_gen/min_ttl_ms; ./run.sh $e $D ;;
    r5-zram)     zram; ./run.sh $e $D half ;;
    r6-zram-oomd) zram; dropin thrash.slice "ManagedOOMMemoryPressure=kill"; systemctl start systemd-oomd; ./run.sh $e $D half ;;
    r7-memhigh)  export APP_PROPS="-p MemoryHigh=330M"; ./run.sh $e $D ;;
    r8-memlow-iomax) dropin agent.slice "MemoryLow=64M"; export AGENT_PROPS="-p MemoryLow=64M"; dropin thrash.slice "IOReadBandwidthMax=/dev/nvme0n1 20M"; ./run.sh $e $D ;;
    r2b-iomax-iops) dropin thrash.slice "IOReadBandwidthMax=/dev/nvme0n1 5M\nIOReadIOPSMax=/dev/nvme0n1 500"; ./run.sh $e $D ;;
    r8b-memlow-iomax-iops) dropin agent.slice "MemoryLow=64M"; export AGENT_PROPS="-p MemoryLow=64M"; dropin thrash.slice "IOReadBandwidthMax=/dev/nvme0n1 5M\nIOReadIOPSMax=/dev/nvme0n1 500"; ./run.sh $e $D ;;
    r4b-mglru-ttl10s) echo y > /sys/kernel/mm/lru_gen/enabled; echo 10000 > /sys/kernel/mm/lru_gen/min_ttl_ms; ./run.sh $e $D ;;
    r9b-zram-rand) zram; ./run.sh $e $D rand ;;
    r0c-baseline) ./run.sh $e $D ;;
    r4c-mglru-ttl10s) echo y > /sys/kernel/mm/lru_gen/enabled; echo 10000 > /sys/kernel/mm/lru_gen/min_ttl_ms; ./run.sh $e $D ;;
    r9c-zram-rand) zram; ./run.sh $e $D rand ;;
    r0b-baseline) ./run.sh $e $D ;;
    r9-zram-incompressible) zram; ./run.sh $e $D rand ;;
  esac
  date +%s > /opt/lab/out/$e/end
done
reset; echo ALLDONE > /opt/lab/out/ALLDONE3
