| 
									
										
										
										
											2018-06-24 10:10:55 -07:00
										 |  |  | # |source| this file | 
					
						
							|  |  |  | # | 
					
						
							| 
									
										
										
										
											2018-08-27 09:13:53 -07:00
										 |  |  | # Common utilities shared by other scripts in this directory | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # The following directive disable complaints about unused variables in this | 
					
						
							|  |  |  | # file: | 
					
						
							| 
									
										
										
										
											2018-06-24 10:10:55 -07:00
										 |  |  | # shellcheck disable=2034 | 
					
						
							| 
									
										
										
										
											2018-08-27 09:13:53 -07:00
										 |  |  | # | 
					
						
							| 
									
										
										
										
											2018-06-24 10:10:55 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-02 15:34:13 -07:00
										 |  |  | rsync=rsync | 
					
						
							| 
									
										
										
										
											2018-09-26 19:30:40 -07:00
										 |  |  | leader_logger="tee leader.log" | 
					
						
							|  |  |  | validator_logger="tee validator.log" | 
					
						
							|  |  |  | drone_logger="tee drone.log" | 
					
						
							| 
									
										
										
										
											2018-07-17 13:31:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-20 09:36:29 -07:00
										 |  |  | if [[ $(uname) != Linux ]]; then | 
					
						
							|  |  |  |   # Protect against unsupported configurations to prevent non-obvious errors | 
					
						
							|  |  |  |   # later. Arguably these should be fatal errors but for now prefer tolerance. | 
					
						
							|  |  |  |   if [[ -n $USE_SNAP ]]; then | 
					
						
							|  |  |  |     echo "Warning: Snap is not supported on $(uname)" | 
					
						
							|  |  |  |     USE_SNAP= | 
					
						
							|  |  |  |   fi | 
					
						
							|  |  |  |   if [[ -n $SOLANA_CUDA ]]; then | 
					
						
							|  |  |  |     echo "Warning: CUDA is not supported on $(uname)" | 
					
						
							|  |  |  |     SOLANA_CUDA= | 
					
						
							|  |  |  |   fi | 
					
						
							|  |  |  | fi | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if [[ -d $SNAP ]]; then # Running inside a Linux Snap? | 
					
						
							| 
									
										
										
										
											2018-06-24 10:10:55 -07:00
										 |  |  |   solana_program() { | 
					
						
							| 
									
										
										
										
											2018-06-26 18:30:17 -07:00
										 |  |  |     declare program="$1" | 
					
						
							| 
									
										
										
										
											2018-09-16 14:53:24 -06:00
										 |  |  |     printf "%s/command-%s.wrapper" "$SNAP" "$program" | 
					
						
							| 
									
										
										
										
											2018-06-24 10:10:55 -07:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2018-07-02 15:34:13 -07:00
										 |  |  |   rsync="$SNAP"/bin/rsync | 
					
						
							| 
									
										
										
										
											2018-07-27 22:40:21 -07:00
										 |  |  |   multilog="$SNAP/bin/multilog t s16777215 n200" | 
					
						
							| 
									
										
										
										
											2018-07-17 19:15:09 -07:00
										 |  |  |   leader_logger="$multilog $SNAP_DATA/leader" | 
					
						
							|  |  |  |   validator_logger="$multilog t $SNAP_DATA/validator" | 
					
						
							|  |  |  |   drone_logger="$multilog $SNAP_DATA/drone" | 
					
						
							| 
									
										
										
										
											2018-07-17 18:08:11 -07:00
										 |  |  |   # Create log directories manually to prevent multilog from creating them as | 
					
						
							|  |  |  |   # 0700 | 
					
						
							| 
									
										
										
										
											2018-07-17 19:20:35 -07:00
										 |  |  |   mkdir -p "$SNAP_DATA"/{drone,leader,validator} | 
					
						
							| 
									
										
										
										
											2018-07-17 13:31:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-20 09:36:29 -07:00
										 |  |  | elif [[ -n $USE_SNAP ]]; then # Use the Linux Snap binaries | 
					
						
							| 
									
										
										
										
											2018-06-26 16:05:02 -07:00
										 |  |  |   solana_program() { | 
					
						
							| 
									
										
										
										
											2018-06-26 18:30:17 -07:00
										 |  |  |     declare program="$1" | 
					
						
							| 
									
										
										
										
											2018-06-26 16:05:02 -07:00
										 |  |  |     printf "solana.%s" "$program" | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2018-07-20 09:36:29 -07:00
										 |  |  | elif [[ -n $USE_INSTALL ]]; then # Assume |cargo install| was run | 
					
						
							| 
									
										
										
										
											2018-06-24 10:10:55 -07:00
										 |  |  |   solana_program() { | 
					
						
							| 
									
										
										
										
											2018-06-26 18:30:17 -07:00
										 |  |  |     declare program="$1" | 
					
						
							| 
									
										
										
										
											2018-06-24 10:10:55 -07:00
										 |  |  |     printf "solana-%s" "$program" | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2018-06-26 16:05:02 -07:00
										 |  |  |   # CUDA was/wasn't selected at build time, can't affect CUDA state here | 
					
						
							|  |  |  |   unset SOLANA_CUDA | 
					
						
							| 
									
										
										
										
											2018-06-24 10:10:55 -07:00
										 |  |  | else | 
					
						
							|  |  |  |   solana_program() { | 
					
						
							| 
									
										
										
										
											2018-06-26 18:30:17 -07:00
										 |  |  |     declare program="$1" | 
					
						
							|  |  |  |     declare features="" | 
					
						
							| 
									
										
										
										
											2018-06-24 10:10:55 -07:00
										 |  |  |     if [[ "$program" =~ ^(.*)-cuda$ ]]; then | 
					
						
							|  |  |  |       program=${BASH_REMATCH[1]} | 
					
						
							| 
									
										
										
										
											2018-07-16 07:42:44 -07:00
										 |  |  |       features="--features=cuda" | 
					
						
							| 
									
										
										
										
											2018-06-24 10:10:55 -07:00
										 |  |  |     fi | 
					
						
							| 
									
										
										
										
											2018-07-20 09:36:29 -07:00
										 |  |  |     if [[ -z $DEBUG ]]; then | 
					
						
							| 
									
										
										
										
											2018-06-27 10:05:18 -07:00
										 |  |  |       maybe_release=--release | 
					
						
							|  |  |  |     fi | 
					
						
							|  |  |  |     printf "cargo run $maybe_release --bin solana-%s %s -- " "$program" "$features" | 
					
						
							| 
									
										
										
										
											2018-06-24 10:10:55 -07:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2018-07-14 16:50:21 +00:00
										 |  |  |   if [[ -n $SOLANA_CUDA ]]; then | 
					
						
							| 
									
										
										
										
											2018-07-19 11:56:40 -07:00
										 |  |  |     # shellcheck disable=2154 # 'here' is referenced but not assigned | 
					
						
							|  |  |  |     if [[ -z $here ]]; then | 
					
						
							|  |  |  |       echo "|here| is not defined" | 
					
						
							|  |  |  |       exit 1 | 
					
						
							|  |  |  |     fi | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-14 16:50:21 +00:00
										 |  |  |     # Locate perf libs downloaded by |./fetch-perf-libs.sh| | 
					
						
							| 
									
										
										
										
											2018-08-16 18:49:23 -07:00
										 |  |  |     LD_LIBRARY_PATH=$(cd "$here" && dirname "$PWD"/target/perf-libs):$LD_LIBRARY_PATH | 
					
						
							| 
									
										
										
										
											2018-07-14 16:50:21 +00:00
										 |  |  |     export LD_LIBRARY_PATH | 
					
						
							|  |  |  |   fi | 
					
						
							| 
									
										
										
										
											2018-06-24 10:10:55 -07:00
										 |  |  | fi | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-19 15:59:31 -04:00
										 |  |  | solana_bench_tps=$(solana_program bench-tps) | 
					
						
							| 
									
										
										
										
											2018-06-28 12:56:53 -06:00
										 |  |  | solana_wallet=$(solana_program wallet) | 
					
						
							| 
									
										
										
										
											2018-06-24 10:10:55 -07:00
										 |  |  | solana_drone=$(solana_program drone) | 
					
						
							|  |  |  | solana_fullnode=$(solana_program fullnode) | 
					
						
							|  |  |  | solana_fullnode_config=$(solana_program fullnode-config) | 
					
						
							|  |  |  | solana_fullnode_cuda=$(solana_program fullnode-cuda) | 
					
						
							| 
									
										
										
										
											2018-06-27 13:53:01 -06:00
										 |  |  | solana_genesis=$(solana_program genesis) | 
					
						
							| 
									
										
										
										
											2018-07-12 15:42:01 -06:00
										 |  |  | solana_keygen=$(solana_program keygen) | 
					
						
							| 
									
										
										
										
											2018-08-07 09:29:58 -07:00
										 |  |  | solana_ledger_tool=$(solana_program ledger-tool) | 
					
						
							| 
									
										
										
										
											2018-06-24 10:10:55 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | export RUST_LOG=${RUST_LOG:-solana=info} # if RUST_LOG is unset, default to info | 
					
						
							|  |  |  | export RUST_BACKTRACE=1 | 
					
						
							| 
									
										
										
										
											2018-07-02 17:35:28 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-08-27 10:23:22 -07:00
										 |  |  | # shellcheck source=scripts/configure-metrics.sh | 
					
						
							|  |  |  | source "$(dirname "${BASH_SOURCE[0]}")"/../scripts/configure-metrics.sh | 
					
						
							| 
									
										
										
										
											2018-07-07 08:34:31 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-02 17:35:28 -07:00
										 |  |  | tune_networking() { | 
					
						
							| 
									
										
										
										
											2018-08-03 10:05:46 -07:00
										 |  |  |   # Skip in CI | 
					
						
							|  |  |  |   [[ -z $CI ]] || return 0 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-04 14:17:42 -07:00
										 |  |  |   # Reference: https://medium.com/@CameronSparr/increase-os-udp-buffers-to-improve-performance-51d167bb1360 | 
					
						
							| 
									
										
										
										
											2018-07-15 12:25:32 -07:00
										 |  |  |   if [[ $(uname) = Linux ]]; then | 
					
						
							|  |  |  |     ( | 
					
						
							|  |  |  |       set -x +e | 
					
						
							|  |  |  |       # test the existence of the sysctls before trying to set them | 
					
						
							|  |  |  |       # go ahead and return true and don't exit if these calls fail | 
					
						
							|  |  |  |       sysctl net.core.rmem_max 2>/dev/null 1>/dev/null && | 
					
						
							| 
									
										
										
										
											2018-08-24 18:17:48 -07:00
										 |  |  |           sudo sysctl -w net.core.rmem_max=67108864 1>/dev/null 2>/dev/null | 
					
						
							| 
									
										
										
										
											2018-07-15 12:25:32 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |       sysctl net.core.rmem_default 2>/dev/null 1>/dev/null && | 
					
						
							|  |  |  |           sudo sysctl -w net.core.rmem_default=26214400 1>/dev/null 2>/dev/null | 
					
						
							| 
									
										
										
										
											2018-09-24 13:02:56 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |       sysctl net.core.wmem_max 2>/dev/null 1>/dev/null && | 
					
						
							|  |  |  |           sudo sysctl -w net.core.wmem_max=67108864 1>/dev/null 2>/dev/null | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       sysctl net.core.wmem_default 2>/dev/null 1>/dev/null && | 
					
						
							|  |  |  |           sudo sysctl -w net.core.wmem_default=26214400 1>/dev/null 2>/dev/null | 
					
						
							| 
									
										
										
										
											2018-07-15 12:25:32 -07:00
										 |  |  |     ) || true | 
					
						
							|  |  |  |   fi | 
					
						
							| 
									
										
										
										
											2018-08-03 15:17:17 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |   if [[ $(uname) = Darwin ]]; then | 
					
						
							|  |  |  |     ( | 
					
						
							|  |  |  |       if [[ $(sysctl net.inet.udp.maxdgram | cut -d\  -f2) != 65535 ]]; then | 
					
						
							|  |  |  |         echo "Adjusting maxdgram to allow for large UDP packets, see BLOB_SIZE in src/packet.rs:" | 
					
						
							|  |  |  |         set -x | 
					
						
							|  |  |  |         sudo sysctl net.inet.udp.maxdgram=65535 | 
					
						
							|  |  |  |       fi | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   fi | 
					
						
							| 
									
										
										
										
											2018-07-02 17:35:28 -07:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2018-06-24 10:10:55 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-08-07 10:23:38 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-08-10 11:27:36 -07:00
										 |  |  | SOLANA_CONFIG_DIR=${SNAP_DATA:-$PWD}/config | 
					
						
							|  |  |  | SOLANA_CONFIG_PRIVATE_DIR=${SNAP_DATA:-$PWD}/config-private | 
					
						
							|  |  |  | SOLANA_CONFIG_VALIDATOR_DIR=${SNAP_DATA:-$PWD}/config-validator | 
					
						
							|  |  |  | SOLANA_CONFIG_CLIENT_DIR=${SNAP_USER_DATA:-$PWD}/config-client | 
					
						
							| 
									
										
										
										
											2018-06-26 16:46:17 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | rsync_url() { # adds the 'rsync://` prefix to URLs that need it | 
					
						
							| 
									
										
										
										
											2018-06-26 18:30:17 -07:00
										 |  |  |   declare url="$1" | 
					
						
							| 
									
										
										
										
											2018-06-26 16:46:17 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-20 09:36:29 -07:00
										 |  |  |   if [[ $url =~ ^.*:.*$ ]]; then | 
					
						
							| 
									
										
										
										
											2018-06-26 16:46:17 -07:00
										 |  |  |     # assume remote-shell transport when colon is present, use $url unmodified | 
					
						
							|  |  |  |     echo "$url" | 
					
						
							| 
									
										
										
										
											2018-07-19 11:56:40 -07:00
										 |  |  |     return 0 | 
					
						
							| 
									
										
										
										
											2018-06-26 16:46:17 -07:00
										 |  |  |   fi | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-20 09:36:29 -07:00
										 |  |  |   if [[ -d $url ]]; then | 
					
						
							| 
									
										
										
										
											2018-06-26 16:46:17 -07:00
										 |  |  |     # assume local directory if $url is a valid directory, use $url unmodified | 
					
						
							|  |  |  |     echo "$url" | 
					
						
							| 
									
										
										
										
											2018-07-19 11:56:40 -07:00
										 |  |  |     return 0 | 
					
						
							| 
									
										
										
										
											2018-06-26 16:46:17 -07:00
										 |  |  |   fi | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   # Default to rsync:// URL | 
					
						
							|  |  |  |   echo "rsync://$url" | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2018-08-31 00:10:39 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | # called from drone, validator, client | 
					
						
							|  |  |  | find_leader() { | 
					
						
							|  |  |  |   declare leader leader_address | 
					
						
							|  |  |  |   declare shift=0 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if [[ -d $SNAP ]]; then | 
					
						
							| 
									
										
										
										
											2018-09-05 07:56:26 -07:00
										 |  |  |     if [[ -n $1 ]]; then | 
					
						
							|  |  |  |       usage "Error: unexpected parameter: $1" | 
					
						
							|  |  |  |     fi | 
					
						
							| 
									
										
										
										
											2018-08-31 00:10:39 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Select leader from the Snap configuration | 
					
						
							| 
									
										
										
										
											2018-08-31 11:40:05 -07:00
										 |  |  |     leader_ip=$(snapctl get leader-ip) | 
					
						
							|  |  |  |     if [[ -z $leader_ip ]]; then | 
					
						
							| 
									
										
										
										
											2018-09-06 11:41:35 -07:00
										 |  |  |       leader=testnet.solana.com | 
					
						
							|  |  |  |       leader_ip=$(dig +short "${leader%:*}" | head -n1) | 
					
						
							|  |  |  |       if [[ -z $leader_ip ]]; then | 
					
						
							|  |  |  |           usage "Error: unable to resolve IP address for $leader" | 
					
						
							|  |  |  |       fi | 
					
						
							| 
									
										
										
										
											2018-08-31 00:10:39 -07:00
										 |  |  |     fi | 
					
						
							| 
									
										
										
										
											2018-08-31 18:39:38 -07:00
										 |  |  |     leader=$leader_ip | 
					
						
							| 
									
										
										
										
											2018-08-31 12:34:06 -07:00
										 |  |  |     leader_address=$leader_ip:8001 | 
					
						
							| 
									
										
										
										
											2018-08-31 00:10:39 -07:00
										 |  |  |   else | 
					
						
							|  |  |  |     if [[ -z $1 ]]; then | 
					
						
							|  |  |  |       leader=${here}/..        # Default to local tree for rsync | 
					
						
							|  |  |  |       leader_address=127.0.0.1:8001 # Default to local leader | 
					
						
							|  |  |  |     elif [[ -z $2 ]]; then | 
					
						
							|  |  |  |       leader=$1 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       declare leader_ip | 
					
						
							|  |  |  |       leader_ip=$(dig +short "${leader%:*}" | head -n1) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       if [[ -z $leader_ip ]]; then | 
					
						
							|  |  |  |           usage "Error: unable to resolve IP address for $leader" | 
					
						
							|  |  |  |       fi | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-08-31 11:40:05 -07:00
										 |  |  |       leader_address=$leader_ip:8001 | 
					
						
							| 
									
										
										
										
											2018-08-31 00:10:39 -07:00
										 |  |  |       shift=1 | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |       leader=$1 | 
					
						
							|  |  |  |       leader_address=$2 | 
					
						
							|  |  |  |       shift=2 | 
					
						
							|  |  |  |     fi | 
					
						
							|  |  |  |   fi | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   echo "$leader" "$leader_address" "$shift" | 
					
						
							|  |  |  | } |