2018-11-11 08:19:04 -08:00
|
|
|
#!/usr/bin/env bash
|
|
|
|
set -e
|
2018-09-03 18:15:55 -10:00
|
|
|
|
2018-09-04 09:21:03 -07:00
|
|
|
cd "$(dirname "$0")"/../..
|
|
|
|
|
2018-12-05 16:40:08 -08:00
|
|
|
set -x
|
2018-09-03 18:15:55 -10:00
|
|
|
deployMethod="$1"
|
|
|
|
nodeType="$2"
|
2019-05-03 11:01:35 -07:00
|
|
|
entrypointIp="$3"
|
|
|
|
numNodes="$4"
|
|
|
|
RUST_LOG="$5"
|
|
|
|
skipSetup="$6"
|
2019-05-15 15:16:45 -07:00
|
|
|
failOnValidatorBootupFailure="$7"
|
2019-06-10 19:42:49 -07:00
|
|
|
externalPrimordialAccountsFile="$8"
|
|
|
|
stakeNodesInGenesisBlock="$9"
|
|
|
|
nodeIndex="${10}"
|
2019-06-11 18:47:35 -07:00
|
|
|
numBenchTpsClients="${11}"
|
|
|
|
benchTpsExtraArgs="${12}"
|
|
|
|
numBenchExchangeClients="${13}"
|
|
|
|
benchExchangeExtraArgs="${14}"
|
|
|
|
genesisOptions="${15}"
|
2018-12-05 16:40:08 -08:00
|
|
|
set +x
|
2019-04-09 10:39:31 -07:00
|
|
|
export RUST_LOG
|
2018-09-04 09:21:03 -07:00
|
|
|
|
2019-06-04 14:51:52 -07:00
|
|
|
# Use a very large stake (relative to the default multinode-demo/ stake of 42)
|
2019-05-23 15:06:01 -07:00
|
|
|
# for the testnet validators setup by net/. This make it less likely that
|
2019-04-16 13:03:01 -07:00
|
|
|
# low-staked ephemeral validator a random user may attach to testnet will cause
|
|
|
|
# trouble
|
|
|
|
#
|
|
|
|
# Ref: https://github.com/solana-labs/solana/issues/3798
|
|
|
|
stake=424243
|
|
|
|
|
2018-09-07 08:46:20 -07:00
|
|
|
missing() {
|
|
|
|
echo "Error: $1 not specified"
|
|
|
|
exit 1
|
|
|
|
}
|
|
|
|
|
|
|
|
[[ -n $deployMethod ]] || missing deployMethod
|
|
|
|
[[ -n $nodeType ]] || missing nodeType
|
|
|
|
[[ -n $entrypointIp ]] || missing entrypointIp
|
|
|
|
[[ -n $numNodes ]] || missing numNodes
|
2018-12-09 17:28:18 -08:00
|
|
|
[[ -n $skipSetup ]] || missing skipSetup
|
2019-04-29 21:38:03 -07:00
|
|
|
[[ -n $failOnValidatorBootupFailure ]] || missing failOnValidatorBootupFailure
|
2018-09-04 22:21:58 -07:00
|
|
|
|
2018-09-04 09:21:03 -07:00
|
|
|
cat > deployConfig <<EOF
|
|
|
|
deployMethod="$deployMethod"
|
2018-09-04 22:21:58 -07:00
|
|
|
entrypointIp="$entrypointIp"
|
2018-09-04 09:21:03 -07:00
|
|
|
numNodes="$numNodes"
|
2019-04-29 21:38:03 -07:00
|
|
|
failOnValidatorBootupFailure=$failOnValidatorBootupFailure
|
2019-05-18 14:01:36 -07:00
|
|
|
genesisOptions="$genesisOptions"
|
2018-09-04 09:21:03 -07:00
|
|
|
EOF
|
2018-09-03 18:15:55 -10:00
|
|
|
|
|
|
|
source net/common.sh
|
|
|
|
loadConfigFile
|
|
|
|
|
|
|
|
case $deployMethod in
|
2018-10-30 18:05:38 -07:00
|
|
|
local|tar)
|
2018-09-03 18:15:55 -10:00
|
|
|
PATH="$HOME"/.cargo/bin:"$PATH"
|
|
|
|
export USE_INSTALL=1
|
2018-12-10 22:59:38 -08:00
|
|
|
export SOLANA_METRICS_DISPLAY_HOSTNAME=1
|
2018-09-03 18:15:55 -10:00
|
|
|
|
2018-12-09 17:28:18 -08:00
|
|
|
# Setup `/var/snap/solana/current` symlink so rsyncing the genesis
|
2018-12-07 12:33:58 -08:00
|
|
|
# ledger works (reference: `net/scripts/install-rsync.sh`)
|
2018-12-09 17:28:18 -08:00
|
|
|
sudo rm -rf /var/snap/solana/current
|
|
|
|
sudo mkdir -p /var/snap/solana
|
|
|
|
sudo ln -sT /home/solana/solana /var/snap/solana/current
|
2018-12-07 12:33:58 -08:00
|
|
|
|
2018-09-03 18:15:55 -10:00
|
|
|
./fetch-perf-libs.sh
|
2018-11-12 17:50:16 -08:00
|
|
|
# shellcheck source=/dev/null
|
|
|
|
source ./target/perf-libs/env.sh
|
2019-06-05 09:10:23 -07:00
|
|
|
SUDO_OK=1 source scripts/tune-system.sh
|
2018-09-04 23:15:39 -07:00
|
|
|
|
2018-12-23 22:12:58 -08:00
|
|
|
(
|
|
|
|
sudo scripts/oom-monitor.sh
|
|
|
|
) > oom-monitor.log 2>&1 &
|
2019-01-09 11:17:34 -07:00
|
|
|
echo $! > oom-monitor.pid
|
2018-09-10 15:52:08 -07:00
|
|
|
scripts/net-stats.sh > net-stats.log 2>&1 &
|
2019-01-09 11:17:34 -07:00
|
|
|
echo $! > net-stats.pid
|
2018-09-03 18:15:55 -10:00
|
|
|
|
|
|
|
case $nodeType in
|
2018-12-07 15:59:25 -08:00
|
|
|
bootstrap-leader)
|
2019-05-23 15:06:01 -07:00
|
|
|
if [[ -e /dev/nvidia0 && -x ~/.cargo/bin/solana-validator-cuda ]]; then
|
|
|
|
echo Selecting solana-validator-cuda
|
2018-11-07 10:56:40 -08:00
|
|
|
export SOLANA_CUDA=1
|
|
|
|
fi
|
2019-01-09 10:50:43 -07:00
|
|
|
set -x
|
2019-06-10 19:42:49 -07:00
|
|
|
rm -rf ./solana-node-keys
|
|
|
|
rm -rf ./solana-node-stakes
|
|
|
|
mkdir ./solana-node-stakes
|
|
|
|
if [[ -n $stakeNodesInGenesisBlock ]]; then
|
|
|
|
for i in $(seq 0 "$numNodes"); do
|
|
|
|
solana-keygen new -o ./solana-node-keys/"$i"
|
|
|
|
pubkey="$(solana-keygen pubkey ./solana-node-keys/"$i")"
|
|
|
|
echo "${pubkey}: $stakeNodesInGenesisBlock" >> ./solana-node-stakes/fullnode-stakes.yml
|
|
|
|
done
|
|
|
|
fi
|
2019-06-11 18:47:35 -07:00
|
|
|
rm -rf ./solana-client-accounts
|
|
|
|
mkdir ./solana-client-accounts
|
|
|
|
for i in $(seq 0 $((numBenchTpsClients-1))); do
|
|
|
|
# shellcheck disable=SC2086 # Do not want to quote $benchTpsExtraArgs
|
|
|
|
solana-bench-tps --write-client-keys ./solana-client-accounts/bench-tps"$i".yml $benchTpsExtraArgs
|
|
|
|
# Skip first line, as it contains header
|
|
|
|
tail -n +2 -q ./solana-client-accounts/bench-tps"$i".yml >> ./solana-client-accounts/client-accounts.yml
|
|
|
|
echo "" >> ./solana-client-accounts/client-accounts.yml
|
|
|
|
done
|
2019-06-13 11:51:35 -07:00
|
|
|
for i in $(seq 0 $((numBenchExchangeClients-1))); do
|
2019-06-11 18:47:35 -07:00
|
|
|
# shellcheck disable=SC2086 # Do not want to quote $benchExchangeExtraArgs
|
2019-06-13 11:51:35 -07:00
|
|
|
solana-bench-exchange --batch-size 1000 --fund-amount 20000 \
|
|
|
|
--write-client-keys ./solana-client-accounts/bench-exchange"$i".yml $benchExchangeExtraArgs
|
|
|
|
tail -n +2 -q ./solana-client-accounts/bench-exchange"$i".yml >> ./solana-client-accounts/client-accounts.yml
|
|
|
|
echo "" >> ./solana-client-accounts/client-accounts.yml
|
2019-06-11 18:47:35 -07:00
|
|
|
done
|
2019-06-10 19:42:49 -07:00
|
|
|
[[ -z $externalPrimordialAccountsFile ]] || cat "$externalPrimordialAccountsFile" >> ./solana-node-stakes/fullnode-stakes.yml
|
|
|
|
if [ -f ./solana-node-stakes/fullnode-stakes.yml ]; then
|
2019-06-13 11:51:35 -07:00
|
|
|
genesisOptions+=" --primordial-accounts-file ./solana-node-stakes/fullnode-stakes.yml"
|
|
|
|
fi
|
|
|
|
if [ -f ./solana-client-accounts/client-accounts.yml ]; then
|
|
|
|
genesisOptions+=" --primordial-keypairs-file ./solana-client-accounts/client-accounts.yml"
|
2019-06-10 19:42:49 -07:00
|
|
|
fi
|
2018-12-09 17:28:18 -08:00
|
|
|
if [[ $skipSetup != true ]]; then
|
2019-05-31 19:58:52 -07:00
|
|
|
args=(
|
|
|
|
--bootstrap-leader-stake-lamports "$stake"
|
|
|
|
)
|
2019-05-18 14:01:36 -07:00
|
|
|
# shellcheck disable=SC2206 # Do not want to quote $genesisOptions
|
|
|
|
args+=($genesisOptions)
|
|
|
|
./multinode-demo/setup.sh "${args[@]}"
|
2018-12-09 17:28:18 -08:00
|
|
|
fi
|
2018-09-03 18:15:55 -10:00
|
|
|
./multinode-demo/drone.sh > drone.log 2>&1 &
|
2019-02-17 11:43:36 -08:00
|
|
|
|
2019-05-03 11:01:35 -07:00
|
|
|
args=(
|
|
|
|
--enable-rpc-exit
|
|
|
|
--gossip-port "$entrypointIp":8001
|
|
|
|
)
|
2019-03-04 14:27:06 -08:00
|
|
|
|
2019-06-10 19:42:49 -07:00
|
|
|
if [[ -n $stakeNodesInGenesisBlock ]]; then
|
|
|
|
args+=(--no-airdrop)
|
|
|
|
fi
|
2019-05-27 08:47:11 -07:00
|
|
|
nohup ./multinode-demo/validator.sh --bootstrap-leader "${args[@]}" > fullnode.log 2>&1 &
|
|
|
|
sleep 1
|
2018-09-03 18:15:55 -10:00
|
|
|
;;
|
2019-05-23 15:06:01 -07:00
|
|
|
validator|blockstreamer)
|
2018-12-05 16:40:08 -08:00
|
|
|
net/scripts/rsync-retry.sh -vPrc "$entrypointIp":~/.cargo/bin/ ~/.cargo/bin/
|
2019-06-10 19:42:49 -07:00
|
|
|
rm -f ~/solana/fullnode-identity.json
|
|
|
|
[[ -z $stakeNodesInGenesisBlock ]] || net/scripts/rsync-retry.sh -vPrc \
|
|
|
|
"$entrypointIp":~/solana/solana-node-keys/"$nodeIndex" ~/solana/fullnode-identity.json
|
2018-09-03 18:15:55 -10:00
|
|
|
|
2019-05-23 15:06:01 -07:00
|
|
|
if [[ -e /dev/nvidia0 && -x ~/.cargo/bin/solana-validator-cuda ]]; then
|
|
|
|
echo Selecting solana-validator-cuda
|
2018-11-07 10:56:40 -08:00
|
|
|
export SOLANA_CUDA=1
|
|
|
|
fi
|
|
|
|
|
2019-05-04 08:22:36 -07:00
|
|
|
args=(
|
|
|
|
"$entrypointIp":~/solana "$entrypointIp:8001"
|
|
|
|
--gossip-port 8001
|
|
|
|
--rpc-port 8899
|
|
|
|
)
|
2019-02-21 16:35:26 -07:00
|
|
|
if [[ $nodeType = blockstreamer ]]; then
|
2019-02-17 12:29:53 -08:00
|
|
|
args+=(
|
2019-02-21 16:16:09 -07:00
|
|
|
--blockstream /tmp/solana-blockstream.sock
|
2019-03-13 13:50:30 -07:00
|
|
|
--no-voting
|
2019-04-16 13:03:01 -07:00
|
|
|
--stake 0
|
2019-02-17 12:29:53 -08:00
|
|
|
)
|
2019-04-16 13:03:01 -07:00
|
|
|
else
|
2019-05-15 15:16:45 -07:00
|
|
|
args+=(--stake "$stake")
|
2019-04-25 09:30:59 -07:00
|
|
|
args+=(--enable-rpc-exit)
|
2019-02-17 09:48:27 -08:00
|
|
|
fi
|
|
|
|
|
2019-06-10 19:42:49 -07:00
|
|
|
if [[ -f ~/solana/fullnode-identity.json ]]; then
|
|
|
|
args+=(--identity ~/solana/fullnode-identity.json)
|
|
|
|
fi
|
|
|
|
|
|
|
|
if [[ -n $stakeNodesInGenesisBlock ]]; then
|
|
|
|
args+=(--no-airdrop)
|
|
|
|
fi
|
|
|
|
|
2019-01-09 10:50:43 -07:00
|
|
|
set -x
|
2018-12-09 17:28:18 -08:00
|
|
|
if [[ $skipSetup != true ]]; then
|
2019-05-23 15:06:01 -07:00
|
|
|
./multinode-demo/clear-config.sh
|
2018-12-09 17:28:18 -08:00
|
|
|
fi
|
2019-02-17 09:48:27 -08:00
|
|
|
|
2019-02-21 16:35:26 -07:00
|
|
|
if [[ $nodeType = blockstreamer ]]; then
|
2019-05-09 07:27:13 -07:00
|
|
|
# Sneak the mint-keypair.json from the bootstrap leader and run another drone
|
2019-03-21 21:09:03 -07:00
|
|
|
# with it on the blockstreamer node. Typically the blockstreamer node has
|
|
|
|
# a static IP/DNS name for hosting the blockexplorer web app, and is
|
|
|
|
# a location that somebody would expect to be able to airdrop from
|
2019-05-09 07:27:13 -07:00
|
|
|
scp "$entrypointIp":~/solana/config-local/mint-keypair.json config-local/
|
2019-03-21 21:09:03 -07:00
|
|
|
./multinode-demo/drone.sh > drone.log 2>&1 &
|
|
|
|
|
2019-04-28 19:50:02 -07:00
|
|
|
export BLOCKEXPLORER_GEOIP_WHITELIST=$PWD/net/config/geoip.yml
|
2019-02-18 16:48:32 -08:00
|
|
|
npm install @solana/blockexplorer@1
|
2019-02-17 12:29:53 -08:00
|
|
|
npx solana-blockexplorer > blockexplorer.log 2>&1 &
|
2019-03-13 09:57:35 -07:00
|
|
|
|
|
|
|
# Confirm the blockexplorer is accessible
|
|
|
|
curl --head --retry 3 --retry-connrefused http://localhost:5000/
|
|
|
|
|
|
|
|
# Redirect port 80 to port 5000
|
|
|
|
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
|
|
|
|
sudo iptables -A INPUT -p tcp --dport 5000 -j ACCEPT
|
|
|
|
sudo iptables -A PREROUTING -t nat -p tcp --dport 80 -j REDIRECT --to-port 5000
|
|
|
|
|
|
|
|
# Confirm the blockexplorer is now globally accessible
|
|
|
|
curl --head "$(curl ifconfig.io)"
|
2019-02-17 12:29:53 -08:00
|
|
|
fi
|
2019-04-22 14:51:20 -07:00
|
|
|
|
2019-05-27 08:47:11 -07:00
|
|
|
nohup ./multinode-demo/validator.sh "${args[@]}" > fullnode.log 2>&1 &
|
|
|
|
sleep 1
|
2018-09-03 18:15:55 -10:00
|
|
|
;;
|
2019-05-31 15:27:31 -07:00
|
|
|
replicator)
|
2019-05-31 22:33:55 -07:00
|
|
|
net/scripts/rsync-retry.sh -vPrc "$entrypointIp":~/.cargo/bin/ ~/.cargo/bin/
|
|
|
|
|
2019-05-31 15:27:31 -07:00
|
|
|
args=(
|
|
|
|
"$entrypointIp":~/solana "$entrypointIp:8001"
|
|
|
|
)
|
2019-06-10 19:42:49 -07:00
|
|
|
|
|
|
|
if [[ -n $stakeNodesInGenesisBlock ]]; then
|
|
|
|
args+=(--no-airdrop)
|
|
|
|
fi
|
|
|
|
|
2019-05-31 15:27:31 -07:00
|
|
|
if [[ $skipSetup != true ]]; then
|
|
|
|
./multinode-demo/clear-config.sh
|
|
|
|
fi
|
|
|
|
nohup ./multinode-demo/replicator.sh "${args[@]}" > fullnode.log 2>&1 &
|
|
|
|
sleep 1
|
|
|
|
;;
|
2018-09-03 18:15:55 -10:00
|
|
|
*)
|
|
|
|
echo "Error: unknown node type: $nodeType"
|
|
|
|
exit 1
|
|
|
|
;;
|
|
|
|
esac
|
2019-01-16 19:18:32 -08:00
|
|
|
disown
|
2018-09-03 18:15:55 -10:00
|
|
|
;;
|
|
|
|
*)
|
|
|
|
echo "Unknown deployment method: $deployMethod"
|
|
|
|
exit 1
|
|
|
|
esac
|