Use a local user to avoid GCP login quota limits

This commit is contained in:
Michael Vines 2018-08-02 16:12:25 -07:00
parent f570ef1c66
commit a7204d5353
1 changed files with 46 additions and 43 deletions

View File

@ -71,7 +71,7 @@ echo "Install command: $SNAP_INSTALL_CMD"
leaderName=${publicUrl//./-} leaderName=${publicUrl//./-}
vmlist=() # Each array element is the triple "class:vmName:vmZone" vmlist=() # Each array element is formatted as "class:vmName:vmZone:vmPublicIp"
# #
# vm_foreach [cmd] [extra args to cmd] # vm_foreach [cmd] [extra args to cmd]
@ -81,6 +81,7 @@ vmlist=() # Each array element is the triple "class:vmName:vmZone"
# additionl arguments supplied to vm_foreach: # additionl arguments supplied to vm_foreach:
# vmName - GCP name of the VM # vmName - GCP name of the VM
# vmZone - The GCP zone the VM is located in # vmZone - The GCP zone the VM is located in
# vmPublicIp - The public IP address of this VM
# vmClass - The 'class' of this VM # vmClass - The 'class' of this VM
# count - Monotonically increasing count for each # count - Monotonically increasing count for each
# invocation of cmd, starting at 1 # invocation of cmd, starting at 1
@ -93,10 +94,10 @@ vm_foreach() {
declare count=1 declare count=1
for info in "${vmlist[@]}"; do for info in "${vmlist[@]}"; do
declare vmClass vmName vmZone declare vmClass vmName vmZone vmPublicIp
IFS=: read -r vmClass vmName vmZone < <(echo "$info") IFS=: read -r vmClass vmName vmZone vmPublicIp < <(echo "$info")
eval "$cmd" "$vmName" "$vmZone" "$vmClass" "$count" "$@" eval "$cmd" "$vmName" "$vmZone" "$vmPublicIp" "$vmClass" "$count" "$@"
count=$((count + 1)) count=$((count + 1))
done done
} }
@ -109,6 +110,7 @@ vm_foreach() {
# The command will receive three arguments: # The command will receive three arguments:
# vmName - GCP name of the VM # vmName - GCP name of the VM
# vmZone - The GCP zone the VM is located in # vmZone - The GCP zone the VM is located in
# vmPublicIp - The public IP address of this VM
# count - Monotonically increasing count for each # count - Monotonically increasing count for each
# invocation of cmd, starting at 1 # invocation of cmd, starting at 1
# #
@ -116,12 +118,13 @@ vm_foreach() {
_run_cmd_if_class() { _run_cmd_if_class() {
declare vmName=$1 declare vmName=$1
declare vmZone=$2 declare vmZone=$2
declare vmClass=$3 declare vmPublicIp=$3
declare count=$4 declare vmClass=$4
declare class=$5 declare count=$5
declare cmd=$6 declare class=$6
declare cmd=$7
if [[ $class = "$vmClass" ]]; then if [[ $class = "$vmClass" ]]; then
eval "$cmd" "$vmName" "$vmZone" "$count" eval "$cmd" "$vmName" "$vmZone" "$vmPublicIp" "$count"
fi fi
} }
@ -138,13 +141,15 @@ findVms() {
declare class="$1" declare class="$1"
declare filter="$2" declare filter="$2"
gcloud compute instances list --filter="$filter" gcloud compute instances list --filter="$filter"
while read -r vmName vmZone status; do while read -r vmName vmZone vmPublicIp status; do
if [[ $status != RUNNING ]]; then if [[ $status != RUNNING ]]; then
echo "Warning: $vmName is not RUNNING, ignoring it." echo "Warning: $vmName is not RUNNING, ignoring it."
continue continue
fi fi
vmlist+=("$class:$vmName:$vmZone") vmlist+=("$class:$vmName:$vmZone:$vmPublicIp")
done < <(gcloud compute instances list --filter="$filter" --format 'value(name,zone,status)') done < <(gcloud compute instances list \
--filter="$filter" \
--format 'value(name,zone,networkInterfaces[0].accessConfigs[0].natIP,status)')
} }
echo "Leader node:" echo "Leader node:"
@ -174,31 +179,25 @@ netName=${SOLANA_NET_URL/.*/}
gcp_vm_exec() { gcp_vm_exec() {
declare vmName=$1 declare vmName=$1
declare vmZone=$2 declare vmZone=$2
declare message=$3 declare vmPublicIp=$3
declare cmd=$4 declare message=$4
declare cmd=$5
echo "--- $message $vmName in zone $vmZone" echo "--- $message $vmName in zone $vmZone ($vmPublicIp)"
gcloud compute ssh "$vmName" --zone "$vmZone" \ (
--ssh-flag="-o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null" \ set -x
--command="$cmd" ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null \
} testnet-deploy@"$vmPublicIp" "$cmd"
)
gcp_login_quota_workaround() {
declare count=$1
if [[ $((count % 5)) = 0 ]]; then
# Slow down deployment to avoid triggering GCP login
# quota limits (each |ssh| counts as a login)
sleep 3
fi
} }
client_start() { client_start() {
declare vmName=$1 declare vmName=$1
declare vmZone=$2 declare vmZone=$2
declare count=$3 declare vmPublicIp=$3
declare count=$4
gcp_vm_exec "$vmName" "$vmZone" \ gcp_vm_exec "$vmName" "$vmZone" "$vmPublicIp" \
"Starting client $count:" \ "Starting client $count:" \
"\ "\
set -x; set -x;
@ -208,7 +207,8 @@ client_start() {
if [[ \$threadCount -gt 4 ]]; then threadCount=4; fi; \ if [[ \$threadCount -gt 4 ]]; then threadCount=4; fi; \
tmux kill-session -t solana; \ tmux kill-session -t solana; \
tmux new -s solana -d \" \ tmux new -s solana -d \" \
set -x; set -x; \
sudo rm /tmp/solana.log; \
/snap/bin/solana.bench-tps $SOLANA_NET_URL $fullnode_count --loop -s 600 --sustained -t \$threadCount 2>&1 | tee /tmp/solana.log; \ /snap/bin/solana.bench-tps $SOLANA_NET_URL $fullnode_count --loop -s 600 --sustained -t \$threadCount 2>&1 | tee /tmp/solana.log; \
echo 'https://metrics.solana.com:8086/write?db=${INFLUX_DATABASE}&u=${INFLUX_USERNAME}&p=${INFLUX_PASSWORD}' \ echo 'https://metrics.solana.com:8086/write?db=${INFLUX_DATABASE}&u=${INFLUX_USERNAME}&p=${INFLUX_PASSWORD}' \
| xargs curl --max-time 5 -XPOST --data-binary 'testnet-deploy,name=$netName clientexit=1'; \ | xargs curl --max-time 5 -XPOST --data-binary 'testnet-deploy,name=$netName clientexit=1'; \
@ -224,12 +224,13 @@ client_start() {
client_stop() { client_stop() {
declare vmName=$1 declare vmName=$1
declare vmZone=$2 declare vmZone=$2
declare count=$3 declare vmPublicIp=$3
declare count=$4
( (
SECONDS=0 SECONDS=0
gcp_vm_exec "$vmName" "$vmZone" \ gcp_vm_exec "$vmName" "$vmZone" "$vmPublicIp" \
"Stopping client $count:" \ "Stopping client $vmName ($count):" \
"\ "\
set -x; set -x;
tmux list-sessions; \ tmux list-sessions; \
@ -257,7 +258,8 @@ fullnode_start() {
declare class=$1 declare class=$1
declare vmName=$2 declare vmName=$2
declare vmZone=$3 declare vmZone=$3
declare count=$4 declare vmPublicIp=$4
declare count=$5
( (
SECONDS=0 SECONDS=0
@ -275,7 +277,7 @@ fullnode_start() {
nodeConfig="mode=validator leader-address=$publicIp $commonNodeConfig" nodeConfig="mode=validator leader-address=$publicIp $commonNodeConfig"
fi fi
gcp_vm_exec "$vmName" "$vmZone" "Starting $class $count:" \ gcp_vm_exec "$vmName" "$vmZone" "$vmPublicIp" "Starting $class $count:" \
"\ "\
set -ex; \ set -ex; \
logmarker='solana deploy $(date)/$RANDOM'; \ logmarker='solana deploy $(date)/$RANDOM'; \
@ -298,7 +300,6 @@ fullnode_start() {
done done
mv "log-$vmName.txt" "log-$pid.txt" mv "log-$vmName.txt" "log-$pid.txt"
gcp_login_quota_workaround "$count"
pids+=("$pid") pids+=("$pid")
} }
@ -313,11 +314,12 @@ validator_start() {
fullnode_stop() { fullnode_stop() {
declare vmName=$1 declare vmName=$1
declare vmZone=$2 declare vmZone=$2
declare count=$3 declare vmPublicIp=$3
declare count=$4
( (
SECONDS=0 SECONDS=0
gcp_vm_exec "$vmName" "$vmZone" "Shutting down" "\ gcp_vm_exec "$vmName" "$vmZone" "$vmPublicIp" "Shutting down" "\
if snap list solana; then \ if snap list solana; then \
sudo snap set solana mode=; \ sudo snap set solana mode=; \
fi" fi"
@ -331,7 +333,6 @@ fullnode_stop() {
done done
mv "log-$vmName.txt" "log-$pid.txt" mv "log-$vmName.txt" "log-$pid.txt"
gcp_login_quota_workaround "$count"
pids+=("$pid") pids+=("$pid")
} }
@ -355,12 +356,14 @@ if [[ -n $LOCAL_SNAP ]]; then
transfer_local_snap() { transfer_local_snap() {
declare vmName=$1 declare vmName=$1
declare vmZone=$2 declare vmZone=$2
declare vmClass=$3 declare vmPublicIp=$3
declare count=$4 declare vmClass=$4
declare count=$5
echo "--- $vmName in zone $vmZone ($count)" echo "--- $vmName in zone $vmZone ($count)"
SECONDS=0 SECONDS=0
gcloud compute scp --zone "$vmZone" "$LOCAL_SNAP" "$vmName":solana_local.snap scp -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null \
"$LOCAL_SNAP" testnet-deploy@"$vmPublicIp":solana_local.snap
echo "Succeeded in ${SECONDS} seconds" echo "Succeeded in ${SECONDS} seconds"
} }
vm_foreach transfer_local_snap vm_foreach transfer_local_snap