Skip to content

Commit

Permalink
Add Snap fullnode daemon
Browse files Browse the repository at this point in the history
  • Loading branch information
mvines committed Jun 26, 2018
1 parent f0b7360 commit ea19222
Show file tree
Hide file tree
Showing 12 changed files with 330 additions and 72 deletions.
6 changes: 6 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -2,3 +2,9 @@ Cargo.lock
/target/
**/*.rs.bk
.cargo

# node configuration files
/config/
/config-drone/
/config-validator/
/config-client-demo/
84 changes: 74 additions & 10 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -84,13 +84,12 @@ Now start the server:
$ ./multinode-demo/leader.sh
```

To run a performance-enhanced fullnode on Linux, download `libcuda_verify_ed25519.a`. Enable
it by adding `--features=cuda` to the line that runs `solana-fullnode` in
`leader.sh`. [CUDA 9.2](https://developer.nvidia.com/cuda-downloads) must be installed on your system.

To run a performance-enhanced fullnode on Linux,
[CUDA 9.2](https://developer.nvidia.com/cuda-downloads) must be installed on
your system:
```bash
$ ./fetch-perf-libs.sh
$ cargo run --release --features=cuda --bin solana-fullnode -- -l leader.json < genesis.log
$ SOLANA_CUDA=1 ./multinode-demo/leader.sh
```

Wait a few seconds for the server to initialize. It will print "Ready." when it's ready to
Expand All @@ -102,14 +101,15 @@ Multinode Testnet
To run a multinode testnet, after starting a leader node, spin up some validator nodes:

```bash
$ ./multinode-demo/validator.sh ubuntu@10.0.1.51:~/solana #The leader machine
$ ./multinode-demo/validator.sh ubuntu@10.0.1.51:~/solana 10.0.1.51
```

As with the leader node, you can run a performance-enhanced validator fullnode by adding
`--features=cuda` to the line that runs `solana-fullnode` in `validator.sh`.

To run a performance-enhanced fullnode on Linux,
[CUDA 9.2](https://developer.nvidia.com/cuda-downloads) must be installed on
your system:
```bash
$ cargo run --release --features=cuda --bin solana-fullnode -- -l validator.json -v leader.json < genesis.log
$ ./fetch-perf-libs.sh
$ SOLANA_CUDA=1 ./multinode-demo/leader.sh ubuntu@10.0.1.51:~/solana 10.0.1.51
```


Expand Down Expand Up @@ -152,6 +152,70 @@ $ snap info solana
$ sudo snap refresh solana --devmode
```

### Daemon support
The snap supports running a leader, validator or leader+drone node as a system
daemon.

Run `sudo snap get solana` to view the current daemon configuration, and
`sudo snap logs -f solana` to view the daemon logs.

Disable the daemon at any time by running:
```bash
$ sudo snap set solana mode=
```

Runtime configuration files for the daemon can be found in
`/var/snap/solana/current/config`.

#### Leader daemon
```bash
$ sudo snap set solana mode=leader
```

If CUDA is available:
```bash
$ sudo snap set solana mode=leader enable-cuda=1
```

`rsync` must be configured and running on the leader.

1. Ensure rsync is installed with `sudo apt-get -y install rsync`
2. Edit `/etc/rsyncd.conf` to include the following
```
[config]
path = /var/snap/solana/current/config
hosts allow = *
read only = true
```
3. Run `sudo systemctl enable rsync; sudo systemctl start rsync`
4. Test by running `rsync -Pzravv rsync://<ip-address-of-leader>/config
solana-config` from another machine. If the leader is running on a cloud
provider it may be necessary to configure the Firewall rules to permit ingress
to port tcp:873, tcp:9900 and the port range udp:8000-udp:10000


To run both the Leader and Drone:
```bash
$ sudo snap set solana mode=leader+drone
```

#### Validator daemon
```bash
$ sudo snap set solana mode=validator
```
If CUDA is available:
```bash
$ sudo snap set solana mode=validator enable-cuda=1
```

By default the validator will connect to **testnet.solana.com**, override
the leader IP address by running:
```bash
$ sudo snap set solana mode=validator leader-address=127.0.0.1 #<-- change IP address
```
It's assumed that the leader will be running `rsync` configured as described in
the previous **Leader daemon** section.

Developing
===

Expand Down
3 changes: 3 additions & 0 deletions ci/snap.sh
Original file line number Diff line number Diff line change
Expand Up @@ -36,5 +36,8 @@ set -x
echo --- build
snapcraft

source ci/upload_ci_artifact.sh
upload_ci_artifact solana_*.snap

echo --- publish
$DRYRUN snapcraft push solana_*.snap --release $SNAP_CHANNEL
18 changes: 18 additions & 0 deletions ci/upload_ci_artifact.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# |source| me

upload_ci_artifact() {
echo "--- artifact: $1"
if [[ -r "$1" ]]; then
ls -l "$1"
if ${BUILDKITE:-false}; then
(
set -x
buildkite-agent artifact upload "$1"
)
fi
else
echo ^^^ +++
echo "$1 not found"
fi
}

29 changes: 17 additions & 12 deletions multinode-demo/client.sh
Original file line number Diff line number Diff line change
@@ -1,17 +1,22 @@
#!/bin/bash
#
# usage: $0 <network path to solana repo on leader machine> <number of nodes in the network>"
#

if [[ -z $1 ]]; then
echo "usage: $0 [network path to solana repo on leader machine] <number of nodes in the network>"
exit 1
fi
here=$(dirname "$0")
# shellcheck source=multinode-demo/common.sh
source "$here"/common.sh
SOLANA_CONFIG_DIR=config-client-demo

LEADER=$1
COUNT=${2:-1}
leader=${1:-${here}/..} # Default to local solana repo
count=${2:-1}

rsync -vz "$LEADER"/{leader.json,mint-demo.json} . || exit $?
set -ex
mkdir -p $SOLANA_CONFIG_DIR
rsync -vz "$leader"/config/leader.json $SOLANA_CONFIG_DIR/
rsync -vz "$leader"/config/mint-demo.json $SOLANA_CONFIG_DIR/

# if RUST_LOG is unset, default to info
export RUST_LOG=${RUST_LOG:-solana=info}

cargo run --release --bin solana-client-demo -- \
-n "$COUNT" -l leader.json -d < mint-demo.json 2>&1 | tee client.log
# shellcheck disable=SC2086 # $solana_client_demo should not be quoted
exec $solana_client_demo \
-n "$count" -l $SOLANA_CONFIG_DIR/leader.json -d \
< $SOLANA_CONFIG_DIR/mint-demo.json 2>&1 | tee client-demo.log
41 changes: 41 additions & 0 deletions multinode-demo/common.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
# |source| this file
#
# Disable complaints about unused variables in this file:
# shellcheck disable=2034

if [[ -d "$SNAP" ]]; then # Running as a Linux Snap?
solana_program() {
local program="$1"
printf "%s/command-%s.wrapper" "$SNAP" "$program"
}
SOLANA_CUDA="$(snapctl get enable-cuda)"
elif [[ -n "$USE_INSTALL" ]]; then # Assume |cargo install| was run
solana_program() {
local program="$1"
printf "solana-%s" "$program"
}
else
solana_program() {
local program="$1"
local features=""
if [[ "$program" =~ ^(.*)-cuda$ ]]; then
program=${BASH_REMATCH[1]}
features="--features=cuda,erasure"
fi
printf "cargo run --release --bin solana-%s %s -- " "$program" "$features"
}
fi

solana_client_demo=$(solana_program client-demo)
solana_drone=$(solana_program drone)
solana_fullnode=$(solana_program fullnode)
solana_fullnode_config=$(solana_program fullnode-config)
solana_fullnode_cuda=$(solana_program fullnode-cuda)
solana_genesis_demo=$(solana_program genesis-demo)
solana_mint_demo=$(solana_program mint-demo)

export RUST_LOG=${RUST_LOG:-solana=info} # if RUST_LOG is unset, default to info
export RUST_BACKTRACE=1
[[ $(uname) = Linux ]] && (set -x; sudo sysctl -w net.core.rmem_max=26214400 1>/dev/null 2>/dev/null)

SOLANA_CONFIG_DIR=${SNAP_DATA:-$PWD}/config
34 changes: 34 additions & 0 deletions multinode-demo/drone.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
#!/bin/bash
#
# usage: $0 <network path to solana repo on leader machine>
#

here=$(dirname "$0")
# shellcheck source=multinode-demo/common.sh
source "$here"/common.sh
SOLANA_CONFIG_DIR=config-drone

if [[ -d "$SNAP" ]]; then
# Exit if mode is not yet configured
# (typically the case after the Snap is first installed)
[[ -n "$(snapctl get mode)" ]] || exit 0

# Select leader from the Snap configuration
leader_address="$(snapctl get leader-address)"
if [[ -z "$leader_address" ]]; then
# Assume drone is running on the same node as the leader by default
leader_address="localhost"
fi
leader=rsync://"$leader_address"
else
leader=${1:-${here}/..} # Default to local solana repo
fi

set -ex
mkdir -p $SOLANA_CONFIG_DIR
rsync -vz "$leader"/config/leader.json $SOLANA_CONFIG_DIR/
rsync -vz "$leader"/config/mint-demo.json $SOLANA_CONFIG_DIR/

# shellcheck disable=SC2086 # $solana_drone should not be quoted
exec $solana_drone \
-l $SOLANA_CONFIG_DIR/leader.json < $SOLANA_CONFIG_DIR/mint-demo.json
40 changes: 20 additions & 20 deletions multinode-demo/leader.sh
Original file line number Diff line number Diff line change
@@ -1,28 +1,28 @@
#!/bin/bash
here=$(dirname "$0")

# shellcheck source=/dev/null
. "${here}"/myip.sh
here=$(dirname "$0")
# shellcheck source=multinode-demo/common.sh
source "$here"/common.sh

myip=$(myip) || exit $?
if [[ -d "$SNAP" ]]; then
# Exit if mode is not yet configured
# (typically the case after the Snap is first installed)
[[ -n "$(snapctl get mode)" ]] || exit 0
fi

[[ -f leader-"${myip}".json ]] || {
echo "I can't find a matching leader config file for \"${myip}\"...
Please run ${here}/setup.sh first.
"
[[ -f "$SOLANA_CONFIG_DIR"/leader.json ]] || {
echo "$SOLANA_CONFIG_DIR/leader.json not found, run ${here}/setup.sh first"
exit 1
}

# if RUST_LOG is unset, default to info
export RUST_LOG=${RUST_LOG:-solana=info}

[[ $(uname) = Linux ]] && sudo sysctl -w net.core.rmem_max=26214400 1>/dev/null 2>/dev/null

# this makes a leader.json file available alongside genesis, etc. for
# validators and clients
cp leader-"${myip}".json leader.json
if [[ -n "$SOLANA_CUDA" ]]; then
program="$solana_fullnode_cuda"
else
program="$solana_fullnode"
fi

cargo run --release --bin solana-fullnode -- \
-l leader-"${myip}".json \
< genesis.log tx-*.log \
> tx-"$(date -u +%Y%m%d%H%M%S%N)".log
# shellcheck disable=SC2086 # $program should not be quoted
exec $program \
-l "$SOLANA_CONFIG_DIR"/leader.json \
< "$SOLANA_CONFIG_DIR"/genesis.log "$SOLANA_CONFIG_DIR"/tx-*.log \
> "$SOLANA_CONFIG_DIR"/tx-"$(date -u +%Y%m%d%H%M%S%N)".log
28 changes: 20 additions & 8 deletions multinode-demo/setup.sh
Original file line number Diff line number Diff line change
@@ -1,15 +1,27 @@
#!/bin/bash

num_tokens=${1:-1000000000}

here=$(dirname "$0")
# shellcheck source=multinode-demo/common.sh
source "$here"/common.sh

# shellcheck source=/dev/null
. "${here}"/myip.sh
set -e

myip=$(myip) || exit $?
echo "Cleaning $SOLANA_CONFIG_DIR"
rm -rvf "$SOLANA_CONFIG_DIR"
mkdir -p "$SOLANA_CONFIG_DIR"

num_tokens=${1:-1000000000}
echo "Creating $SOLANA_CONFIG_DIR/mint-demo.json with $num_tokens tokens"
$solana_mint_demo <<<"$num_tokens" > "$SOLANA_CONFIG_DIR"/mint-demo.json

echo "Creating $SOLANA_CONFIG_DIR/genesis.log"
$solana_genesis_demo < "$SOLANA_CONFIG_DIR"/mint-demo.json > "$SOLANA_CONFIG_DIR"/genesis.log

echo "Creating $SOLANA_CONFIG_DIR/leader.json"
$solana_fullnode_config -d > "$SOLANA_CONFIG_DIR"/leader.json

cargo run --release --bin solana-mint-demo <<<"${num_tokens}" > mint-demo.json
cargo run --release --bin solana-genesis-demo < mint-demo.json > genesis.log
echo "Creating $SOLANA_CONFIG_DIR/validator.json"
$solana_fullnode_config -d -b 9000 > "$SOLANA_CONFIG_DIR"/validator.json

cargo run --release --bin solana-fullnode-config -- -d > leader-"${myip}".json
cargo run --release --bin solana-fullnode-config -- -b 9000 -d > validator-"${myip}".json
ls -lh "$SOLANA_CONFIG_DIR/"
Loading

0 comments on commit ea19222

Please sign in to comment.