| 
									
										
										
										
											2018-06-24 10:10:55 -07:00
										 |  |  | # |source| this file | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # Disable complaints about unused variables in this file: | 
					
						
							|  |  |  | # shellcheck disable=2034 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-02 15:34:13 -07:00
										 |  |  | rsync=rsync | 
					
						
							| 
									
										
										
										
											2018-07-17 13:31:24 -07:00
										 |  |  | leader_logger="cat" | 
					
						
							|  |  |  | validator_logger="cat" | 
					
						
							|  |  |  | drone_logger="cat" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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-07-19 15:59:31 -04:00
										 |  |  |     if [[ "$program" = wallet || "$program" = bench-tps ]]; then | 
					
						
							| 
									
										
										
										
											2018-07-14 00:12:25 -07:00
										 |  |  |       # TODO: Merge wallet.sh/client.sh functionality into | 
					
						
							|  |  |  |       #       solana-wallet/solana-demo-client proper and remove this special case | 
					
						
							| 
									
										
										
										
											2018-07-13 23:37:56 -07:00
										 |  |  |       printf "%s/bin/solana-%s" "$SNAP" "$program" | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |       printf "%s/command-%s.wrapper" "$SNAP" "$program" | 
					
						
							|  |  |  |     fi | 
					
						
							| 
									
										
										
										
											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-07 08:34:31 -07:00
										 |  |  |   SOLANA_METRICS_CONFIG="$(snapctl get metrics-config)" | 
					
						
							| 
									
										
										
										
											2018-07-18 08:10:03 -07:00
										 |  |  |   SOLANA_DEFAULT_METRICS_RATE="$(snapctl get default-metrics-rate)" | 
					
						
							| 
									
										
										
										
											2018-07-24 15:12:03 -07:00
										 |  |  |   export SOLANA_DEFAULT_METRICS_RATE | 
					
						
							| 
									
										
										
										
											2018-06-24 10:10:55 -07:00
										 |  |  |   SOLANA_CUDA="$(snapctl get enable-cuda)" | 
					
						
							| 
									
										
										
										
											2018-07-16 17:38:51 -07:00
										 |  |  |   RUST_LOG="$(snapctl get rust-log)" | 
					
						
							| 
									
										
										
										
											2018-06-26 16:05:02 -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| | 
					
						
							|  |  |  |     LD_LIBRARY_PATH=$(cd "$here" && dirname "$PWD"):$LD_LIBRARY_PATH | 
					
						
							|  |  |  |     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-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-07-07 08:34:31 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | # The SOLANA_METRICS_CONFIG environment variable is formatted as a | 
					
						
							|  |  |  | # comma-delimited list of parameters. All parameters are optional. | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # Example: | 
					
						
							|  |  |  | #   export SOLANA_METRICS_CONFIG="host=<metrics host>,db=<database name>,u=<username>,p=<password>" | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | configure_metrics() { | 
					
						
							| 
									
										
										
										
											2018-07-19 11:56:40 -07:00
										 |  |  |   [[ -n $SOLANA_METRICS_CONFIG ]] || return 0 | 
					
						
							| 
									
										
										
										
											2018-07-07 08:34:31 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |   declare metrics_params | 
					
						
							|  |  |  |   IFS=',' read -r -a metrics_params <<< "$SOLANA_METRICS_CONFIG" | 
					
						
							|  |  |  |   for param in "${metrics_params[@]}"; do | 
					
						
							|  |  |  |     IFS='=' read -r -a pair <<< "$param" | 
					
						
							| 
									
										
										
										
											2018-07-20 09:36:29 -07:00
										 |  |  |     if [[ ${#pair[@]} != 2 ]]; then | 
					
						
							| 
									
										
										
										
											2018-07-14 21:22:14 -07:00
										 |  |  |       echo Error: invalid metrics parameter: "$param" >&2 | 
					
						
							| 
									
										
										
										
											2018-07-07 08:34:31 -07:00
										 |  |  |     else | 
					
						
							|  |  |  |       declare name="${pair[0]}" | 
					
						
							|  |  |  |       declare value="${pair[1]}" | 
					
						
							|  |  |  |       case "$name" in | 
					
						
							|  |  |  |       host) | 
					
						
							|  |  |  |         export INFLUX_HOST="$value" | 
					
						
							| 
									
										
										
										
											2018-07-14 21:22:14 -07:00
										 |  |  |         echo INFLUX_HOST="$INFLUX_HOST" >&2 | 
					
						
							| 
									
										
										
										
											2018-07-07 08:34:31 -07:00
										 |  |  |         ;; | 
					
						
							|  |  |  |       db) | 
					
						
							|  |  |  |         export INFLUX_DATABASE="$value" | 
					
						
							| 
									
										
										
										
											2018-07-14 21:22:14 -07:00
										 |  |  |         echo INFLUX_DATABASE="$INFLUX_DATABASE" >&2 | 
					
						
							| 
									
										
										
										
											2018-07-07 08:34:31 -07:00
										 |  |  |         ;; | 
					
						
							|  |  |  |       u) | 
					
						
							|  |  |  |         export INFLUX_USERNAME="$value" | 
					
						
							| 
									
										
										
										
											2018-07-14 21:22:14 -07:00
										 |  |  |         echo INFLUX_USERNAME="$INFLUX_USERNAME" >&2 | 
					
						
							| 
									
										
										
										
											2018-07-07 08:34:31 -07:00
										 |  |  |         ;; | 
					
						
							|  |  |  |       p) | 
					
						
							|  |  |  |         export INFLUX_PASSWORD="$value" | 
					
						
							| 
									
										
										
										
											2018-07-14 21:22:14 -07:00
										 |  |  |         echo INFLUX_PASSWORD="********" >&2 | 
					
						
							| 
									
										
										
										
											2018-07-07 08:34:31 -07:00
										 |  |  |         ;; | 
					
						
							|  |  |  |       *) | 
					
						
							| 
									
										
										
										
											2018-07-14 21:22:14 -07:00
										 |  |  |         echo Error: Unknown metrics parameter name: "$name" >&2 | 
					
						
							| 
									
										
										
										
											2018-07-07 08:34:31 -07:00
										 |  |  |         ;; | 
					
						
							|  |  |  |       esac | 
					
						
							|  |  |  |     fi | 
					
						
							|  |  |  |   done | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | configure_metrics | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-02 17:35:28 -07:00
										 |  |  | tune_networking() { | 
					
						
							| 
									
										
										
										
											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 && | 
					
						
							|  |  |  |           sudo sysctl -w net.core.rmem_max=26214400 1>/dev/null 2>/dev/null | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       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 | 
					
						
							|  |  |  |     ) || true | 
					
						
							|  |  |  |   fi | 
					
						
							| 
									
										
										
										
											2018-07-02 17:35:28 -07:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2018-06-24 10:10:55 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | SOLANA_CONFIG_DIR=${SNAP_DATA:-$PWD}/config | 
					
						
							| 
									
										
										
										
											2018-07-02 16:10:55 -07:00
										 |  |  | SOLANA_CONFIG_PRIVATE_DIR=${SNAP_DATA:-$PWD}/config-private | 
					
						
							| 
									
										
										
										
											2018-07-13 11:48:03 -07:00
										 |  |  | 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" | 
					
						
							|  |  |  | } |