#!/usr/bin/env bash # # Start a fullnode # here=$(dirname "$0") # shellcheck source=multinode-demo/common.sh source "$here"/common.sh # shellcheck source=scripts/oom-score-adj.sh source "$here"/../scripts/oom-score-adj.sh fullnode_usage() { if [[ -n $1 ]]; then echo "$*" echo fi cat </dev/null 2>&1 } set -e PS4="$(basename "$0"): " while true; do if [[ ! -d "$SOLANA_RSYNC_CONFIG_DIR"/ledger ]]; then if [[ $node_type = bootstrap_leader ]]; then ledger_not_setup "$SOLANA_RSYNC_CONFIG_DIR/ledger does not exist" fi ( set -x $rsync -qvPr "${rsync_entrypoint_url:?}"/config/ledger "$SOLANA_RSYNC_CONFIG_DIR" $rsync -qvPr "${rsync_entrypoint_url:?}"/config/snapshot_dir "$SOLANA_RSYNC_CONFIG_DIR" current_snapshot_dir=$(cat "$SOLANA_RSYNC_CONFIG_DIR"/snapshot_dir) $rsync -vqPr "${rsync_entrypoint_url:?}"/config/"$current_snapshot_dir"/snapshots "$SOLANA_RSYNC_CONFIG_DIR" $rsync -vqPr "${rsync_entrypoint_url:?}"/config/"$current_snapshot_dir"/accounts "$SOLANA_RSYNC_CONFIG_DIR" ) || true fi if new_gensis_block; then # If the genesis block has changed remove the now stale ledger and vote # keypair for the node and start all over again ( set -x rm -rf "$ledger_config_dir" "$accounts_config_dir" "$snapshot_config_dir" "$configured_flag" ) fi ( set -x if [[ $node_type = validator ]]; then rm -rf "$ledger_config_dir" if [[ -d "$SOLANA_RSYNC_CONFIG_DIR"/snapshots ]]; then rm -rf "$snapshot_config_dir" "$accounts_config_dir" cp -a "$SOLANA_RSYNC_CONFIG_DIR"/snapshots/ "$snapshot_config_dir" cp -a "$SOLANA_RSYNC_CONFIG_DIR"/accounts/ "$accounts_config_dir" fi fi if [[ ! -d "$ledger_config_dir" ]]; then cp -a "$SOLANA_RSYNC_CONFIG_DIR"/ledger/ "$ledger_config_dir" $solana_ledger_tool --ledger "$ledger_config_dir" verify fi ) trap '[[ -n $pid ]] && kill "$pid" >/dev/null 2>&1 && wait "$pid"' INT TERM ERR if ((stake_lamports)); then if [[ $node_type = validator ]]; then setup_validator_accounts "${entrypoint_address%:*}" \ "$identity_keypair_path" \ "$vote_keypair_path" \ "$stake_keypair_path" \ "$storage_keypair_path" \ "$node_lamports" \ "$stake_lamports" elif [[ $node_type = replicator ]]; then setup_replicator_account "${entrypoint_address%:*}" \ "$identity_keypair_path" \ "$storage_keypair_path" \ "$node_lamports" fi fi echo "$PS4$program ${args[*]}" $program "${args[@]}" & pid=$! oom_score_adj "$pid" 1000 if ((no_restart)); then wait "$pid" exit $? fi if [[ $node_type = bootstrap_leader ]]; then snapshot_dir=0 secs_to_next_sync_poll=30 while true; do if ! kill -0 "$pid"; then wait "$pid" exit 0 fi sleep 1 ((secs_to_next_sync_poll--)) && continue ( if [[ -d $snapshot_config_dir ]]; then current_config_dir="$SOLANA_RSYNC_CONFIG_DIR"/$snapshot_dir mkdir -p "$current_config_dir" cp -a "$snapshot_config_dir"/ "$current_config_dir"/snapshots cp -a "$accounts_config_dir"/ "$current_config_dir"/accounts echo $snapshot_dir > "$SOLANA_RSYNC_CONFIG_DIR"/snapshot_dir fi ) || true secs_to_next_sync_poll=60 snapshot_dir=$((snapshot_dir+1)) done else secs_to_next_genesis_poll=1 while true; do if ! kill -0 "$pid"; then wait "$pid" || true echo "############## $node_type exited, restarting ##############" break fi sleep 1 ((poll_for_new_genesis_block)) || continue ((secs_to_next_genesis_poll--)) && continue ( set -x $rsync -r "${rsync_entrypoint_url:?}"/config/ledger "$SOLANA_RSYNC_CONFIG_DIR" ) || true new_gensis_block && break secs_to_next_genesis_poll=60 done echo "############## New genesis detected, restarting $node_type ##############" kill "$pid" || true wait "$pid" || true # give the cluster time to come back up ( set -x sleep 60 ) fi done