From 90636755b26c5dbee8acdda5e37c7aff9e896854 Mon Sep 17 00:00:00 2001 From: blasty Date: Thu, 9 Jul 2026 11:22:18 +0200 Subject: harden client: transparent session auto-recovery + stress suite - auto-recover stale db ("Session not found" after server restart): drop pin, re-resolve sole session, retry once. Only when db was auto-injected; never silently switches an explicitly-pinned db (auto_recover_session gate). - tests/serverctl.sh: start/stop/kill9/ready control over spawn.sh - tests/stress_client.py: 6 adversarial scenarios, 24 assertions: dead-port fail-fast, tight-timeout recovery, worker crash, full restart (naive auto-recovery + no-autoswitch), 300/16 concurrency, kill-under-churn. All clean: no hangs, no deadlocks, no non-IDAError leaks. --- tests/serverctl.sh | 65 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100755 tests/serverctl.sh (limited to 'tests/serverctl.sh') diff --git a/tests/serverctl.sh b/tests/serverctl.sh new file mode 100755 index 0000000..a5bc098 --- /dev/null +++ b/tests/serverctl.sh @@ -0,0 +1,65 @@ +#!/usr/bin/env bash +# Control the ida-pro-mcp server for stress testing. Assumes ~/ida-venv + spawn.sh. +set -u +REPO="$(cd "$(dirname "$0")/.." && pwd)" +PORT=8745 +LOG=/tmp/ida-stress-spawn.log + +wait_port() { # wait_port + local want="$1" secs="${2:-40}" i + for ((i=0; i/dev/null | grep -q ":$PORT "; then + [ "$want" = up ] && return 0 + else + [ "$want" = down ] && return 0 + fi + sleep 0.5 + done + return 1 +} + +wait_ready() { # wait until hexrays_ready via the client + local secs="${1:-60}" i + for ((i=0; i/dev/null; then return 0; fi + sleep 1 + done + return 1 +} + +case "${1:-}" in + start) + cd "$REPO" + source ~/ida-venv/bin/activate 2>/dev/null + nohup ./spawn.sh >"$LOG" 2>&1 & + wait_port up 40 || { echo "PORT_TIMEOUT"; tail -5 "$LOG"; exit 1; } + wait_ready 90 || { echo "READY_TIMEOUT"; tail -5 "$LOG"; exit 1; } + ;; + stop) + # Kill the whole tree: uv wrapper, supervisor, worker. + pkill -9 -f 'idalib_server' 2>/dev/null + pkill -9 -f 'idalib-mcp' 2>/dev/null + pkill -9 -f 'uv run idalib' 2>/dev/null + wait_port down 20 || { echo "STOP_TIMEOUT"; exit 1; } + ;; + kill9) + # Hard kill only the worker (simulate a crash of the analysis process). + pkill -9 -f 'idalib_server' 2>/dev/null + ;; + ready) + wait_ready "${2:-60}" + ;; + *) + echo "usage: $0 {start|stop|kill9|ready [secs]}"; exit 2;; +esac -- cgit v1.3.1-sl0p