#!/bin/bash # System Worker Example Script # This script demonstrates the System worker by: # 1. Starting the worker with the config.toml # 2. Sending multiple concurrent ping jobs to Redis # 3. Verifying pong responses set -e SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" CONFIG_FILE="$SCRIPT_DIR/config.toml" WORKER_ID="system_example_worker" REDIS_URL="redis://localhost:6379" echo "=== System Worker Example ===" echo "Script directory: $SCRIPT_DIR" echo "Config file: $CONFIG_FILE" echo "Worker ID: $WORKER_ID" echo "Redis URL: $REDIS_URL" echo # Check if Redis is running echo "Checking Redis connection..." if ! redis-cli -u "$REDIS_URL" ping > /dev/null 2>&1; then echo "❌ Error: Redis is not running or not accessible at $REDIS_URL" echo "Please start Redis server first: redis-server" exit 1 fi echo "✅ Redis is running" echo # Clean up any existing jobs in the queue echo "Cleaning up existing jobs in Redis..." redis-cli -u "$REDIS_URL" del "hero:jobs:$WORKER_ID" > /dev/null 2>&1 || true redis-cli -u "$REDIS_URL" eval "return redis.call('del', unpack(redis.call('keys', 'hero:job:*')))" 0 > /dev/null 2>&1 || true echo "✅ Redis queues cleaned" echo # Start the System worker in the background echo "Starting System worker..." cd "$SCRIPT_DIR/../.." cargo run --bin system -- --config "$CONFIG_FILE" --show-stats & WORKER_PID=$! echo "✅ System worker started (PID: $WORKER_PID)" echo # Wait a moment for the worker to initialize echo "Waiting for worker to initialize..." sleep 3 # Function to send a ping job (non-blocking) send_ping_job() { local job_num=$1 local job_id="ping_job_${job_num}_$(date +%s%N)" echo "📤 Sending ping job: $job_id" # Create job in Redis redis-cli -u "$REDIS_URL" hset "hero:job:$job_id" \ id "$job_id" \ script "ping" \ status "Queued" \ created_at "$(date -u +%Y-%m-%dT%H:%M:%SZ)" \ worker_id "$WORKER_ID" > /dev/null # Add job to worker queue redis-cli -u "$REDIS_URL" lpush "hero:jobs:$WORKER_ID" "$job_id" > /dev/null echo "$job_id" } # Function to check job result check_job_result() { local job_id=$1 local timeout=15 local elapsed=0 while [ $elapsed -lt $timeout ]; do local status=$(redis-cli -u "$REDIS_URL" hget "hero:job:$job_id" status 2>/dev/null || echo "") if [ "$status" = "Finished" ]; then local result=$(redis-cli -u "$REDIS_URL" hget "hero:job:$job_id" result 2>/dev/null || echo "") if [ "$result" = "pong" ]; then echo "✅ Job $job_id completed successfully with result: $result" return 0 else echo "❌ Job $job_id completed but with unexpected result: $result" return 1 fi elif [ "$status" = "Error" ]; then local error=$(redis-cli -u "$REDIS_URL" hget "hero:job:$job_id" error 2>/dev/null || echo "") echo "❌ Job $job_id failed with error: $error" return 1 fi sleep 0.5 elapsed=$((elapsed + 1)) done echo "❌ Job $job_id timed out after ${timeout}s" return 1 } # Send multiple concurrent ping jobs to test async processing echo "Testing concurrent ping/pong functionality..." total_jobs=5 job_ids=() echo echo "--- Sending $total_jobs concurrent ping jobs ---" for i in $(seq 1 $total_jobs); do job_id=$(send_ping_job $i) job_ids+=("$job_id") sleep 0.1 # Small delay between job submissions done echo echo "--- Waiting for all jobs to complete ---" success_count=0 for job_id in "${job_ids[@]}"; do echo "Checking job: $job_id" if check_job_result "$job_id"; then success_count=$((success_count + 1)) fi done echo echo "=== Test Results ===" echo "Successful concurrent ping/pong tests: $success_count/$total_jobs" if [ $success_count -eq $total_jobs ]; then echo "🎉 All tests passed! System worker is handling concurrent jobs correctly." exit_code=0 else echo "⚠️ Some tests failed. Check the worker logs for details." exit_code=1 fi # Test rapid job submission to showcase async capabilities echo echo "--- Testing rapid job submission (10 jobs in quick succession) ---" rapid_jobs=10 rapid_job_ids=() for i in $(seq 1 $rapid_jobs); do job_id=$(send_ping_job "rapid_$i") rapid_job_ids+=("$job_id") done echo "Waiting for rapid jobs to complete..." rapid_success=0 for job_id in "${rapid_job_ids[@]}"; do if check_job_result "$job_id"; then rapid_success=$((rapid_success + 1)) fi done echo "Rapid submission test: $rapid_success/$rapid_jobs successful" # Clean up echo echo "Cleaning up..." echo "Stopping System worker (PID: $WORKER_PID)..." kill $WORKER_PID 2>/dev/null || true wait $WORKER_PID 2>/dev/null || true echo "✅ Worker stopped" echo "Cleaning up Redis jobs..." redis-cli -u "$REDIS_URL" del "hero:jobs:$WORKER_ID" > /dev/null 2>&1 || true redis-cli -u "$REDIS_URL" eval "return redis.call('del', unpack(redis.call('keys', 'hero:job:*')))" 0 > /dev/null 2>&1 || true echo "✅ Redis cleaned up" echo echo "=== System Worker Example Complete ===" total_success=$((success_count + rapid_success)) total_tests=$((total_jobs + rapid_jobs)) echo "Overall success rate: $total_success/$total_tests" if [ $total_success -eq $total_tests ]; then exit 0 else exit 1 fi