#!/usr/bin/env bash
# Setzt die Zahl der PHP-Arbeiter des Shop-Pools auf allen Frontends.
#
#   fpm-arbeiter.sh zeigen
#   fpm-arbeiter.sh setzen <anzahl>
#
# Warum ueberhaupt: pm.max_children ist die Obergrenze fuer alles, was an
# Varnish vorbeigeht. Beim Lasttest am 25.09.2026 war sie bei 200
# gleichzeitigen Einkaeufern erreicht - waehrend die Datenbank noch ruhig war
# und der Speicher zu zwei Dritteln frei.
#
# Die Zahl ist KEIN Freibrief: ein Arbeiter braucht rund 23 MB, aber die
# Maschinen haben nur zwei Kerne. Mehr Arbeiter als die CPU bedienen kann
# bedeutet nur, dass die Warteschlange woanders steht. Genau deshalb wird
# hier verstellt UND anschliessend neu gemessen.
set -uo pipefail

BEFEHL="${1:-zeigen}"
ANZAHL="${2:-}"
POOL=/etc/php/8.5/fpm/pool.d/riccardo.conf

cd "$(dirname "$0")"
source ./lib-knoten.sh
rz_pruefe_schluessel || exit 1

mapfile -t KNOTEN < <(rz_knoten) || exit 1

for eintrag in "${KNOTEN[@]}"; do
    set -- $eintrag; name="$1"; ip="$2"
    printf '  %-12s ' "$name"

    if [ "$BEFEHL" != setzen ]; then
        rz_ssh "$ip" "
            printf 'max_children=%s  laufend=%s  ' \
                \"\$(grep -oP '^pm.max_children\s*=\s*\K\d+' $POOL)\" \
                \"\$(pgrep -c -f 'php-fpm: pool riccardo')\"
            free -m | awk '/^Mem:/{printf \"frei=%d MB  \", \$7}'
            printf 'Kerne=%s\n' \"\$(nproc)\"
        "
        continue
    fi

    [[ "$ANZAHL" =~ ^[0-9]+$ ]] || { echo "Anzahl fehlt oder ist keine Zahl."; exit 1; }

    rz_ssh "$ip" "
        set -e
        cp $POOL $POOL.vor-\$(date +%Y%m%d-%H%M%S)
        alt=\$(grep -oP '^pm.max_children\s*=\s*\K\d+' $POOL)

        # Speicher gegenrechnen, bevor die Maschine ins Swappen kippt.
        frei=\$(free -m | awk '/^Mem:/{print \$7}')
        braucht=\$(( $ANZAHL * 40 ))
        if [ \"\$braucht\" -gt \"\$frei\" ]; then
            echo \"$ANZAHL Arbeiter braeuchten rund \${braucht} MB, frei sind nur \${frei} MB - abgelehnt.\"
            exit 1
        fi

        sed -i -E 's/^pm.max_children\s*=.*/pm.max_children = $ANZAHL/' $POOL
        # start_servers und die Spannen muessen mitwachsen, sonst startet FPM
        # gar nicht erst: min_spare darf nicht ueber max_children liegen.
        sed -i -E 's/^pm.start_servers\s*=.*/pm.start_servers = '\$(( $ANZAHL / 4 ))'/' $POOL
        sed -i -E 's/^pm.min_spare_servers\s*=.*/pm.min_spare_servers = '\$(( $ANZAHL / 6 + 1 ))'/' $POOL
        sed -i -E 's/^pm.max_spare_servers\s*=.*/pm.max_spare_servers = '\$(( $ANZAHL / 3 ))'/' $POOL

        if ! php-fpm8.5 -t 2>&1 | grep -q 'successful'; then
            echo 'Konfiguration fehlerhaft - alter Stand wird zurueckgespielt'
            cp \$(ls -t $POOL.vor-* | head -1) $POOL
            exit 1
        fi
        systemctl reload php8.5-fpm
        sleep 2
        printf '%s -> %s Arbeiter, Dienst %s\n' \"\$alt\" \"$ANZAHL\" \"\$(systemctl is-active php8.5-fpm)\"
    " || { echo "    fehlgeschlagen"; exit 1; }
done

if [ "$BEFEHL" = setzen ]; then
    echo "  Gegenprobe:"
    for eintrag in "${KNOTEN[@]}"; do
        set -- $eintrag
        rz_ssh "$2" "curl -s -o /dev/null -w '    $1 Shop: %{http_code}\n' -H 'Host: shop.riccardo-zigarette.de' http://127.0.0.1/"
    done
fi
