#!/usr/bin/env bash set -euo pipefail cd "$(dirname "$0")/.." if [[ "${1:-}" != "--inside" ]]; then exec timeout --signal=TERM --kill-after=5s 150s unshare --mount --fork --kill-child=TERM "$0" --inside fi name="mysql-pool-idle-test-$$" root="/tmp/$name" site="$root/site" work="$root/work" settings="$root/settings.cfg" log="$root/service.log" socket="$root/run/cli.sock" test_user="uce_pool_idle_$$" test_database="uce_pool_idle_$$" test_password=$(printf '%s' "$name-$(date +%s%N)" | sha256sum | cut -c1-32) server_pid="" cleanup() { status=$? if [[ -n "$server_pid" ]] && kill -0 "$server_pid" 2>/dev/null; then kill -TERM "$server_pid" 2>/dev/null || true deadline=$((SECONDS + 10)) while kill -0 "$server_pid" 2>/dev/null && (( SECONDS < deadline )); do sleep 0.05; done if kill -0 "$server_pid" 2>/dev/null; then kill -KILL "$server_pid" 2>/dev/null || true; fi wait "$server_pid" 2>/dev/null || true fi mariadb -e "DROP DATABASE IF EXISTS \`$test_database\`; DROP USER IF EXISTS '$test_user'@'127.0.0.1'" >/dev/null 2>&1 || true if (( status != 0 )) && [[ -r "$log" ]]; then cat "$log" >&2; fi rm -rf "$root" return "$status" } trap cleanup EXIT mkdir -p "$site" "$work" "$root/run" "$root/session" "$root/upload" cp /etc/uce/settings.cfg "$settings" cat >>"$settings" <"$site/database.uce" <"$site/plain.uce" timeout --signal=TERM --kill-after=5s 120s bin/uce_fastcgi.linux.bin >"$log" 2>&1 & server_pid=$! deadline=$((SECONDS + 20)) while [[ ! -S "$socket" ]] && (( SECONDS < deadline )); do sleep 0.05; done [[ -S "$socket" ]] || { echo "private UCE CLI socket was not ready" >&2; exit 1; } request() { timeout --signal=TERM --kill-after=1s 30s scripts/uce-cli --socket "$socket" "$1" } first=$(request /database.uce) second=$(request /database.uce) IFS='|' read -r first_pid first_id first_source <<<"$first" IFS='|' read -r second_pid second_id second_source <<<"$second" [[ "$first_source" == "new" && "$second_source" == "worker" ]] [[ "$first_pid" == "$second_pid" && "$first_id" == "$second_id" ]] sleep 3 plain=$(request /plain.uce) [[ "$plain" == "$first_pid|plain" ]] deadline=$((SECONDS + 5)) while (( SECONDS < deadline )); do connections=$(mariadb --batch --skip-column-names -e "SELECT COUNT(*) FROM information_schema.PROCESSLIST WHERE USER='$test_user'") [[ "$connections" == "0" ]] && break sleep 0.05 done [[ "$connections" == "0" ]] || { echo "expired pooled connection remained after a request boundary" >&2; exit 1; } third=$(request /database.uce) IFS='|' read -r third_pid third_id third_source <<<"$third" [[ "$third_pid" == "$first_pid" && "$third_source" == "new" && "$third_id" != "$first_id" ]] echo "Persistent MySQL idle eviction preserved hot reuse and retired the expired connection"