167 lines
2.9 KiB
Bash
167 lines
2.9 KiB
Bash
|
#!/bin/sh
|
||
|
|
||
|
set -o errexit
|
||
|
|
||
|
cargo build
|
||
|
|
||
|
kill() {
|
||
|
if [ "$(uname)" = "Darwin" ]; then
|
||
|
SERVICE='raft-key-value'
|
||
|
if pgrep -xq -- "${SERVICE}"; then
|
||
|
pkill -f "${SERVICE}"
|
||
|
fi
|
||
|
else
|
||
|
set +e # killall will error if finds no process to kill
|
||
|
killall raft-key-value
|
||
|
set -e
|
||
|
fi
|
||
|
}
|
||
|
|
||
|
rpc() {
|
||
|
local uri=$1
|
||
|
local body="$2"
|
||
|
|
||
|
echo '---'" rpc(:$uri, $body)"
|
||
|
|
||
|
{
|
||
|
if [ ".$body" = "." ]; then
|
||
|
time curl --silent "127.0.0.1:$uri"
|
||
|
else
|
||
|
time curl --silent "127.0.0.1:$uri" -H "Content-Type: application/json" -d "$body"
|
||
|
fi
|
||
|
} | {
|
||
|
if type jq > /dev/null 2>&1; then
|
||
|
jq
|
||
|
else
|
||
|
cat
|
||
|
fi
|
||
|
}
|
||
|
|
||
|
echo
|
||
|
echo
|
||
|
}
|
||
|
|
||
|
export RUST_LOG=trace
|
||
|
|
||
|
echo "Killing all running raft-key-value"
|
||
|
|
||
|
kill
|
||
|
|
||
|
sleep 1
|
||
|
|
||
|
echo "Start 3 uninitialized raft-key-value servers..."
|
||
|
|
||
|
nohup ./target/debug/raft-key-value --id 1 --http-addr 127.0.0.1:21001 > n1.log &
|
||
|
sleep 1
|
||
|
echo "Server 1 started"
|
||
|
|
||
|
nohup ./target/debug/raft-key-value --id 2 --http-addr 127.0.0.1:21002 > n2.log &
|
||
|
sleep 1
|
||
|
echo "Server 2 started"
|
||
|
|
||
|
nohup ./target/debug/raft-key-value --id 3 --http-addr 127.0.0.1:21003 > n3.log &
|
||
|
sleep 1
|
||
|
echo "Server 3 started"
|
||
|
sleep 1
|
||
|
|
||
|
echo "Initialize server 1 as a single-node cluster"
|
||
|
sleep 2
|
||
|
echo
|
||
|
rpc 21001/init '{}'
|
||
|
|
||
|
echo "Server 1 is a leader now"
|
||
|
|
||
|
sleep 2
|
||
|
|
||
|
echo "Get metrics from the leader"
|
||
|
sleep 2
|
||
|
echo
|
||
|
rpc 21001/metrics
|
||
|
sleep 1
|
||
|
|
||
|
|
||
|
echo "Adding node 2 and node 3 as learners, to receive log from leader node 1"
|
||
|
|
||
|
sleep 1
|
||
|
echo
|
||
|
rpc 21001/add-learner '[2, "127.0.0.1:21002"]'
|
||
|
echo "Node 2 added as learner"
|
||
|
sleep 1
|
||
|
echo
|
||
|
rpc 21001/add-learner '[3, "127.0.0.1:21003"]'
|
||
|
echo "Node 3 added as learner"
|
||
|
sleep 1
|
||
|
|
||
|
echo "Get metrics from the leader, after adding 2 learners"
|
||
|
sleep 2
|
||
|
echo
|
||
|
rpc 21001/metrics
|
||
|
sleep 1
|
||
|
|
||
|
echo "Changing membership from [1] to 3 nodes cluster: [1, 2, 3]"
|
||
|
echo
|
||
|
rpc 21001/change-membership '[1, 2, 3]'
|
||
|
sleep 1
|
||
|
echo 'Membership changed to [1, 2, 3]'
|
||
|
sleep 1
|
||
|
|
||
|
echo "Get metrics from the leader again"
|
||
|
sleep 1
|
||
|
echo
|
||
|
rpc 21001/metrics
|
||
|
sleep 1
|
||
|
|
||
|
echo "Write data on leader"
|
||
|
sleep 1
|
||
|
echo
|
||
|
rpc 21001/write '{"Set":{"key":"foo","value":"bar"}}'
|
||
|
sleep 1
|
||
|
echo "Data written"
|
||
|
sleep 1
|
||
|
|
||
|
echo "Read on every node, including the leader"
|
||
|
sleep 1
|
||
|
echo "Read from node 1"
|
||
|
echo
|
||
|
rpc 21001/read '"foo"'
|
||
|
echo "Read from node 2"
|
||
|
echo
|
||
|
rpc 21002/read '"foo"'
|
||
|
echo "Read from node 3"
|
||
|
echo
|
||
|
rpc 21003/read '"foo"'
|
||
|
|
||
|
|
||
|
echo "Changing membership from [1,2,3] to [3]"
|
||
|
echo
|
||
|
rpc 21001/change-membership '[3]'
|
||
|
sleep 1
|
||
|
echo 'Membership changed to [3]'
|
||
|
sleep 1
|
||
|
|
||
|
echo "Get metrics from the node-3"
|
||
|
sleep 1
|
||
|
echo
|
||
|
rpc 21003/metrics
|
||
|
sleep 1
|
||
|
|
||
|
|
||
|
echo "Write foo=zoo on node-3"
|
||
|
sleep 1
|
||
|
echo
|
||
|
rpc 21003/write '{"Set":{"key":"foo","value":"zoo"}}'
|
||
|
sleep 1
|
||
|
echo "Data written"
|
||
|
sleep 1
|
||
|
|
||
|
echo "Read foo=zoo from node-3"
|
||
|
sleep 1
|
||
|
echo "Read from node 3"
|
||
|
echo
|
||
|
rpc 21003/read '"foo"'
|
||
|
echo
|
||
|
|
||
|
|
||
|
echo "Killing all nodes..."
|
||
|
kill
|