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