parent
18feba2431
commit
3b9b9b1500
|
@ -69,7 +69,7 @@ To run a multinode testnet, after starting a leader node, spin up some additiona
|
|||
$ ./multinode-demo/validator-x.sh
|
||||
```
|
||||
|
||||
To run a performance-enhanced full node on Linux, [CUDA 10.0](https://developer.nvidia.com/cuda-downloads) must be installed on your system:
|
||||
To run a performance-enhanced validator on Linux, [CUDA 10.0](https://developer.nvidia.com/cuda-downloads) must be installed on your system:
|
||||
|
||||
```bash
|
||||
$ ./fetch-perf-libs.sh
|
||||
|
|
|
@ -188,7 +188,7 @@ The public key of a [keypair](terminology.md#keypair).
|
|||
|
||||
## archiver
|
||||
|
||||
Storage mining client, stores some part of the ledger enumerated in blocks and submits storage proofs to the chain. Not a full-node.
|
||||
Storage mining client, stores some part of the ledger enumerated in blocks and submits storage proofs to the chain. Not a validator.
|
||||
|
||||
## root
|
||||
|
||||
|
|
|
@ -5,10 +5,10 @@ cd "$(dirname "$0")"/..
|
|||
source ci/upload-ci-artifact.sh
|
||||
|
||||
zone=
|
||||
bootstrapFullNodeAddress=
|
||||
bootstrapFullNodeMachineType=
|
||||
bootstrapValidatorAddress=
|
||||
bootstrapValidatorMachineType=
|
||||
clientNodeCount=0
|
||||
additionalFullNodeCount=10
|
||||
additionalValidatorCount=10
|
||||
publicNetwork=false
|
||||
stopNetwork=false
|
||||
reuseLedger=false
|
||||
|
@ -29,7 +29,7 @@ maybeInternalNodesLamports=
|
|||
maybeExternalPrimordialAccountsFile=
|
||||
maybeLamports=
|
||||
maybeLetsEncrypt=
|
||||
maybeFullnodeAdditionalDiskSize=
|
||||
maybeValidatorAdditionalDiskSize=
|
||||
maybeNoSnapshot=
|
||||
maybeLimitLedgerSize=
|
||||
|
||||
|
@ -54,13 +54,13 @@ Deploys a CD testnet
|
|||
specified release channel (edge|beta|stable) or release tag
|
||||
(vX.Y.Z)
|
||||
(default: $tarChannelOrTag)
|
||||
-n [number] - Number of additional full nodes (default: $additionalFullNodeCount)
|
||||
-n [number] - Number of additional validators (default: $additionalValidatorCount)
|
||||
-c [number] - Number of client bencher nodes (default: $clientNodeCount)
|
||||
-u - Include a Blockstreamer (default: $blockstreamer)
|
||||
-P - Use public network IP addresses (default: $publicNetwork)
|
||||
-G - Enable GPU, and set count/type of GPUs to use (e.g n1-standard-16 --accelerator count=2,type=nvidia-tesla-v100)
|
||||
-g - Enable GPU (default: $enableGpu)
|
||||
-a [address] - Set the bootstrap fullnode's external IP address to this GCE address
|
||||
-a [address] - Set the bootstrap validator's external IP address to this GCE address
|
||||
-d [disk-type] - Specify a boot disk type (default None) Use pd-ssd to get ssd on GCE.
|
||||
-D - Delete the network
|
||||
-r - Reuse existing node/ledger configuration from a
|
||||
|
@ -88,8 +88,8 @@ Deploys a CD testnet
|
|||
- If set, will not fetch logs from remote nodes
|
||||
--letsencrypt [dns name]
|
||||
- Attempt to generate a TLS certificate using this DNS name
|
||||
--fullnode-additional-disk-size-gb [number]
|
||||
- Size of additional disk in GB for all fullnodes
|
||||
--validator-additional-disk-size-gb [number]
|
||||
- Size of additional disk in GB for all validators
|
||||
--no-snapshot-fetch
|
||||
- If set, disables booting validators from a snapshot
|
||||
|
||||
|
@ -128,8 +128,8 @@ while [[ -n $1 ]]; do
|
|||
elif [[ $1 = --letsencrypt ]]; then
|
||||
maybeLetsEncrypt="$1 $2"
|
||||
shift 2
|
||||
elif [[ $1 = --fullnode-additional-disk-size-gb ]]; then
|
||||
maybeFullnodeAdditionalDiskSize="$1 $2"
|
||||
elif [[ $1 = --validator-additional-disk-size-gb ]]; then
|
||||
maybeValidatorAdditionalDiskSize="$1 $2"
|
||||
shift 2
|
||||
elif [[ $1 == --machine-type* ]]; then # Bypass quoted long args for GPUs
|
||||
shortArgs+=("$1")
|
||||
|
@ -167,7 +167,7 @@ while getopts "h?p:Pn:c:t:gG:a:Dd:rusxz:p:C:Sfe" opt "${shortArgs[@]}"; do
|
|||
publicNetwork=true
|
||||
;;
|
||||
n)
|
||||
additionalFullNodeCount=$OPTARG
|
||||
additionalValidatorCount=$OPTARG
|
||||
;;
|
||||
c)
|
||||
clientNodeCount=$OPTARG
|
||||
|
@ -187,10 +187,10 @@ while getopts "h?p:Pn:c:t:gG:a:Dd:rusxz:p:C:Sfe" opt "${shortArgs[@]}"; do
|
|||
;;
|
||||
G)
|
||||
enableGpu=true
|
||||
bootstrapFullNodeMachineType=$OPTARG
|
||||
bootstrapValidatorMachineType=$OPTARG
|
||||
;;
|
||||
a)
|
||||
bootstrapFullNodeAddress=$OPTARG
|
||||
bootstrapValidatorAddress=$OPTARG
|
||||
;;
|
||||
d)
|
||||
bootDiskType=$OPTARG
|
||||
|
@ -275,9 +275,9 @@ if ! $skipCreate; then
|
|||
echo "--- $cloudProvider.sh create"
|
||||
create_args=(
|
||||
-p "$netName"
|
||||
-a "$bootstrapFullNodeAddress"
|
||||
-a "$bootstrapValidatorAddress"
|
||||
-c "$clientNodeCount"
|
||||
-n "$additionalFullNodeCount"
|
||||
-n "$additionalValidatorCount"
|
||||
--dedicated
|
||||
)
|
||||
# shellcheck disable=SC2206
|
||||
|
@ -297,10 +297,10 @@ if ! $skipCreate; then
|
|||
fi
|
||||
|
||||
if $enableGpu; then
|
||||
if [[ -z $bootstrapFullNodeMachineType ]]; then
|
||||
if [[ -z $bootstrapValidatorMachineType ]]; then
|
||||
create_args+=(-g)
|
||||
else
|
||||
create_args+=(-G "$bootstrapFullNodeMachineType")
|
||||
create_args+=(-G "$bootstrapValidatorMachineType")
|
||||
fi
|
||||
fi
|
||||
|
||||
|
@ -316,9 +316,9 @@ if ! $skipCreate; then
|
|||
create_args+=(-f)
|
||||
fi
|
||||
|
||||
if [[ -n $maybeFullnodeAdditionalDiskSize ]]; then
|
||||
if [[ -n $maybeValidatorAdditionalDiskSize ]]; then
|
||||
# shellcheck disable=SC2206 # Do not want to quote
|
||||
create_args+=($maybeFullnodeAdditionalDiskSize)
|
||||
create_args+=($maybeValidatorAdditionalDiskSize)
|
||||
fi
|
||||
|
||||
time net/"$cloudProvider".sh create "${create_args[@]}"
|
||||
|
|
|
@ -114,7 +114,7 @@ GCE_ZONES=(
|
|||
europe-west4-c
|
||||
)
|
||||
|
||||
# GCE zones with enough quota for one CPU-only fullnode
|
||||
# GCE zones with enough quota for one CPU-only validator
|
||||
GCE_LOW_QUOTA_ZONES=(
|
||||
asia-east2-a
|
||||
asia-northeast1-b
|
||||
|
@ -515,11 +515,11 @@ deploy() {
|
|||
fi
|
||||
|
||||
if [[ -z $ADDITIONAL_DISK_SIZE_GB ]]; then
|
||||
maybeAdditionalDisk="--fullnode-additional-disk-size-gb 32000"
|
||||
maybeAdditionalDisk="--validator-additional-disk-size-gb 32000"
|
||||
elif [[ $ADDITIONAL_DISK_SIZE_GB == skip ]]; then
|
||||
maybeAdditionalDisk=""
|
||||
else
|
||||
maybeAdditionalDisk="--fullnode-additional-disk-size-gb ${ADDITIONAL_DISK_SIZE_GB}"
|
||||
maybeAdditionalDisk="--validator-additional-disk-size-gb ${ADDITIONAL_DISK_SIZE_GB}"
|
||||
fi
|
||||
|
||||
|
||||
|
|
|
@ -29,9 +29,9 @@ sshPrivateKey=
|
|||
letsEncryptDomainName=
|
||||
externalNodeSshKey=
|
||||
sshOptions=()
|
||||
fullnodeIpList=()
|
||||
fullnodeIpListPrivate=()
|
||||
fullnodeIpListZone=()
|
||||
validatorIpList=()
|
||||
validatorIpListPrivate=()
|
||||
validatorIpListZone=()
|
||||
clientIpList=()
|
||||
clientIpListPrivate=()
|
||||
clientIpListZone=()
|
||||
|
@ -64,14 +64,14 @@ loadConfigFile() {
|
|||
[[ -n "$publicNetwork" ]] || usage "Config file invalid, publicNetwork unspecified: $configFile"
|
||||
[[ -n "$netBasename" ]] || usage "Config file invalid, netBasename unspecified: $configFile"
|
||||
[[ -n $sshPrivateKey ]] || usage "Config file invalid, sshPrivateKey unspecified: $configFile"
|
||||
[[ ${#fullnodeIpList[@]} -gt 0 ]] || usage "Config file invalid, fullnodeIpList unspecified: $configFile"
|
||||
[[ ${#fullnodeIpListPrivate[@]} -gt 0 ]] || usage "Config file invalid, fullnodeIpListPrivate unspecified: $configFile"
|
||||
[[ ${#fullnodeIpList[@]} -eq ${#fullnodeIpListPrivate[@]} ]] || usage "Config file invalid, fullnodeIpList/fullnodeIpListPrivate length mismatch: $configFile"
|
||||
[[ ${#validatorIpList[@]} -gt 0 ]] || usage "Config file invalid, validatorIpList unspecified: $configFile"
|
||||
[[ ${#validatorIpListPrivate[@]} -gt 0 ]] || usage "Config file invalid, validatorIpListPrivate unspecified: $configFile"
|
||||
[[ ${#validatorIpList[@]} -eq ${#validatorIpListPrivate[@]} ]] || usage "Config file invalid, validatorIpList/validatorIpListPrivate length mismatch: $configFile"
|
||||
|
||||
if $publicNetwork; then
|
||||
entrypointIp=${fullnodeIpList[0]}
|
||||
entrypointIp=${validatorIpList[0]}
|
||||
else
|
||||
entrypointIp=${fullnodeIpListPrivate[0]}
|
||||
entrypointIp=${validatorIpListPrivate[0]}
|
||||
fi
|
||||
|
||||
buildSshOptions
|
||||
|
|
98
net/gce.sh
98
net/gce.sh
|
@ -15,7 +15,7 @@ gce)
|
|||
cpuBootstrapLeaderMachineType="--custom-cpu 12 --custom-memory 32GB --min-cpu-platform Intel%20Skylake"
|
||||
gpuBootstrapLeaderMachineType="$cpuBootstrapLeaderMachineType --accelerator count=1,type=nvidia-tesla-p100"
|
||||
bootstrapLeaderMachineType=$cpuBootstrapLeaderMachineType
|
||||
fullNodeMachineType=$cpuBootstrapLeaderMachineType
|
||||
validatorMachineType=$cpuBootstrapLeaderMachineType
|
||||
clientMachineType="--custom-cpu 16 --custom-memory 20GB"
|
||||
blockstreamerMachineType="--machine-type n1-standard-8"
|
||||
archiverMachineType="--custom-cpu 4 --custom-memory 16GB"
|
||||
|
@ -31,7 +31,7 @@ ec2)
|
|||
# AVX-512
|
||||
gpuBootstrapLeaderMachineType=p2.xlarge
|
||||
bootstrapLeaderMachineType=$cpuBootstrapLeaderMachineType
|
||||
fullNodeMachineType=$cpuBootstrapLeaderMachineType
|
||||
validatorMachineType=$cpuBootstrapLeaderMachineType
|
||||
clientMachineType=c5.2xlarge
|
||||
blockstreamerMachineType=c5.2xlarge
|
||||
archiverMachineType=c5.xlarge
|
||||
|
@ -44,7 +44,7 @@ azure)
|
|||
cpuBootstrapLeaderMachineType=Standard_D16s_v3
|
||||
gpuBootstrapLeaderMachineType=Standard_NC12
|
||||
bootstrapLeaderMachineType=$cpuBootstrapLeaderMachineType
|
||||
fullNodeMachineType=$cpuBootstrapLeaderMachineType
|
||||
validatorMachineType=$cpuBootstrapLeaderMachineType
|
||||
clientMachineType=Standard_D16s_v3
|
||||
blockstreamerMachineType=Standard_D16s_v3
|
||||
archiverMachineType=Standard_D4s_v3
|
||||
|
@ -56,7 +56,7 @@ colo)
|
|||
cpuBootstrapLeaderMachineType=0
|
||||
gpuBootstrapLeaderMachineType=1
|
||||
bootstrapLeaderMachineType=$cpuBootstrapLeaderMachineType
|
||||
fullNodeMachineType=$cpuBootstrapLeaderMachineType
|
||||
validatorMachineType=$cpuBootstrapLeaderMachineType
|
||||
clientMachineType=0
|
||||
blockstreamerMachineType=0
|
||||
archiverMachineType=0
|
||||
|
@ -68,14 +68,14 @@ esac
|
|||
|
||||
|
||||
prefix=testnet-dev-${USER//[^A-Za-z0-9]/}
|
||||
additionalFullNodeCount=2
|
||||
additionalValidatorCount=2
|
||||
clientNodeCount=0
|
||||
archiverNodeCount=0
|
||||
blockstreamer=false
|
||||
fullNodeBootDiskSizeInGb=500
|
||||
validatorBootDiskSizeInGb=500
|
||||
clientBootDiskSizeInGb=75
|
||||
archiverBootDiskSizeInGb=500
|
||||
fullNodeAdditionalDiskSizeInGb=
|
||||
validatorAdditionalDiskSizeInGb=
|
||||
externalNodes=false
|
||||
failOnValidatorBootupFailure=true
|
||||
preemptible=true
|
||||
|
@ -114,7 +114,7 @@ Manage testnet instances
|
|||
-p [prefix] - Optional common prefix for instance names to avoid
|
||||
collisions (default: $prefix)
|
||||
-z [zone] - Zone(s) for the nodes (default: $(cloud_DefaultZone))
|
||||
If specified multiple times, the fullnodes will be evenly
|
||||
If specified multiple times, the validators will be evenly
|
||||
distributed over all specified zones and
|
||||
client/blockstreamer nodes will be created in the first
|
||||
zone
|
||||
|
@ -125,7 +125,7 @@ Manage testnet instances
|
|||
successfully
|
||||
|
||||
create-specific options:
|
||||
-n [number] - Number of additional fullnodes (default: $additionalFullNodeCount)
|
||||
-n [number] - Number of additional validators (default: $additionalValidatorCount)
|
||||
-c [number] - Number of client nodes (default: $clientNodeCount)
|
||||
-r [number] - Number of archiver nodes (default: $archiverNodeCount)
|
||||
-u - Include a Blockstreamer (default: $blockstreamer)
|
||||
|
@ -134,7 +134,7 @@ Manage testnet instances
|
|||
-G - Enable GPU, and set count/type of GPUs to use
|
||||
(e.g $gpuBootstrapLeaderMachineType)
|
||||
-a [address] - Address to be be assigned to the Blockstreamer if present,
|
||||
otherwise the bootstrap fullnode.
|
||||
otherwise the bootstrap validator.
|
||||
* For GCE, [address] is the "name" of the desired External
|
||||
IP Address.
|
||||
* For EC2, [address] is the "allocation ID" of the desired
|
||||
|
@ -143,11 +143,11 @@ Manage testnet instances
|
|||
--letsencrypt [dns name] - Attempt to generate a TLS certificate using this
|
||||
DNS name (useful only when the -a and -P options
|
||||
are also provided)
|
||||
--fullnode-additional-disk-size-gb [number]
|
||||
- Add an additional [number] GB SSD to all fullnodes to store the config directory.
|
||||
--validator-additional-disk-size-gb [number]
|
||||
- Add an additional [number] GB SSD to all validators to store the config directory.
|
||||
If not set, config will be written to the boot disk by default.
|
||||
Only supported on GCE.
|
||||
--dedicated - Use dedicated instances for additional full nodes
|
||||
--dedicated - Use dedicated instances for additional validators
|
||||
(by default preemptible instances are used to reduce
|
||||
cost). Note that the bootstrap leader, archiver,
|
||||
blockstreamer and client nodes are always dedicated.
|
||||
|
@ -177,8 +177,8 @@ while [[ -n $1 ]]; do
|
|||
if [[ $1 = --letsencrypt ]]; then
|
||||
letsEncryptDomainName="$2"
|
||||
shift 2
|
||||
elif [[ $1 = --fullnode-additional-disk-size-gb ]]; then
|
||||
fullNodeAdditionalDiskSizeInGb="$2"
|
||||
elif [[ $1 = --validator-additional-disk-size-gb ]]; then
|
||||
validatorAdditionalDiskSizeInGb="$2"
|
||||
shift 2
|
||||
elif [[ $1 == --machine-type* || $1 == --custom-cpu* ]]; then # Bypass quoted long args for GPUs
|
||||
shortArgs+=("$1")
|
||||
|
@ -211,7 +211,7 @@ while getopts "h?p:Pn:c:r:z:gG:a:d:uxf" opt "${shortArgs[@]}"; do
|
|||
publicNetwork=true
|
||||
;;
|
||||
n)
|
||||
additionalFullNodeCount=$OPTARG
|
||||
additionalValidatorCount=$OPTARG
|
||||
;;
|
||||
c)
|
||||
clientNodeCount=$OPTARG
|
||||
|
@ -225,13 +225,13 @@ while getopts "h?p:Pn:c:r:z:gG:a:d:uxf" opt "${shortArgs[@]}"; do
|
|||
g)
|
||||
enableGpu=true
|
||||
bootstrapLeaderMachineType=$gpuBootstrapLeaderMachineType
|
||||
fullNodeMachineType=$bootstrapLeaderMachineType
|
||||
validatorMachineType=$bootstrapLeaderMachineType
|
||||
blockstreamerMachineType=$bootstrapLeaderMachineType
|
||||
;;
|
||||
G)
|
||||
enableGpu=true
|
||||
bootstrapLeaderMachineType="$OPTARG"
|
||||
fullNodeMachineType=$bootstrapLeaderMachineType
|
||||
validatorMachineType=$bootstrapLeaderMachineType
|
||||
blockstreamerMachineType=$bootstrapLeaderMachineType
|
||||
;;
|
||||
a)
|
||||
|
@ -268,8 +268,8 @@ case $cloudProvider in
|
|||
gce)
|
||||
;;
|
||||
ec2|azure|colo)
|
||||
if [[ -n $fullNodeAdditionalDiskSizeInGb ]] ; then
|
||||
usage "Error: --fullnode-additional-disk-size-gb currently only supported with cloud provider: gce"
|
||||
if [[ -n $validatorAdditionalDiskSizeInGb ]] ; then
|
||||
usage "Error: --validator-additional-disk-size-gb currently only supported with cloud provider: gce"
|
||||
fi
|
||||
;;
|
||||
*)
|
||||
|
@ -492,16 +492,16 @@ EOF
|
|||
exit 1
|
||||
}
|
||||
|
||||
echo "fullnodeIpList=()" >> "$configFile"
|
||||
echo "fullnodeIpListPrivate=()" >> "$configFile"
|
||||
cloud_ForEachInstance recordInstanceIp true fullnodeIpList
|
||||
echo "validatorIpList=()" >> "$configFile"
|
||||
echo "validatorIpListPrivate=()" >> "$configFile"
|
||||
cloud_ForEachInstance recordInstanceIp true validatorIpList
|
||||
fi
|
||||
|
||||
if [[ $additionalFullNodeCount -gt 0 ]]; then
|
||||
if [[ $additionalValidatorCount -gt 0 ]]; then
|
||||
numZones=${#zones[@]}
|
||||
if [[ $additionalFullNodeCount -gt $numZones ]]; then
|
||||
numNodesPerZone=$((additionalFullNodeCount / numZones))
|
||||
numLeftOverNodes=$((additionalFullNodeCount % numZones))
|
||||
if [[ $additionalValidatorCount -gt $numZones ]]; then
|
||||
numNodesPerZone=$((additionalValidatorCount / numZones))
|
||||
numLeftOverNodes=$((additionalValidatorCount % numZones))
|
||||
else
|
||||
numNodesPerZone=1
|
||||
numLeftOverNodes=0
|
||||
|
@ -512,13 +512,13 @@ EOF
|
|||
if [[ $i -eq 0 ]]; then
|
||||
numNodesPerZone=$((numNodesPerZone + numLeftOverNodes))
|
||||
fi
|
||||
echo "Looking for additional fullnode instances in $zone ..."
|
||||
cloud_FindInstances "$prefix-$zone-fullnode"
|
||||
echo "Looking for additional validator instances in $zone ..."
|
||||
cloud_FindInstances "$prefix-$zone-validator"
|
||||
declare numInstances=${#instances[@]}
|
||||
if [[ $numInstances -ge $numNodesPerZone || ( ! $failOnValidatorBootupFailure && $numInstances -gt 0 ) ]]; then
|
||||
cloud_ForEachInstance recordInstanceIp "$failOnValidatorBootupFailure" fullnodeIpList
|
||||
cloud_ForEachInstance recordInstanceIp "$failOnValidatorBootupFailure" validatorIpList
|
||||
else
|
||||
echo "Unable to find additional fullnodes"
|
||||
echo "Unable to find additional validators"
|
||||
if $failOnValidatorBootupFailure; then
|
||||
exit 1
|
||||
fi
|
||||
|
@ -600,7 +600,7 @@ delete)
|
|||
;;
|
||||
|
||||
create)
|
||||
[[ -n $additionalFullNodeCount ]] || usage "Need number of nodes"
|
||||
[[ -n $additionalValidatorCount ]] || usage "Need number of nodes"
|
||||
|
||||
delete
|
||||
|
||||
|
@ -619,7 +619,7 @@ create)
|
|||
cat <<EOF
|
||||
==[ Network composition ]===============================================================
|
||||
Bootstrap leader = $bootstrapLeaderMachineType (GPU=$enableGpu)
|
||||
Additional fullnodes = $additionalFullNodeCount x $fullNodeMachineType
|
||||
Additional validators = $additionalValidatorCount x $validatorMachineType
|
||||
Client(s) = $clientNodeCount x $clientMachineType
|
||||
Archivers(s) = $archiverNodeCount x $archiverMachineType
|
||||
Blockstreamer = $blockstreamer
|
||||
|
@ -706,7 +706,7 @@ $(
|
|||
cat enable-nvidia-persistence-mode.sh
|
||||
fi
|
||||
|
||||
if [[ -n $fullNodeAdditionalDiskSizeInGb ]]; then
|
||||
if [[ -n $validatorAdditionalDiskSizeInGb ]]; then
|
||||
cat mount-additional-disk.sh
|
||||
fi
|
||||
)
|
||||
|
@ -734,16 +734,16 @@ EOF
|
|||
echo "Bootstrap leader is already configured"
|
||||
else
|
||||
cloud_CreateInstances "$prefix" "$prefix-bootstrap-leader" 1 \
|
||||
"$enableGpu" "$bootstrapLeaderMachineType" "${zones[0]}" "$fullNodeBootDiskSizeInGb" \
|
||||
"$startupScript" "$bootstrapLeaderAddress" "$bootDiskType" "$fullNodeAdditionalDiskSizeInGb" \
|
||||
"$enableGpu" "$bootstrapLeaderMachineType" "${zones[0]}" "$validatorBootDiskSizeInGb" \
|
||||
"$startupScript" "$bootstrapLeaderAddress" "$bootDiskType" "$validatorAdditionalDiskSizeInGb" \
|
||||
"never preemptible" "$sshPrivateKey"
|
||||
fi
|
||||
|
||||
if [[ $additionalFullNodeCount -gt 0 ]]; then
|
||||
if [[ $additionalValidatorCount -gt 0 ]]; then
|
||||
num_zones=${#zones[@]}
|
||||
if [[ $additionalFullNodeCount -gt $num_zones ]]; then
|
||||
numNodesPerZone=$((additionalFullNodeCount / num_zones))
|
||||
numLeftOverNodes=$((additionalFullNodeCount % num_zones))
|
||||
if [[ $additionalValidatorCount -gt $num_zones ]]; then
|
||||
numNodesPerZone=$((additionalValidatorCount / num_zones))
|
||||
numLeftOverNodes=$((additionalValidatorCount % num_zones))
|
||||
else
|
||||
numNodesPerZone=1
|
||||
numLeftOverNodes=0
|
||||
|
@ -754,9 +754,9 @@ EOF
|
|||
if [[ $i -eq 0 ]]; then
|
||||
numNodesPerZone=$((numNodesPerZone + numLeftOverNodes))
|
||||
fi
|
||||
cloud_CreateInstances "$prefix" "$prefix-$zone-fullnode" "$numNodesPerZone" \
|
||||
"$enableGpu" "$fullNodeMachineType" "$zone" "$fullNodeBootDiskSizeInGb" \
|
||||
"$startupScript" "" "$bootDiskType" "$fullNodeAdditionalDiskSizeInGb" \
|
||||
cloud_CreateInstances "$prefix" "$prefix-$zone-validator" "$numNodesPerZone" \
|
||||
"$enableGpu" "$validatorMachineType" "$zone" "$validatorBootDiskSizeInGb" \
|
||||
"$startupScript" "" "$bootDiskType" "$validatorAdditionalDiskSizeInGb" \
|
||||
"$preemptible" "$sshPrivateKey" &
|
||||
done
|
||||
|
||||
|
@ -771,7 +771,7 @@ EOF
|
|||
|
||||
if $blockstreamer; then
|
||||
cloud_CreateInstances "$prefix" "$prefix-blockstreamer" "1" \
|
||||
"$enableGpu" "$blockstreamerMachineType" "${zones[0]}" "$fullNodeBootDiskSizeInGb" \
|
||||
"$enableGpu" "$blockstreamerMachineType" "${zones[0]}" "$validatorBootDiskSizeInGb" \
|
||||
"$startupScript" "$blockstreamerAddress" "$bootDiskType" "" "$sshPrivateKey"
|
||||
fi
|
||||
|
||||
|
@ -802,12 +802,12 @@ info)
|
|||
printNode "Node Type" "Public IP" "Private IP" "Zone"
|
||||
echo "-------------------+-----------------+-----------------+--------------"
|
||||
nodeType=bootstrap-leader
|
||||
for i in $(seq 0 $(( ${#fullnodeIpList[@]} - 1)) ); do
|
||||
ipAddress=${fullnodeIpList[$i]}
|
||||
ipAddressPrivate=${fullnodeIpListPrivate[$i]}
|
||||
zone=${fullnodeIpListZone[$i]}
|
||||
for i in $(seq 0 $(( ${#validatorIpList[@]} - 1)) ); do
|
||||
ipAddress=${validatorIpList[$i]}
|
||||
ipAddressPrivate=${validatorIpListPrivate[$i]}
|
||||
zone=${validatorIpListZone[$i]}
|
||||
printNode $nodeType "$ipAddress" "$ipAddressPrivate" "$zone"
|
||||
nodeType=fullnode
|
||||
nodeType=validator
|
||||
done
|
||||
|
||||
for i in $(seq 0 $(( ${#clientIpList[@]} - 1)) ); do
|
||||
|
|
64
net/net.sh
64
net/net.sh
|
@ -48,7 +48,7 @@ Operate a configured testnet
|
|||
-c bench-tps=2="--tx_count 25000"
|
||||
This will start 2 bench-tps clients, and supply "--tx_count 25000"
|
||||
to the bench-tps client.
|
||||
-n NUM_FULL_NODES - Number of fullnodes to apply command to.
|
||||
-n NUM_VALIDATORS - Number of validators to apply command to.
|
||||
--gpu-mode GPU_MODE - Specify GPU mode to launch validators with (default: $gpuMode).
|
||||
MODE must be one of
|
||||
on - GPU *required*, any vendor *
|
||||
|
@ -124,7 +124,7 @@ benchTpsExtraArgs=
|
|||
benchExchangeExtraArgs=
|
||||
failOnValidatorBootupFailure=true
|
||||
genesisOptions=
|
||||
numFullnodesRequested=
|
||||
numValidatorsRequested=
|
||||
externalPrimordialAccountsFile=
|
||||
remoteExternalPrimordialAccountsFile=
|
||||
internalNodesStakeLamports=
|
||||
|
@ -235,7 +235,7 @@ while getopts "h?T:t:o:f:rD:c:Fn:i:d" opt "${shortArgs[@]}"; do
|
|||
esac
|
||||
;;
|
||||
n)
|
||||
numFullnodesRequested=$OPTARG
|
||||
numValidatorsRequested=$OPTARG
|
||||
;;
|
||||
r)
|
||||
skipSetup=true
|
||||
|
@ -303,10 +303,10 @@ done
|
|||
|
||||
loadConfigFile
|
||||
|
||||
if [[ -n $numFullnodesRequested ]]; then
|
||||
truncatedNodeList=( "${fullnodeIpList[@]:0:$numFullnodesRequested}" )
|
||||
unset fullnodeIpList
|
||||
fullnodeIpList=( "${truncatedNodeList[@]}" )
|
||||
if [[ -n $numValidatorsRequested ]]; then
|
||||
truncatedNodeList=( "${validatorIpList[@]:0:$numValidatorsRequested}" )
|
||||
unset validatorIpList
|
||||
validatorIpList=( "${truncatedNodeList[@]}" )
|
||||
fi
|
||||
|
||||
numClients=${#clientIpList[@]}
|
||||
|
@ -401,7 +401,7 @@ startBootstrapLeader() {
|
|||
echo "--- Starting bootstrap leader: $ipAddress"
|
||||
echo "start log: $logFile"
|
||||
|
||||
# Deploy local binaries to bootstrap fullnode. Other fullnodes and clients later fetch the
|
||||
# Deploy local binaries to bootstrap validator. Other validators and clients later fetch the
|
||||
# binaries from it
|
||||
(
|
||||
set -x
|
||||
|
@ -429,7 +429,7 @@ startBootstrapLeader() {
|
|||
$deployMethod \
|
||||
bootstrap-leader \
|
||||
$entrypointIp \
|
||||
$((${#fullnodeIpList[@]} + ${#blockstreamerIpList[@]} + ${#archiverIpList[@]})) \
|
||||
$((${#validatorIpList[@]} + ${#blockstreamerIpList[@]} + ${#archiverIpList[@]})) \
|
||||
\"$RUST_LOG\" \
|
||||
$skipSetup \
|
||||
$failOnValidatorBootupFailure \
|
||||
|
@ -455,7 +455,7 @@ startNode() {
|
|||
declare ipAddress=$1
|
||||
declare nodeType=$2
|
||||
declare nodeIndex="$3"
|
||||
declare logFile="$netLogDir/fullnode-$ipAddress.log"
|
||||
declare logFile="$netLogDir/validator-$ipAddress.log"
|
||||
|
||||
if [[ -z $nodeType ]]; then
|
||||
echo nodeType not specified
|
||||
|
@ -494,7 +494,7 @@ startNode() {
|
|||
$deployMethod \
|
||||
$nodeType \
|
||||
$entrypointIp \
|
||||
$((${#fullnodeIpList[@]} + ${#blockstreamerIpList[@]} + ${#archiverIpList[@]})) \
|
||||
$((${#validatorIpList[@]} + ${#blockstreamerIpList[@]} + ${#archiverIpList[@]})) \
|
||||
\"$RUST_LOG\" \
|
||||
$skipSetup \
|
||||
$failOnValidatorBootupFailure \
|
||||
|
@ -511,7 +511,7 @@ startNode() {
|
|||
"
|
||||
) >> "$logFile" 2>&1 &
|
||||
declare pid=$!
|
||||
ln -sf "fullnode-$ipAddress.log" "$netLogDir/fullnode-$pid.log"
|
||||
ln -sf "validator-$ipAddress.log" "$netLogDir/validator-$pid.log"
|
||||
pids+=("$pid")
|
||||
}
|
||||
|
||||
|
@ -541,7 +541,7 @@ sanity() {
|
|||
$metricsWriteDatapoint "testnet-deploy net-sanity-begin=1"
|
||||
|
||||
declare ok=true
|
||||
declare bootstrapLeader=${fullnodeIpList[0]}
|
||||
declare bootstrapLeader=${validatorIpList[0]}
|
||||
declare blockstreamer=${blockstreamerIpList[0]}
|
||||
|
||||
annotateBlockexplorerUrl
|
||||
|
@ -581,7 +581,7 @@ deployUpdate() {
|
|||
fi
|
||||
|
||||
declare ok=true
|
||||
declare bootstrapLeader=${fullnodeIpList[0]}
|
||||
declare bootstrapLeader=${validatorIpList[0]}
|
||||
|
||||
for updatePlatform in $updatePlatforms; do
|
||||
echo "--- Deploying solana-install update: $updatePlatform"
|
||||
|
@ -610,7 +610,7 @@ getNodeType() {
|
|||
nodeIndex=0 # <-- global
|
||||
nodeType=validator # <-- global
|
||||
|
||||
for ipAddress in "${fullnodeIpList[@]}" b "${blockstreamerIpList[@]}" r "${archiverIpList[@]}"; do
|
||||
for ipAddress in "${validatorIpList[@]}" b "${blockstreamerIpList[@]}" r "${archiverIpList[@]}"; do
|
||||
if [[ $ipAddress = b ]]; then
|
||||
nodeType=blockstreamer
|
||||
continue
|
||||
|
@ -673,7 +673,7 @@ prepare_deploy() {
|
|||
echo "Fetching current software version"
|
||||
(
|
||||
set -x
|
||||
rsync -vPrc -e "ssh ${sshOptions[*]}" "${fullnodeIpList[0]}":~/version.yml current-version.yml
|
||||
rsync -vPrc -e "ssh ${sshOptions[*]}" "${validatorIpList[0]}":~/version.yml current-version.yml
|
||||
)
|
||||
cat current-version.yml
|
||||
if ! diff -q current-version.yml "$SOLANA_ROOT"/solana-release/version.yml; then
|
||||
|
@ -690,7 +690,7 @@ deploy() {
|
|||
$metricsWriteDatapoint "testnet-deploy net-start-begin=1"
|
||||
|
||||
declare bootstrapLeader=true
|
||||
for nodeAddress in "${fullnodeIpList[@]}" "${blockstreamerIpList[@]}" "${archiverIpList[@]}"; do
|
||||
for nodeAddress in "${validatorIpList[@]}" "${blockstreamerIpList[@]}" "${archiverIpList[@]}"; do
|
||||
nodeType=
|
||||
nodeIndex=
|
||||
getNodeType
|
||||
|
@ -721,8 +721,8 @@ deploy() {
|
|||
declare ok=true
|
||||
wait "$pid" || ok=false
|
||||
if ! $ok; then
|
||||
echo "+++ fullnode failed to start"
|
||||
cat "$netLogDir/fullnode-$pid.log"
|
||||
echo "+++ validator failed to start"
|
||||
cat "$netLogDir/validator-$pid.log"
|
||||
if $failOnValidatorBootupFailure; then
|
||||
exit 1
|
||||
else
|
||||
|
@ -731,7 +731,7 @@ deploy() {
|
|||
fi
|
||||
done
|
||||
|
||||
$metricsWriteDatapoint "testnet-deploy net-fullnodes-started=1"
|
||||
$metricsWriteDatapoint "testnet-deploy net-validators-started=1"
|
||||
additionalNodeDeployTime=$SECONDS
|
||||
|
||||
annotateBlockexplorerUrl
|
||||
|
@ -775,7 +775,7 @@ deploy() {
|
|||
echo
|
||||
echo "+++ Deployment Successful"
|
||||
echo "Bootstrap leader deployment took $bootstrapNodeDeployTime seconds"
|
||||
echo "Additional fullnode deployment (${#fullnodeIpList[@]} full nodes, ${#blockstreamerIpList[@]} blockstreamer nodes, ${#archiverIpList[@]} archivers) took $additionalNodeDeployTime seconds"
|
||||
echo "Additional validator deployment (${#validatorIpList[@]} validators, ${#blockstreamerIpList[@]} blockstreamer nodes, ${#archiverIpList[@]} archivers) took $additionalNodeDeployTime seconds"
|
||||
echo "Client deployment (${#clientIpList[@]} instances) took $clientDeployTime seconds"
|
||||
echo "Network start logs in $netLogDir"
|
||||
}
|
||||
|
@ -784,7 +784,7 @@ deploy() {
|
|||
stopNode() {
|
||||
local ipAddress=$1
|
||||
local block=$2
|
||||
declare logFile="$netLogDir/stop-fullnode-$ipAddress.log"
|
||||
declare logFile="$netLogDir/stop-validator-$ipAddress.log"
|
||||
echo "--- Stopping node: $ipAddress"
|
||||
echo "stop log: $logFile"
|
||||
(
|
||||
|
@ -807,7 +807,7 @@ stopNode() {
|
|||
) >> "$logFile" 2>&1 &
|
||||
|
||||
declare pid=$!
|
||||
ln -sf "stop-fullnode-$ipAddress.log" "$netLogDir/stop-fullnode-$pid.log"
|
||||
ln -sf "stop-validator-$ipAddress.log" "$netLogDir/stop-validator-$pid.log"
|
||||
if $block; then
|
||||
wait $pid
|
||||
else
|
||||
|
@ -821,7 +821,7 @@ stop() {
|
|||
|
||||
declare loopCount=0
|
||||
pids=()
|
||||
for ipAddress in "${fullnodeIpList[@]}" "${blockstreamerIpList[@]}" "${archiverIpList[@]}" "${clientIpList[@]}"; do
|
||||
for ipAddress in "${validatorIpList[@]}" "${blockstreamerIpList[@]}" "${archiverIpList[@]}" "${clientIpList[@]}"; do
|
||||
stopNode "$ipAddress" false
|
||||
|
||||
# Stagger additional node stop time to avoid too many concurrent ssh
|
||||
|
@ -842,13 +842,13 @@ stop() {
|
|||
|
||||
|
||||
checkPremptibleInstances() {
|
||||
# The fullnodeIpList nodes may be preemptible instances that can disappear at
|
||||
# any time. Try to detect when a fullnode has been preempted to help the user
|
||||
# The validatorIpList nodes may be preemptible instances that can disappear at
|
||||
# any time. Try to detect when a validator has been preempted to help the user
|
||||
# out.
|
||||
#
|
||||
# Of course this isn't airtight as an instance could always disappear
|
||||
# immediately after its successfully pinged.
|
||||
for ipAddress in "${fullnodeIpList[@]}"; do
|
||||
for ipAddress in "${validatorIpList[@]}"; do
|
||||
(
|
||||
set -x
|
||||
timeout 5s ping -c 1 "$ipAddress" | tr - _
|
||||
|
@ -913,18 +913,18 @@ logs)
|
|||
"$ipAddress":solana/"$log".log "$netLogDir"/remote-"$log"-"$ipAddress".log
|
||||
) || echo "failed to fetch log"
|
||||
}
|
||||
fetchRemoteLog "${fullnodeIpList[0]}" drone
|
||||
for ipAddress in "${fullnodeIpList[@]}"; do
|
||||
fetchRemoteLog "$ipAddress" fullnode
|
||||
fetchRemoteLog "${validatorIpList[0]}" drone
|
||||
for ipAddress in "${validatorIpList[@]}"; do
|
||||
fetchRemoteLog "$ipAddress" validator
|
||||
done
|
||||
for ipAddress in "${clientIpList[@]}"; do
|
||||
fetchRemoteLog "$ipAddress" client
|
||||
done
|
||||
for ipAddress in "${blockstreamerIpList[@]}"; do
|
||||
fetchRemoteLog "$ipAddress" fullnode
|
||||
fetchRemoteLog "$ipAddress" validator
|
||||
done
|
||||
for ipAddress in "${archiverIpList[@]}"; do
|
||||
fetchRemoteLog "$ipAddress" fullnode
|
||||
fetchRemoteLog "$ipAddress" validator
|
||||
done
|
||||
;;
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#!/usr/bin/env bash
|
||||
set -e
|
||||
#
|
||||
# This script is to be run on the bootstrap full node
|
||||
# This script is to be run on the bootstrap validator
|
||||
#
|
||||
|
||||
cd "$(dirname "$0")"/../..
|
||||
|
|
|
@ -72,7 +72,7 @@ cd ~/solana
|
|||
source scripts/oom-score-adj.sh
|
||||
|
||||
now=\$(date -u +"%Y-%m-%dT%H:%M:%SZ")
|
||||
ln -sfT fullnode.log.\$now fullnode.log
|
||||
ln -sfT validator.log.\$now validator.log
|
||||
EOF
|
||||
chmod +x ~/solana/on-reboot
|
||||
echo "@reboot ~/solana/on-reboot" | crontab -
|
||||
|
@ -155,11 +155,11 @@ EOF
|
|||
setup_secondary_mount
|
||||
|
||||
if [[ -n $internalNodesLamports ]]; then
|
||||
echo "---" >> config/fullnode-balances.yml
|
||||
echo "---" >> config/validator-balances.yml
|
||||
for i in $(seq 0 "$numNodes"); do
|
||||
solana-keygen new -o config/fullnode-"$i"-identity.json
|
||||
pubkey="$(solana-keygen pubkey config/fullnode-"$i"-identity.json)"
|
||||
cat >> config/fullnode-balances.yml <<EOF
|
||||
solana-keygen new -o config/validator-"$i"-identity.json
|
||||
pubkey="$(solana-keygen pubkey config/validator-"$i"-identity.json)"
|
||||
cat >> config/validator-balances.yml <<EOF
|
||||
$pubkey:
|
||||
balance: $internalNodesLamports
|
||||
owner: 11111111111111111111111111111111
|
||||
|
@ -195,10 +195,10 @@ EOF
|
|||
echo "" >> config/client-accounts.yml
|
||||
done
|
||||
if [[ -f $externalPrimordialAccountsFile ]]; then
|
||||
cat "$externalPrimordialAccountsFile" >> config/fullnode-balances.yml
|
||||
cat "$externalPrimordialAccountsFile" >> config/validator-balances.yml
|
||||
fi
|
||||
if [[ -f config/fullnode-balances.yml ]]; then
|
||||
genesisOptions+=" --primordial-accounts-file config/fullnode-balances.yml"
|
||||
if [[ -f config/validator-balances.yml ]]; then
|
||||
genesisOptions+=" --primordial-accounts-file config/validator-balances.yml"
|
||||
fi
|
||||
if [[ -f config/client-accounts.yml ]]; then
|
||||
genesisOptions+=" --primordial-keypairs-file config/client-accounts.yml"
|
||||
|
@ -228,7 +228,7 @@ EOF
|
|||
args+=($extraNodeArgs)
|
||||
|
||||
cat >> ~/solana/on-reboot <<EOF
|
||||
nohup ./multinode-demo/bootstrap-leader.sh ${args[@]} > fullnode.log.\$now 2>&1 &
|
||||
nohup ./multinode-demo/bootstrap-leader.sh ${args[@]} > validator.log.\$now 2>&1 &
|
||||
pid=\$!
|
||||
oom_score_adj "\$pid" 1000
|
||||
disown
|
||||
|
@ -251,7 +251,7 @@ EOF
|
|||
clear_config_dir "$SOLANA_CONFIG_DIR"
|
||||
setup_secondary_mount
|
||||
[[ -z $internalNodesLamports ]] || net/scripts/rsync-retry.sh -vPrc \
|
||||
"$entrypointIp":~/solana/config/fullnode-"$nodeIndex"-identity.json config/fullnode-identity.json
|
||||
"$entrypointIp":~/solana/config/validator-"$nodeIndex"-identity.json config/validator-identity.json
|
||||
fi
|
||||
|
||||
args=(
|
||||
|
@ -271,10 +271,10 @@ EOF
|
|||
fi
|
||||
fi
|
||||
|
||||
if [[ ! -f config/fullnode-identity.json ]]; then
|
||||
solana-keygen new -o config/fullnode-identity.json
|
||||
if [[ ! -f config/validator-identity.json ]]; then
|
||||
solana-keygen new -o config/validator-identity.json
|
||||
fi
|
||||
args+=(--identity config/fullnode-identity.json)
|
||||
args+=(--identity config/validator-identity.json)
|
||||
|
||||
if [[ $airdropsEnabled != true ]]; then
|
||||
args+=(--no-airdrop)
|
||||
|
@ -337,7 +337,7 @@ EOF
|
|||
# shellcheck disable=SC2206 # Don't want to double quote $extraNodeArgs
|
||||
args+=($extraNodeArgs)
|
||||
cat >> ~/solana/on-reboot <<EOF
|
||||
nohup multinode-demo/validator.sh ${args[@]} > fullnode.log.\$now 2>&1 &
|
||||
nohup multinode-demo/validator.sh ${args[@]} > validator.log.\$now 2>&1 &
|
||||
pid=\$!
|
||||
oom_score_adj "\$pid" 1000
|
||||
disown
|
||||
|
@ -354,8 +354,8 @@ EOF
|
|||
if [[ $airdropsEnabled != true ]]; then
|
||||
args+=(--no-airdrop)
|
||||
fi
|
||||
if [[ -f config/fullnode-identity.json ]]; then
|
||||
args+=(--keypair config/fullnode-identity.json)
|
||||
if [[ -f config/validator-identity.json ]]; then
|
||||
args+=(--keypair config/validator-identity.json)
|
||||
fi
|
||||
|
||||
multinode-demo/delegate-stake.sh "${args[@]}"
|
||||
|
@ -363,7 +363,7 @@ EOF
|
|||
|
||||
if [[ $skipSetup != true ]]; then
|
||||
solana --url http://"$entrypointIp":8899 \
|
||||
--keypair config/fullnode-identity.json \
|
||||
--keypair config/validator-identity.json \
|
||||
validator-info publish "$(hostname)" -n team/solana --force || true
|
||||
fi
|
||||
;;
|
||||
|
@ -384,7 +384,7 @@ EOF
|
|||
fi
|
||||
|
||||
cat >> ~/solana/on-reboot <<EOF
|
||||
nohup multinode-demo/archiver.sh ${args[@]} > fullnode.log.\$now 2>&1 &
|
||||
nohup multinode-demo/archiver.sh ${args[@]} > validator.log.\$now 2>&1 &
|
||||
pid=\$!
|
||||
oom_score_adj "\$pid" 1000
|
||||
disown
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#!/usr/bin/env bash
|
||||
set -e
|
||||
#
|
||||
# This script is to be run on the bootstrap full node
|
||||
# This script is to be run on the bootstrap validator
|
||||
#
|
||||
|
||||
cd "$(dirname "$0")"/../..
|
||||
|
|
|
@ -180,7 +180,7 @@ colo_node_status_all() {
|
|||
|
||||
# TODO: As part of COLO_TOOD_PARALLELIZE this list will need to be maintained
|
||||
# in a lockfile to work around `cloud_CreateInstance` being called in the
|
||||
# background for fullnodes
|
||||
# background for validators
|
||||
export COLO_RES_REQUISITIONED=()
|
||||
colo_node_requisition() {
|
||||
declare IP=$1
|
||||
|
|
10
net/ssh.sh
10
net/ssh.sh
|
@ -49,9 +49,9 @@ printNode() {
|
|||
printf " %-25s | For logs run: $0 $ip tail -f solana/$nodeType.log\n" "$0 $ip"
|
||||
}
|
||||
|
||||
echo Full nodes:
|
||||
for ipAddress in "${fullnodeIpList[@]}"; do
|
||||
printNode fullnode "$ipAddress"
|
||||
echo Validators:
|
||||
for ipAddress in "${validatorIpList[@]}"; do
|
||||
printNode validator "$ipAddress"
|
||||
done
|
||||
echo
|
||||
echo Clients:
|
||||
|
@ -68,7 +68,7 @@ if [[ ${#blockstreamerIpList[@]} -eq 0 ]]; then
|
|||
echo " None"
|
||||
else
|
||||
for ipAddress in "${blockstreamerIpList[@]}"; do
|
||||
printNode fullnode "$ipAddress"
|
||||
printNode validator "$ipAddress"
|
||||
done
|
||||
fi
|
||||
echo
|
||||
|
@ -77,7 +77,7 @@ if [[ ${#archiverIpList[@]} -eq 0 ]]; then
|
|||
echo " None"
|
||||
else
|
||||
for ipAddress in "${archiverIpList[@]}"; do
|
||||
printNode fullnode "$ipAddress"
|
||||
printNode validator "$ipAddress"
|
||||
done
|
||||
fi
|
||||
echo
|
||||
|
|
Loading…
Reference in New Issue