mirror of
https://github.com/nolen777/eagle0.git
synced 2026-07-28 20:55:44 +00:00
The warmup tool was timing out during CreateGame because the per-step timeout was only 30 seconds. On a cold JVM (freshly started Eagle instance during blue-green deployment), CreateGame can take longer than 30 seconds due to: - JIT compilation not yet warmed up - First-time class loading - Game initialization including Shardok communication Changes: - Increase per-operation timeout from 30s to 90s - Increase overall warmup timeout from 60s to 300s (5 minutes) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
144 lines
4.3 KiB
Bash
Executable File
144 lines
4.3 KiB
Bash
Executable File
#!/bin/bash
|
|
#
|
|
# Warmup Script for Eagle Server
|
|
#
|
|
# This script warms up the JIT compiler before switching traffic to a new instance.
|
|
# It uses the Go warmup tool which:
|
|
# 1. Creates a test game via bidirectional streaming
|
|
# 2. Posts an Improve command
|
|
# 3. Verifies action results and new commands
|
|
# 4. Cleans up the test game
|
|
#
|
|
# Usage: ./warmup-eagle.sh HOST:PORT
|
|
#
|
|
# Example:
|
|
# ./warmup-eagle.sh localhost:40032
|
|
# ./warmup-eagle.sh localhost:40034
|
|
#
|
|
|
|
set -euo pipefail
|
|
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
PROJECT_ROOT="$(cd "${SCRIPT_DIR}/.." && pwd)"
|
|
|
|
# Colors for output
|
|
RED='\033[0;31m'
|
|
GREEN='\033[0;32m'
|
|
YELLOW='\033[1;33m'
|
|
NC='\033[0m'
|
|
|
|
log_info() { echo -e "${GREEN}[INFO]${NC} $1"; }
|
|
log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
|
|
log_error() { echo -e "${RED}[ERROR]${NC} $1"; }
|
|
|
|
HOST="${1:-localhost:40032}"
|
|
|
|
log_info "Warming up Eagle server at ${HOST}..."
|
|
|
|
# Try to find the Go warmup tool
|
|
WARMUP_TOOL=""
|
|
|
|
# Check if we're in the project directory with bazel
|
|
if [ -f "${PROJECT_ROOT}/WORKSPACE" ] || [ -f "${PROJECT_ROOT}/WORKSPACE.bazel" ]; then
|
|
# Try to find the pre-built binary
|
|
BAZEL_BIN="${PROJECT_ROOT}/bazel-bin/src/main/go/net/eagle0/warmup/warmup_/warmup"
|
|
if [ -x "${BAZEL_BIN}" ]; then
|
|
WARMUP_TOOL="${BAZEL_BIN}"
|
|
fi
|
|
fi
|
|
|
|
# Check for the warmup tool in common locations (for deployed environments)
|
|
if [ -z "${WARMUP_TOOL}" ]; then
|
|
for path in \
|
|
"${SCRIPT_DIR}/bin/warmup" \
|
|
"/opt/eagle0/scripts/bin/warmup" \
|
|
"/opt/eagle0/bin/warmup" \
|
|
"/usr/local/bin/eagle-warmup" \
|
|
"${SCRIPT_DIR}/warmup"; do
|
|
if [ -x "${path}" ]; then
|
|
WARMUP_TOOL="${path}"
|
|
break
|
|
fi
|
|
done
|
|
fi
|
|
|
|
# If we found the Go tool, use it
|
|
if [ -n "${WARMUP_TOOL}" ]; then
|
|
log_info "Using Go warmup tool: ${WARMUP_TOOL}"
|
|
# Use 5 minute timeout to allow for slow operations on cold JVM
|
|
if "${WARMUP_TOOL}" --address="${HOST}" --timeout=300s; then
|
|
log_info "Warmup complete!"
|
|
exit 0
|
|
else
|
|
log_error "Go warmup tool failed"
|
|
exit 1
|
|
fi
|
|
fi
|
|
|
|
# Fallback to grpcurl-based warmup
|
|
log_warn "Go warmup tool not found, falling back to grpcurl"
|
|
|
|
# Check for grpcurl
|
|
if ! command -v grpcurl &> /dev/null; then
|
|
log_error "Neither Go warmup tool nor grpcurl is available"
|
|
log_error "Build the warmup tool with: bazel build //src/main/go/net/eagle0/warmup"
|
|
log_error "Or install grpcurl: brew install grpcurl (macOS)"
|
|
exit 1
|
|
fi
|
|
|
|
# Warmup iterations
|
|
WARMUP_ITERATIONS=3
|
|
|
|
# 1. Call GetRunningGames multiple times - this exercises the gRPC layer and basic game access
|
|
log_info "Warming up GetRunningGames..."
|
|
for i in $(seq 1 ${WARMUP_ITERATIONS}); do
|
|
RESULT=$(grpcurl -plaintext -d '{}' "${HOST}" net.eagle0.eagle.api.Eagle/GetRunningGames 2>&1) || true
|
|
if echo "$RESULT" | grep -q "games\|{}"; then
|
|
echo -n "."
|
|
else
|
|
log_error "GetRunningGames failed on iteration $i"
|
|
exit 1
|
|
fi
|
|
done
|
|
echo " done"
|
|
|
|
# 2. Call GetSettings - exercises settings loading
|
|
log_info "Warming up GetSettings..."
|
|
for i in $(seq 1 ${WARMUP_ITERATIONS}); do
|
|
if grpcurl -plaintext -d '{}' "${HOST}" net.eagle0.eagle.api.Eagle/GetSettings > /dev/null 2>&1; then
|
|
echo -n "."
|
|
else
|
|
log_warn "GetSettings failed on iteration $i (non-fatal)"
|
|
fi
|
|
done
|
|
echo " done"
|
|
|
|
# 3. Call AddSettings with empty list - exercises settings path
|
|
log_info "Warming up AddSettings..."
|
|
for i in $(seq 1 ${WARMUP_ITERATIONS}); do
|
|
if grpcurl -plaintext -d '{"settings": []}' "${HOST}" net.eagle0.eagle.api.Eagle/AddSettings > /dev/null 2>&1; then
|
|
echo -n "."
|
|
else
|
|
log_warn "AddSettings failed on iteration $i (non-fatal)"
|
|
fi
|
|
done
|
|
echo " done"
|
|
|
|
# Final health check
|
|
log_info "Verifying server health..."
|
|
if grpcurl -plaintext -d '{}' "${HOST}" net.eagle0.eagle.api.Eagle/GetRunningGames > /dev/null 2>&1; then
|
|
log_info "Health check passed"
|
|
else
|
|
log_error "Health check failed"
|
|
exit 1
|
|
fi
|
|
|
|
log_info ""
|
|
log_info "Warmup complete (basic mode - bidirectional streaming warmup not available)!"
|
|
log_info "The JIT should be warmed for:"
|
|
log_info " - gRPC layer and protobuf parsing"
|
|
log_info " - Settings loading and management"
|
|
log_info ""
|
|
log_warn "Note: For full warmup including game creation and command processing,"
|
|
log_warn " build and use the Go warmup tool: bazel build //src/main/go/net/eagle0/warmup"
|