You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							291 lines
						
					
					
						
							9.4 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							291 lines
						
					
					
						
							9.4 KiB
						
					
					
				| #!/bin/bash | |
|  | |
| # Wait for SeaweedFS and Kafka Gateway services to be ready | |
| # This script checks service health and waits until all services are operational | |
| 
 | |
| set -euo pipefail | |
| 
 | |
| # Colors | |
| RED='\033[0;31m' | |
| GREEN='\033[0;32m' | |
| YELLOW='\033[0;33m' | |
| BLUE='\033[0;34m' | |
| NC='\033[0m' | |
| 
 | |
| log_info() { | |
|     echo -e "${BLUE}[INFO]${NC} $1" | |
| } | |
| 
 | |
| log_success() { | |
|     echo -e "${GREEN}[SUCCESS]${NC} $1" | |
| } | |
| 
 | |
| log_warning() { | |
|     echo -e "${YELLOW}[WARNING]${NC} $1" | |
| } | |
| 
 | |
| log_error() { | |
|     echo -e "${RED}[ERROR]${NC} $1" | |
| } | |
| 
 | |
| # Configuration | |
| TIMEOUT=${TIMEOUT:-300}  # 5 minutes default timeout | |
| CHECK_INTERVAL=${CHECK_INTERVAL:-5}  # Check every 5 seconds | |
| SEAWEEDFS_MASTER_URL=${SEAWEEDFS_MASTER_URL:-"http://localhost:9333"} | |
| KAFKA_GATEWAY_URL=${KAFKA_GATEWAY_URL:-"localhost:9093"} | |
| SCHEMA_REGISTRY_URL=${SCHEMA_REGISTRY_URL:-"http://localhost:8081"} | |
| SEAWEEDFS_FILER_URL=${SEAWEEDFS_FILER_URL:-"http://localhost:8888"} | |
| 
 | |
| # Check if a service is reachable | |
| check_http_service() { | |
|     local url=$1 | |
|     local name=$2 | |
|      | |
|     if curl -sf "$url" >/dev/null 2>&1; then | |
|         return 0 | |
|     else | |
|         return 1 | |
|     fi | |
| } | |
| 
 | |
| # Check TCP port | |
| check_tcp_service() { | |
|     local host=$1 | |
|     local port=$2 | |
|     local name=$3 | |
|      | |
|     if timeout 3 bash -c "</dev/tcp/$host/$port" 2>/dev/null; then | |
|         return 0 | |
|     else | |
|         return 1 | |
|     fi | |
| } | |
| 
 | |
| # Check SeaweedFS Master | |
| check_seaweedfs_master() { | |
|     if check_http_service "$SEAWEEDFS_MASTER_URL/cluster/status" "SeaweedFS Master"; then | |
|         # Additional check: ensure cluster has volumes | |
|         local status_json | |
|         status_json=$(curl -s "$SEAWEEDFS_MASTER_URL/cluster/status" 2>/dev/null || echo "{}") | |
|          | |
|         # Check if we have at least one volume server | |
|         if echo "$status_json" | grep -q '"Max":0'; then | |
|             log_warning "SeaweedFS Master is running but no volumes are available" | |
|             return 1 | |
|         fi | |
|          | |
|         return 0 | |
|     fi | |
|     return 1 | |
| } | |
| 
 | |
| # Check SeaweedFS Filer | |
| check_seaweedfs_filer() { | |
|     check_http_service "$SEAWEEDFS_FILER_URL/" "SeaweedFS Filer" | |
| } | |
| 
 | |
| # Check Kafka Gateway | |
| check_kafka_gateway() { | |
|     local host="localhost" | |
|     local port="9093" | |
|     check_tcp_service "$host" "$port" "Kafka Gateway" | |
| } | |
| 
 | |
| # Check Schema Registry | |
| check_schema_registry() { | |
|     # Check if Schema Registry container is running first | |
|     if ! docker compose ps schema-registry | grep -q "Up"; then | |
|         # Schema Registry is not running, which is okay for basic tests | |
|         return 0 | |
|     fi | |
|      | |
|     # FIXED: Wait for Docker healthcheck to report "healthy", not just "Up" | |
|     # Schema Registry has a 30s start_period, so we need to wait for the actual healthcheck | |
|     local health_status | |
|     health_status=$(docker inspect loadtest-schema-registry --format='{{.State.Health.Status}}' 2>/dev/null || echo "none") | |
|      | |
|     # If container has no healthcheck or healthcheck is not yet healthy, check HTTP directly | |
|     if [[ "$health_status" == "healthy" ]]; then | |
|         # Container reports healthy, do a final verification | |
|         if check_http_service "$SCHEMA_REGISTRY_URL/subjects" "Schema Registry"; then | |
|             return 0 | |
|         fi | |
|     elif [[ "$health_status" == "starting" ]]; then | |
|         # Still in startup period, wait longer | |
|         return 1 | |
|     elif [[ "$health_status" == "none" ]]; then | |
|         # No healthcheck defined (shouldn't happen), fall back to HTTP check | |
|         if check_http_service "$SCHEMA_REGISTRY_URL/subjects" "Schema Registry"; then | |
|             local subjects | |
|             subjects=$(curl -s "$SCHEMA_REGISTRY_URL/subjects" 2>/dev/null || echo "[]") | |
|              | |
|             # Schema registry should at least return an empty array | |
|             if [[ "$subjects" == "[]" ]]; then | |
|                 return 0 | |
|             elif echo "$subjects" | grep -q '\['; then | |
|                 return 0 | |
|             else | |
|                 log_warning "Schema Registry is not properly connected" | |
|                 return 1 | |
|             fi | |
|         fi | |
|     fi | |
|     return 1 | |
| } | |
| 
 | |
| # Check MQ Broker | |
| check_mq_broker() { | |
|     check_tcp_service "localhost" "17777" "SeaweedFS MQ Broker" | |
| } | |
| 
 | |
| # Main health check function | |
| check_all_services() { | |
|     local all_healthy=true | |
|      | |
|     log_info "Checking service health..." | |
|      | |
|     # Check SeaweedFS Master | |
|     if check_seaweedfs_master; then | |
|         log_success "✓ SeaweedFS Master is healthy" | |
|     else | |
|         log_error "✗ SeaweedFS Master is not ready" | |
|         all_healthy=false | |
|     fi | |
|      | |
|     # Check SeaweedFS Filer | |
|     if check_seaweedfs_filer; then | |
|         log_success "✓ SeaweedFS Filer is healthy" | |
|     else | |
|         log_error "✗ SeaweedFS Filer is not ready" | |
|         all_healthy=false | |
|     fi | |
|      | |
|     # Check MQ Broker | |
|     if check_mq_broker; then | |
|         log_success "✓ SeaweedFS MQ Broker is healthy" | |
|     else | |
|         log_error "✗ SeaweedFS MQ Broker is not ready" | |
|         all_healthy=false | |
|     fi | |
|      | |
|     # Check Kafka Gateway | |
|     if check_kafka_gateway; then | |
|         log_success "✓ Kafka Gateway is healthy" | |
|     else | |
|         log_error "✗ Kafka Gateway is not ready" | |
|         all_healthy=false | |
|     fi | |
|      | |
|     # Check Schema Registry | |
|     if ! docker compose ps schema-registry | grep -q "Up"; then | |
|         log_warning "⚠ Schema Registry is stopped (skipping)" | |
|     elif check_schema_registry; then | |
|         log_success "✓ Schema Registry is healthy" | |
|     else | |
|         # Check if it's still starting up (healthcheck start_period) | |
|         local health_status | |
|         health_status=$(docker inspect loadtest-schema-registry --format='{{.State.Health.Status}}' 2>/dev/null || echo "unknown") | |
|         if [[ "$health_status" == "starting" ]]; then | |
|             log_warning "⏳ Schema Registry is starting (waiting for healthcheck...)" | |
|         else | |
|             log_error "✗ Schema Registry is not ready (status: $health_status)" | |
|         fi | |
|         all_healthy=false | |
|     fi | |
|      | |
|     $all_healthy | |
| } | |
| 
 | |
| # Wait for all services to be ready | |
| wait_for_services() { | |
|     log_info "Waiting for all services to be ready (timeout: ${TIMEOUT}s)..." | |
|      | |
|     local elapsed=0 | |
|      | |
|     while [[ $elapsed -lt $TIMEOUT ]]; do | |
|         if check_all_services; then | |
|             log_success "All services are ready! (took ${elapsed}s)" | |
|             return 0 | |
|         fi | |
|          | |
|         log_info "Some services are not ready yet. Waiting ${CHECK_INTERVAL}s... (${elapsed}/${TIMEOUT}s)" | |
|         sleep $CHECK_INTERVAL | |
|         elapsed=$((elapsed + CHECK_INTERVAL)) | |
|     done | |
|      | |
|     log_error "Services did not become ready within ${TIMEOUT} seconds" | |
|     log_error "Final service status:" | |
|     check_all_services | |
|      | |
|     # Always dump Schema Registry diagnostics on timeout since it's the problematic service | |
|     log_error "===========================================" | |
|     log_error "Schema Registry Container Status:" | |
|     log_error "===========================================" | |
|     docker compose ps schema-registry 2>&1 || echo "Failed to get container status" | |
|     docker inspect loadtest-schema-registry --format='Health: {{.State.Health.Status}} ({{len .State.Health.Log}} checks)' 2>&1 || echo "Failed to inspect container" | |
|     log_error "===========================================" | |
|      | |
|     log_error "Network Connectivity Check:" | |
|     log_error "===========================================" | |
|     log_error "Can Schema Registry reach Kafka Gateway?" | |
|     docker compose exec -T schema-registry ping -c 3 kafka-gateway 2>&1 || echo "Ping failed" | |
|     docker compose exec -T schema-registry nc -zv kafka-gateway 9093 2>&1 || echo "Port 9093 unreachable" | |
|     log_error "===========================================" | |
|      | |
|     log_error "Schema Registry Logs (last 100 lines):" | |
|     log_error "===========================================" | |
|     docker compose logs --tail=100 schema-registry 2>&1 || echo "Failed to get Schema Registry logs" | |
|     log_error "===========================================" | |
|      | |
|     log_error "Kafka Gateway Logs (last 50 lines with 'SR' prefix):" | |
|     log_error "===========================================" | |
|     docker compose logs --tail=200 kafka-gateway 2>&1 | grep -i "SR" | tail -50 || echo "No SR-related logs found in Kafka Gateway" | |
|     log_error "===========================================" | |
|      | |
|     log_error "MQ Broker Logs (last 30 lines):" | |
|     log_error "===========================================" | |
|     docker compose logs --tail=30 seaweedfs-mq-broker 2>&1 || echo "Failed to get MQ Broker logs" | |
|     log_error "===========================================" | |
|      | |
|     return 1 | |
| } | |
| 
 | |
| # Show current service status | |
| show_status() { | |
|     log_info "Current service status:" | |
|     check_all_services | |
| } | |
| 
 | |
| # Main function | |
| main() { | |
|     case "${1:-wait}" in | |
|         "wait") | |
|             wait_for_services | |
|             ;; | |
|         "check") | |
|             show_status | |
|             ;; | |
|         "status") | |
|             show_status | |
|             ;; | |
|         *) | |
|             echo "Usage: $0 [wait|check|status]" | |
|             echo "" | |
|             echo "Commands:" | |
|             echo "  wait   - Wait for all services to be ready (default)" | |
|             echo "  check  - Check current service status" | |
|             echo "  status - Same as check" | |
|             echo "" | |
|             echo "Environment variables:" | |
|             echo "  TIMEOUT - Maximum time to wait in seconds (default: 300)" | |
|             echo "  CHECK_INTERVAL - Check interval in seconds (default: 5)" | |
|             echo "  SEAWEEDFS_MASTER_URL - Master URL (default: http://localhost:9333)" | |
|             echo "  KAFKA_GATEWAY_URL - Gateway URL (default: localhost:9093)" | |
|             echo "  SCHEMA_REGISTRY_URL - Schema Registry URL (default: http://localhost:8081)" | |
|             echo "  SEAWEEDFS_FILER_URL - Filer URL (default: http://localhost:8888)" | |
|             exit 1 | |
|             ;; | |
|     esac | |
| } | |
| 
 | |
| main "$@"
 |