Some checks are pending
Bidi Control Character Guard / bidi-control-guard (push) Waiting to run
Circular Dependency Check / Check for new circular dependencies (push) Waiting to run
Citus Migration Smoke / Combined migrations on single-node Citus (push) Waiting to run
E2E Fresh Install Tests / fresh-install-e2e (push) Waiting to run
ext-v2 guardrails / Run ext-v2 guard and ESLint (push) Waiting to run
Integration Tests / Check for relevant changes (push) Waiting to run
Integration Tests / ${{ (github.event_name == 'schedule' || github.event.inputs.suite == 'full') && 'Full integration suite' || 'Tier-1 integration subset' }} (push) Blocked by required conditions
Mobile checks / Mobile lint + typecheck (push) Waiting to run
Mobile checks / Mobile unit tests (push) Waiting to run
Mobile checks / Mobile dependency audit (report) (push) Waiting to run
Mobile checks / Mobile reproducibility checks (push) Waiting to run
Secrets guard (env backups) / Ensure no tracked env backup files (push) Waiting to run
Temporal Readiness / fast-readiness (push) Waiting to run
Temporal Readiness / docker-parity (push) Waiting to run
TypeScript Type Check / Nx affected typecheck (push) Waiting to run
Unit Tests / Skipped-test budget (push) Waiting to run
Unit Tests / Nx affected unit tests (push) Waiting to run
Unit Tests / Server unit coverage (informational) (push) Waiting to run
Validate Tenant Management Schema / Check for relevant changes (push) Waiting to run
Validate Tenant Management Schema / Validate Tenant Management Schema (push) Blocked by required conditions
EE Workflows Build Guard / ee-workflows-build-guard (push) Waiting to run
Excluded: .git, node_modules, secrets/, compose.env, assemblyscript tgz Source: /opt/alga-psa on psa.joliet.tech
187 lines
6.1 KiB
Bash
Executable File
187 lines
6.1 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
# Script to analyze Citus migration errors from Argo Workflow logs
|
|
|
|
set -e
|
|
|
|
echo "=== Citus Migration Error Analysis Tool ==="
|
|
echo ""
|
|
|
|
# Function to get the latest workflow run
|
|
get_latest_workflow() {
|
|
kubectl get workflows -n argo | grep citus-migration-test | head -1 | awk '{print $1}'
|
|
}
|
|
|
|
# Function to extract migration logs
|
|
get_migration_logs() {
|
|
local workflow_name=$1
|
|
|
|
echo "Fetching logs from workflow: $workflow_name"
|
|
echo "-------------------------------------------"
|
|
|
|
# Find the migration execution pod
|
|
local migration_pod=$(kubectl get pods -n argo | grep "$workflow_name" | grep -E "(run-all-migrations|execute-combined-migrations)" | awk '{print $1}' | head -1)
|
|
|
|
if [ -z "$migration_pod" ]; then
|
|
echo "ERROR: Could not find migration pod for workflow $workflow_name"
|
|
return 1
|
|
fi
|
|
|
|
echo "Found migration pod: $migration_pod"
|
|
echo ""
|
|
|
|
# Get the logs
|
|
kubectl logs "$migration_pod" -n argo -c main 2>/dev/null || {
|
|
echo "ERROR: Could not fetch logs from pod $migration_pod"
|
|
return 1
|
|
}
|
|
}
|
|
|
|
# Function to parse errors from logs
|
|
parse_migration_errors() {
|
|
local log_file=$1
|
|
|
|
echo "=== Parsing Migration Errors ==="
|
|
echo ""
|
|
|
|
# Extract reference table errors
|
|
echo "Reference Table Errors:"
|
|
grep -E "Failed to create reference table" "$log_file" | while read -r line; do
|
|
table=$(echo "$line" | sed -n 's/.*Failed to create reference table \([^:]*\):.*/\1/p')
|
|
error=$(echo "$line" | sed -n 's/.*: \(.*\)/\1/p')
|
|
echo " - Table: $table"
|
|
echo " Error: $error"
|
|
echo ""
|
|
done
|
|
|
|
# Extract distributed table errors
|
|
echo "Distributed Table Errors:"
|
|
grep -E "Failed to distribute table" "$log_file" | while read -r line; do
|
|
table=$(echo "$line" | sed -n 's/.*Failed to distribute table \([^:]*\):.*/\1/p')
|
|
error=$(echo "$line" | sed -n 's/.*: \(.*\)/\1/p')
|
|
echo " - Table: $table"
|
|
echo " Error: $error"
|
|
echo ""
|
|
done
|
|
|
|
# Extract foreign key dependency errors
|
|
echo "Foreign Key Dependency Issues:"
|
|
grep -E "referenced table.*must be a distributed table or a reference table" "$log_file" | while read -r line; do
|
|
echo " - $line"
|
|
done
|
|
|
|
# Extract transaction errors
|
|
echo ""
|
|
echo "Transaction Errors:"
|
|
grep -E "current transaction is aborted" "$log_file" | head -3 | while read -r line; do
|
|
echo " - Transaction aborted (subsequent commands will fail)"
|
|
break
|
|
done
|
|
}
|
|
|
|
# Function to analyze foreign key dependencies
|
|
analyze_dependencies() {
|
|
echo ""
|
|
echo "=== Analyzing Table Dependencies ==="
|
|
echo ""
|
|
|
|
# Create a temporary SQL script to analyze dependencies
|
|
cat > /tmp/analyze_deps.sql << 'EOF'
|
|
SELECT
|
|
tc.table_name,
|
|
kcu.column_name,
|
|
ccu.table_name AS foreign_table_name,
|
|
ccu.column_name AS foreign_column_name
|
|
FROM
|
|
information_schema.table_constraints AS tc
|
|
JOIN information_schema.key_column_usage AS kcu
|
|
ON tc.constraint_name = kcu.constraint_name
|
|
AND tc.table_schema = kcu.table_schema
|
|
JOIN information_schema.constraint_column_usage AS ccu
|
|
ON ccu.constraint_name = tc.constraint_name
|
|
AND ccu.table_schema = tc.table_schema
|
|
WHERE tc.constraint_type = 'FOREIGN KEY'
|
|
AND tc.table_schema = 'public'
|
|
ORDER BY tc.table_name;
|
|
EOF
|
|
|
|
echo "To analyze dependencies in the database, run:"
|
|
echo "kubectl exec -n argo citus-coordinator-0 -- psql -U postgres -d server_test -f /tmp/analyze_deps.sql"
|
|
}
|
|
|
|
# Function to generate fix recommendations
|
|
generate_recommendations() {
|
|
local log_file=$1
|
|
|
|
echo ""
|
|
echo "=== Recommendations ==="
|
|
echo ""
|
|
|
|
# Check for foreign key issues
|
|
if grep -q "referenced table.*must be a distributed table or a reference table" "$log_file"; then
|
|
echo "1. Foreign Key Dependency Issues Detected:"
|
|
echo " - Tables with foreign keys must be distributed AFTER their referenced tables"
|
|
echo " - Consider reordering migrations or combining them"
|
|
echo ""
|
|
|
|
# Extract specific dependency issues
|
|
grep -E "referenced table \"([^\"]+)\"" "$log_file" | sed -n 's/.*referenced table "\([^"]*\)".*/\1/p' | sort -u | while read -r ref_table; do
|
|
echo " - Table '$ref_table' needs to be distributed first"
|
|
done
|
|
fi
|
|
|
|
# Check for transaction issues
|
|
if grep -q "current transaction is aborted" "$log_file"; then
|
|
echo ""
|
|
echo "2. Transaction Management Issues:"
|
|
echo " - Migrations are failing within a transaction, causing cascade failures"
|
|
echo " - Consider:"
|
|
echo " a) Running each table distribution in a separate transaction"
|
|
echo " b) Adding proper error recovery"
|
|
echo " c) Checking dependencies before attempting distribution"
|
|
fi
|
|
|
|
# Check for missing tables
|
|
if grep -q "does not exist" "$log_file"; then
|
|
echo ""
|
|
echo "3. Missing Tables:"
|
|
echo " - Some tables don't exist in the database"
|
|
echo " - Ensure base schema migrations run before Citus migrations"
|
|
fi
|
|
}
|
|
|
|
# Main execution
|
|
main() {
|
|
# Get workflow name from argument or find latest
|
|
WORKFLOW_NAME=${1:-$(get_latest_workflow)}
|
|
|
|
if [ -z "$WORKFLOW_NAME" ]; then
|
|
echo "ERROR: No Citus migration workflow found"
|
|
echo "Usage: $0 [workflow-name]"
|
|
exit 1
|
|
fi
|
|
|
|
# Create temporary log file
|
|
LOG_FILE="/tmp/citus_migration_logs_$(date +%s).log"
|
|
|
|
# Get the logs
|
|
get_migration_logs "$WORKFLOW_NAME" > "$LOG_FILE" 2>&1
|
|
|
|
# Parse errors
|
|
parse_migration_errors "$LOG_FILE"
|
|
|
|
# Analyze dependencies
|
|
analyze_dependencies
|
|
|
|
# Generate recommendations
|
|
generate_recommendations "$LOG_FILE"
|
|
|
|
echo ""
|
|
echo "Full logs saved to: $LOG_FILE"
|
|
echo ""
|
|
echo "To view full migration logs:"
|
|
echo "kubectl logs \$(kubectl get pods -n argo | grep $WORKFLOW_NAME | grep -E '(run-all-migrations|execute-combined-migrations)' | awk '{print \$1}') -n argo -c main"
|
|
}
|
|
|
|
# Run main function
|
|
main "$@" |