fix: proper recovery checks e2e

This commit is contained in:
Julian Sommer
2026-02-25 11:16:07 +10:00
parent 61e8eb9d91
commit 52f2498699
2 changed files with 38 additions and 54 deletions
+26
View File
@@ -298,6 +298,32 @@ wait_for_instance_state() {
return 1
}
# Terminate instances and wait for them to reach terminated state
# Usage: terminate_and_wait <instance_id> [instance_id...]
terminate_and_wait() {
local ids=("$@")
for instance_id in "${ids[@]}"; do
local state
state=$($AWS_EC2 describe-instances --instance-ids "$instance_id" \
--query 'Reservations[0].Instances[0].State.Name' --output text 2>/dev/null || echo "unknown")
if [ "$state" != "terminated" ] && [ "$state" != "unknown" ]; then
echo " Terminating $instance_id (state: $state)..."
$AWS_EC2 terminate-instances --instance-ids "$instance_id" > /dev/null 2>&1 || true
fi
done
local failed=0
for instance_id in "${ids[@]}"; do
if ! wait_for_instance_state "$instance_id" "terminated" 30; then
echo " WARNING: Failed to confirm termination of $instance_id"
failed=1
fi
done
return $failed
}
# Wait for gateway to be ready
# Usage: wait_for_gateway [host] [max_attempts]
wait_for_gateway() {
+12 -54
View File
@@ -1150,22 +1150,6 @@ fi
echo " Crash recovery tests passed"
# Terminate Phase 5 instances before VPC tests to free memory
echo ""
echo "Cleaning up Phase 5 instances before VPC tests..."
for instance_id in "${INSTANCE_IDS[@]}"; do
state=$($AWS_EC2 describe-instances --instance-ids "$instance_id" \
--query 'Reservations[0].Instances[0].State.Name' --output text 2>/dev/null || echo "unknown")
if [ "$state" != "terminated" ] && [ "$state" != "unknown" ]; then
$AWS_EC2 terminate-instances --instance-ids "$instance_id" > /dev/null 2>&1 || true
fi
done
# Wait for all to terminate
for instance_id in "${INSTANCE_IDS[@]}"; do
wait_for_instance_state "$instance_id" "terminated" 30 || true
done
echo " Phase 5 instances terminated"
# Phase 5c: VPC Networking
echo ""
echo "Phase 5c: VPC Networking"
@@ -1387,16 +1371,7 @@ echo ""
echo "Step 6: Clean up VPC resources"
echo "----------------------------------------"
for vpc_inst in "${VPC_INSTANCE_IDS[@]}"; do
echo " Terminating $vpc_inst..."
$AWS_EC2 terminate-instances --instance-ids "$vpc_inst" > /dev/null 2>&1 || true
done
for vpc_inst in "${VPC_INSTANCE_IDS[@]}"; do
wait_for_instance_state "$vpc_inst" "terminated" 30 || {
echo " WARNING: Failed to confirm termination of $vpc_inst"
}
done
terminate_and_wait "${VPC_INSTANCE_IDS[@]}" || true
# Clean up subnet and VPC
echo " Deleting subnet $SUBNET_ID..."
@@ -1445,15 +1420,11 @@ CLUSTER_SERVICES_STARTED="false"
# Verify all services are down
echo " Waiting for services to stop..."
sleep 5
verify_all_services_down || {
echo " WARNING: Some services still running after shutdown"
}
# Force cleanup: kill lingering processes and remove stale locks
# The coordinated shutdown may not fully kill all processes (e.g. predastore
# holding badger locks, awsgw still bound to ports). This ensures a clean slate.
force_cleanup_all_nodes
sleep 2
if ! verify_all_services_down; then
echo " Some services still running, force-cleaning..."
force_cleanup_all_nodes
fi
# Test 6c: Restart and recovery
echo ""
@@ -1472,7 +1443,7 @@ CLUSTER_SERVICES_STARTED="true"
echo ""
echo "Waiting for cluster to stabilize..."
sleep 10
sleep 5
# Verify NATS cluster reformed
echo ""
@@ -1510,7 +1481,9 @@ echo "Waiting for instances to relaunch after cluster restart..."
# Must wait for them to finish launching (pending → running) before terminate
# will work, because the NATS per-instance subscription is only created after
# QEMU starts.
for instance_id in "${INSTANCE_IDS[@]}"; do
# Note: INSTANCE_IDS[2] was the crash-loop test instance — it will be in error
# state and won't relaunch, so we only wait for the first two.
for instance_id in "${INSTANCE_IDS[0]}" "${INSTANCE_IDS[1]}"; do
echo " Waiting for $instance_id to finish relaunching..."
COUNT=0
while [ $COUNT -lt 30 ]; do
@@ -1528,25 +1501,10 @@ for instance_id in "${INSTANCE_IDS[@]}"; do
fi
done
# Now terminate all instances
# Terminate all instances (including the crash-loop one in error state)
echo ""
echo "Terminating all instances..."
for instance_id in "${INSTANCE_IDS[@]}"; do
echo " Terminating $instance_id..."
$AWS_EC2 terminate-instances --instance-ids "$instance_id" > /dev/null 2>&1 || echo " (instance may already be terminated)"
done
# Wait for termination
echo " Waiting for termination..."
TERMINATION_FAILED=0
for instance_id in "${INSTANCE_IDS[@]}"; do
if ! wait_for_instance_state "$instance_id" "terminated" 30; then
echo " WARNING: Failed to confirm termination of $instance_id"
TERMINATION_FAILED=1
fi
done
if [ $TERMINATION_FAILED -ne 0 ]; then
if ! terminate_and_wait "${INSTANCE_IDS[@]}"; then
echo ""
echo "ERROR: Some instances failed to terminate properly after restart"
dump_all_node_logs