* Save/restore Tower * Avoid unwrap() * Rebase cleanups * Forcibly pass test * Correct reconcilation of votes after validator resume * d b g * Add more tests * fsync and fix test * Add test * Fix fmt * Debug * Fix tests... * save * Clarify error message and code cleaning around it * Move most of code out of tower save hot codepath * Proper comment for the lack of fsync on tower * Clean up * Clean up * Simpler type alias * Manage tower-restored ancestor slots without banks * Add comment * Extract long code blocks... * Add comment * Simplify returned tuple... * Tweak too aggresive log * Fix typo... * Add test * Update comment * Improve test to require non-empty stray restored slots * Measure tower save and dump all tower contents * Log adjust and add threshold related assertions * cleanup adjust * Properly lower stray restored slots priority... * Rust fmt * Fix test.... * Clarify comments a bit and add TowerError::TooNew * Further clean-up arround TowerError * Truly create ancestors by excluding last vote slot * Add comment for stray_restored_slots * Add comment for stray_restored_slots * Use BTreeSet * Consider root_slot into post-replay adjustment * Tweak logging * Add test for stray_restored_ancestors * Reorder some code * Better names for unit tests * Add frozen_abi to SavedTower * Fold long lines * Tweak stray ancestors and too old slot history * Re-adjust error conditon of too old slot history * Test normal ancestors is checked before stray ones * Fix conflict, update tests, adjust behavior a bit * Fix test * Address review comments * Last touch! * Immediately after creating cleaning pr * Revert stray slots * Revert comment... * Report error as metrics * Revert not to panic! and ignore unfixable test... * Normalize lockouts.root_slot more strictly * Add comments for panic! and more assertions * Proper initialize root without vote account * Clarify code and comments based on review feedback * Fix rebase * Further simplify based on assured tower root * Reorder code for more readability Co-authored-by: Michael Vines <mvines@gmail.com>
113 lines
2.8 KiB
Bash
Executable File
113 lines
2.8 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
#
|
|
# Run a minimal Solana cluster. Ctrl-C to exit.
|
|
#
|
|
# Before running this script ensure standard Solana programs are available
|
|
# in the PATH, or that `cargo build` ran successfully
|
|
#
|
|
set -e
|
|
|
|
# Prefer possible `cargo build` binaries over PATH binaries
|
|
cd "$(dirname "$0")/"
|
|
|
|
profile=debug
|
|
if [[ -n $NDEBUG ]]; then
|
|
profile=release
|
|
fi
|
|
PATH=$PWD/target/$profile:$PATH
|
|
|
|
ok=true
|
|
for program in solana-{faucet,genesis,keygen,validator}; do
|
|
$program -V || ok=false
|
|
done
|
|
$ok || {
|
|
echo
|
|
echo "Unable to locate required programs. Try building them first with:"
|
|
echo
|
|
echo " $ cargo build --all"
|
|
echo
|
|
exit 1
|
|
}
|
|
|
|
export RUST_LOG=${RUST_LOG:-solana=info} # if RUST_LOG is unset, default to info
|
|
export RUST_BACKTRACE=1
|
|
dataDir=$PWD/config/"$(basename "$0" .sh)"
|
|
ledgerDir=$PWD/config/ledger
|
|
|
|
set -x
|
|
validator_identity="$dataDir/validator-identity.json"
|
|
if [[ -e $validator_identity ]]; then
|
|
echo "Use existing validator keypair"
|
|
else
|
|
solana-keygen new --no-passphrase -so "$validator_identity"
|
|
fi
|
|
validator_vote_account="$dataDir/validator-vote-account.json"
|
|
if [[ -e $validator_vote_account ]]; then
|
|
echo "Use existing validator vote account keypair"
|
|
else
|
|
solana-keygen new --no-passphrase -so "$validator_vote_account"
|
|
fi
|
|
validator_stake_account="$dataDir/validator-stake-account.json"
|
|
if [[ -e $validator_stake_account ]]; then
|
|
echo "Use existing validator stake account keypair"
|
|
else
|
|
solana-keygen new --no-passphrase -so "$validator_stake_account"
|
|
fi
|
|
faucet="$dataDir"/faucet.json
|
|
if [[ -e $faucet ]]; then
|
|
echo "Use existing faucet keypair"
|
|
else
|
|
solana-keygen new --no-passphrase -fso "$faucet"
|
|
fi
|
|
|
|
if [[ -e "$ledgerDir"/genesis.bin || -e "$ledgerDir"/genesis.tar.bz2 ]]; then
|
|
echo "Use existing genesis"
|
|
else
|
|
./fetch-spl.sh
|
|
if [[ -r spl-genesis-args.sh ]]; then
|
|
SPL_GENESIS_ARGS=$(cat spl-genesis-args.sh)
|
|
fi
|
|
|
|
# shellcheck disable=SC2086
|
|
solana-genesis \
|
|
--hashes-per-tick sleep \
|
|
--faucet-pubkey "$dataDir"/faucet.json \
|
|
--faucet-lamports 500000000000000000 \
|
|
--bootstrap-validator \
|
|
"$dataDir"/validator-identity.json \
|
|
"$dataDir"/validator-vote-account.json \
|
|
"$dataDir"/validator-stake-account.json \
|
|
--ledger "$ledgerDir" \
|
|
--cluster-type development \
|
|
$SPL_GENESIS_ARGS \
|
|
$SOLANA_RUN_SH_GENESIS_ARGS
|
|
fi
|
|
|
|
abort() {
|
|
set +e
|
|
kill "$faucet" "$validator"
|
|
wait "$validator"
|
|
}
|
|
trap abort INT TERM EXIT
|
|
|
|
solana-faucet --keypair "$dataDir"/faucet.json &
|
|
faucet=$!
|
|
|
|
args=(
|
|
--identity "$dataDir"/validator-identity.json
|
|
--vote-account "$dataDir"/validator-vote-account.json
|
|
--ledger "$ledgerDir"
|
|
--gossip-port 8001
|
|
--rpc-port 8899
|
|
--rpc-faucet-address 127.0.0.1:9900
|
|
--log -
|
|
--enable-rpc-exit
|
|
--enable-rpc-transaction-history
|
|
--init-complete-file "$dataDir"/init-completed
|
|
--require-tower
|
|
)
|
|
solana-validator "${args[@]}" &
|
|
validator=$!
|
|
|
|
wait "$validator"
|