Files
proxmox/scripts/clear-transaction-pool-all-nodes.sh

203 lines
5.8 KiB
Bash
Raw Permalink Normal View History

#!/usr/bin/env bash
# Clear Transaction Pool Database on All Besu Nodes
# Stops services, clears transaction pool databases, restarts
set -euo pipefail
# Load IP configuration
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
source "${PROJECT_ROOT}/config/ip-addresses.conf" 2>/dev/null || true
PROXMOX_HOST="${PROXMOX_HOST:-192.168.11.10}"
# Colors
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
CYAN='\033[0;36m'
NC='\033[0m'
log_info() { echo -e "${BLUE}[INFO]${NC} $1"; }
log_success() { echo -e "${GREEN}[✓]${NC} $1"; }
log_warn() { echo -e "${YELLOW}[⚠]${NC} $1"; }
log_error() { echo -e "${RED}[✗]${NC} $1"; }
log_section() { echo -e "\n${CYAN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"; echo -e "${CYAN}$1${NC}"; echo -e "${CYAN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}\n"; }
# RPC Nodes
RPC_NODES=(
"2101:besu-rpc.service"
"2201:besu-rpc.service"
)
# Validators
VALIDATORS=(
"1000:besu-validator.service"
"1001:besu-validator.service"
"1002:besu-validator.service"
"1003:besu-validator.service"
"1004:besu-validator.service"
)
log_section "Clear Transaction Pool Database on All Nodes"
log_warn "⚠️ WARNING: This will stop Besu nodes and clear transaction pools"
log_warn "⚠️ All pending transactions will be lost"
log_info "Proxmox Host: $PROXMOX_HOST"
echo ""
# Function to clear transaction pool for a node
clear_node_pool() {
local vmid=$1
local service=$2
local name=$3
log_info "Processing $name (VMID $vmid)..."
# Check if VM is running
VM_STATUS=$(ssh root@$PROXMOX_HOST "pct status $vmid 2>&1" || echo "")
if ! echo "$VM_STATUS" | grep -q "running"; then
log_warn "$name: Container not running, skipping"
return 1
fi
# Stop service
log_info "$name: Stopping $service..."
if ssh root@$PROXMOX_HOST "pct exec $vmid -- systemctl stop $service 2>&1"; then
log_success "$name: Service stopped"
sleep 2
else
log_warn "$name: Failed to stop service (may not be running)"
fi
# Clear transaction pool database files
log_info "$name: Clearing transaction pool database..."
CLEARED=0
# Clear transaction pool directories
if ssh root@$PROXMOX_HOST "pct exec $vmid -- find /data/besu -type d -name '*pool*' -exec rm -rf {} \; 2>/dev/null || true"; then
((CLEARED++))
fi
# Clear transaction pool files
if ssh root@$PROXMOX_HOST "pct exec $vmid -- find /data/besu -type f -name '*transaction*' -delete 2>/dev/null || true"; then
((CLEARED++))
fi
if ssh root@$PROXMOX_HOST "pct exec $vmid -- find /data/besu -type f -name '*pool*' -delete 2>/dev/null || true"; then
((CLEARED++))
fi
# Clear caches
if ssh root@$PROXMOX_HOST "pct exec $vmid -- rm -rf /data/besu/caches/* 2>/dev/null || true"; then
((CLEARED++))
fi
if [ $CLEARED -gt 0 ]; then
log_success "$name: Transaction pool database cleared"
else
log_warn "$name: No transaction pool files found (may already be clear)"
fi
# Start service
log_info "$name: Starting $service..."
if ssh root@$PROXMOX_HOST "pct exec $vmid -- systemctl start $service 2>&1"; then
log_success "$name: Service started"
sleep 2
else
log_error "$name: Failed to start service"
return 1
fi
return 0
}
# Clear RPC nodes
log_section "Clearing RPC Nodes"
RPC_SUCCESS=0
RPC_TOTAL=0
for node in "${RPC_NODES[@]}"; do
IFS=':' read -r vmid service <<< "$node"
((RPC_TOTAL++))
if clear_node_pool "$vmid" "$service" "RPC-$vmid"; then
((RPC_SUCCESS++))
fi
echo ""
done
log_info "RPC nodes cleared: $RPC_SUCCESS/$RPC_TOTAL"
# Clear validators
log_section "Clearing Validators"
VALIDATOR_SUCCESS=0
VALIDATOR_TOTAL=0
for validator in "${VALIDATORS[@]}"; do
IFS=':' read -r vmid service <<< "$validator"
((VALIDATOR_TOTAL++))
if clear_node_pool "$vmid" "$service" "Validator-$vmid"; then
((VALIDATOR_SUCCESS++))
fi
echo ""
done
log_info "Validators cleared: $VALIDATOR_SUCCESS/$VALIDATOR_TOTAL"
# Wait for services to stabilize
log_section "Waiting for Services to Stabilize"
log_info "Waiting 15 seconds for all services to start..."
sleep 15
# Verify RPC nodes are back online
log_section "Verifying RPC Nodes"
RPC_IPS=(
"2101:${RPC_CORE_1}"
"2201:${RPC_PUBLIC_1}"
)
RPC_ONLINE=0
for rpc in "${RPC_IPS[@]}"; do
IFS=':' read -r vmid ip <<< "$rpc"
log_info "Checking RPC-$vmid ($ip)..."
if cast block-number --rpc-url "http://${ip}:8545" >/dev/null 2>&1; then
log_success "RPC-$vmid: Online"
((RPC_ONLINE++))
else
log_warn "RPC-$vmid: Not responding (may need more time)"
fi
done
# Final summary
log_section "Summary"
TOTAL_SUCCESS=$((RPC_SUCCESS + VALIDATOR_SUCCESS))
TOTAL_NODES=$((RPC_TOTAL + VALIDATOR_TOTAL))
echo "Transaction Pool Clear Results:"
echo " • RPC nodes: $RPC_SUCCESS/$RPC_TOTAL cleared"
echo " • Validators: $VALIDATOR_SUCCESS/$VALIDATOR_TOTAL cleared"
echo " • Total: $TOTAL_SUCCESS/$TOTAL_NODES cleared"
echo ""
echo "RPC Status:"
echo " • Online: $RPC_ONLINE/${#RPC_IPS[@]} RPC nodes"
if [ $TOTAL_SUCCESS -eq $TOTAL_NODES ] && [ $RPC_ONLINE -eq ${#RPC_IPS[@]} ]; then
log_success "\n✅ All nodes cleared and back online!"
log_info "Next: Verify pending transactions are cleared"
else
log_warn "\n⚠ Some nodes may need attention"
log_info "Check individual node status if needed"
fi
log_success "\nTransaction pool database clear complete!"