run-sanity.sh 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. #!/usr/bin/env bash
  2. set -e
  3. cd "$(dirname "$0")/.."
  4. # shellcheck source=multinode-demo/common.sh
  5. source multinode-demo/common.sh
  6. if [[ -z $CI ]]; then
  7. # Build eagerly if needed for local development. Otherwise, odd timing error occurs...
  8. $solana_keygen --version
  9. $solana_genesis --version
  10. $solana_faucet --version
  11. $solana_cli --version
  12. $agave_validator --version
  13. $solana_ledger_tool --version
  14. fi
  15. rm -rf config/run/init-completed config/ledger
  16. # Sanity-check that agave-validator can successfully terminate itself without relying on
  17. # process::exit() by extending the timeout...
  18. # Also the banking_tracer thread needs some extra time to flush due to
  19. # unsynchronized and buffered IO.
  20. validator_timeout="${SOLANA_VALIDATOR_EXIT_TIMEOUT:-120}"
  21. SOLANA_RUN_SH_VALIDATOR_ARGS="${SOLANA_RUN_SH_VALIDATOR_ARGS} --full-snapshot-interval-slots 200" \
  22. SOLANA_VALIDATOR_EXIT_TIMEOUT="$validator_timeout" \
  23. timeout "$validator_timeout" ./scripts/run.sh &
  24. pid=$!
  25. attempts=20
  26. while [[ ! -f config/run/init-completed ]]; do
  27. sleep 1
  28. if ((--attempts == 0)); then
  29. echo "Error: validator failed to boot"
  30. exit 1
  31. else
  32. echo "Checking init"
  33. fi
  34. done
  35. # Needs bunch of slots for simulate-block-production.
  36. # Better yet, run ~20 secs to run longer than its warm-up.
  37. # As a bonus, this works as a sanity test of general slot-rooting behavior.
  38. snapshot_slot=50
  39. latest_slot=0
  40. # wait a bit longer than snapshot_slot
  41. while [[ $latest_slot -le $((snapshot_slot + 1)) ]]; do
  42. sleep 1
  43. echo "Checking slot"
  44. latest_slot=$($solana_cli --url http://localhost:8899 slot --commitment processed)
  45. done
  46. $agave_validator --ledger config/ledger exit --force || true
  47. wait $pid
  48. for method in blockstore-processor unified-scheduler
  49. do
  50. rm -rf config/snapshot-ledger
  51. $solana_ledger_tool create-snapshot --ledger config/ledger "$snapshot_slot" config/snapshot-ledger
  52. cp config/ledger/genesis.tar.bz2 config/snapshot-ledger
  53. $solana_ledger_tool copy --ledger config/ledger \
  54. --target-ledger config/snapshot-ledger --starting-slot "$snapshot_slot" --ending-slot "$latest_slot"
  55. set -x
  56. $solana_ledger_tool --ledger config/snapshot-ledger slot "$latest_slot" --verbose --verbose \
  57. |& grep -q "Log Messages:$" && exit 1
  58. $solana_ledger_tool verify --abort-on-invalid-block \
  59. --ledger config/snapshot-ledger --block-verification-method "$method" \
  60. --enable-rpc-transaction-history --enable-extended-tx-metadata-storage
  61. $solana_ledger_tool --ledger config/snapshot-ledger slot "$latest_slot" --verbose --verbose \
  62. |& grep -q "Log Messages:$"
  63. set +x
  64. done
  65. first_simulated_slot=$((latest_slot / 2))
  66. purge_slot=$((first_simulated_slot + latest_slot / 4))
  67. echo "First simulated slot: ${first_simulated_slot}"
  68. # Purge some slots so that later verify fails if sim is broken
  69. $solana_ledger_tool purge --ledger config/ledger "$purge_slot"
  70. $solana_ledger_tool simulate-block-production --ledger config/ledger \
  71. --first-simulated-slot $first_simulated_slot
  72. # Slots should be available and correctly replayable upto snapshot_slot at least.
  73. $solana_ledger_tool verify --abort-on-invalid-block \
  74. --ledger config/ledger --enable-hash-overrides --halt-at-slot "$snapshot_slot"