script for making blockchain snapshots locally
This commit is contained in:
parent
f4e9f550c3
commit
3a7e9c391e
1 changed files with 110 additions and 0 deletions
110
snapshot-local.sh
Executable file
110
snapshot-local.sh
Executable file
|
@ -0,0 +1,110 @@
|
|||
#!/bin/bash
|
||||
|
||||
#
|
||||
# Make a local blockchain snapshot
|
||||
#
|
||||
|
||||
#set -x
|
||||
#set -e
|
||||
set -uo pipefail
|
||||
|
||||
BIN_DIR="$HOME/lbrybins" # directory where lbrycrdd and lbrycrd-cli binaries are
|
||||
CONF_DIR="$HOME/.lbrycrd" # directory where config files and wallets are
|
||||
SNAPSHOT_DIR="$HOME" # directory where to temporarily put the snapshot
|
||||
|
||||
AWS_PATH="s3://snapshots.lbry.com/blockchain/" # Where to upload the snapshot to
|
||||
AWS_FLAGS="--profile mfa --region us-east-2" # General AWS flags (region, profile, etc)
|
||||
|
||||
# TODO: add timing info to each step so I know how long it takes
|
||||
|
||||
|
||||
|
||||
echo "Running $0"
|
||||
|
||||
hash aws 2>/dev/null || { echo >&2 'aws command not found. Install it: sudo apt install awscli'; exit 1; }
|
||||
|
||||
if ! aws $AWS_FLAGS s3 ls > /dev/null 2>/dev/null; then
|
||||
echo "not logged into mfa profile on aws. run aws-mfa-refresh.sh"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if ! pgrep lbrycrdd; then
|
||||
echo "Starting lbrycrdd"
|
||||
"$BIN_DIR/lbrycrdd" -server -daemon
|
||||
fi
|
||||
|
||||
|
||||
EXPLORER_BLOCKS=$(curl -s https://explorer.lbry.com/api/v1/status | grep -Eo 'height":([0-9])+' | grep -Eo '[0-9]+')
|
||||
|
||||
echo "Waiting until lbrycrdd has caught up to the blockchain tip"
|
||||
|
||||
while true; do
|
||||
info=$("$BIN_DIR/lbrycrd-cli" getblockchaininfo 2>/dev/null)
|
||||
if [ "$?" != 0 ]; then
|
||||
echo "Waiting for lbrycrdd to start"
|
||||
sleep 10
|
||||
continue
|
||||
fi
|
||||
|
||||
HEADERS=$(echo "$info" | grep headers | grep -Eo '[0-9]+')
|
||||
BLOCKS=$(echo "$info" | grep blocks | grep -Eo '[0-9]+')
|
||||
TIP=$(( EXPLORER_BLOCKS > HEADERS ? EXPLORER_BLOCKS : HEADERS ))
|
||||
echo "tip: $TIP, height: $BLOCKS"
|
||||
|
||||
[[ "$BLOCKS" -ge "$TIP" ]] && break
|
||||
|
||||
((blocksToGo=TIP-BLOCKS))
|
||||
((sleepTime=blocksToGo/10)) # I get ~3 blocks per second but I don't want to oversleep
|
||||
if [ "$sleepTime" -lt 2 ]; then sleepTime=2; fi
|
||||
echo "$blocksToGo blocks to go. Checking again in $sleepTime seconds (at $(date -d "+ $sleepTime seconds" "+%H:%M"))..."
|
||||
sleep $sleepTime
|
||||
done
|
||||
|
||||
|
||||
LBRYCRD_VERSION=$("$BIN_DIR/lbrycrd-cli" getnetworkinfo 2>/dev/null | grep -m 1 subversion | grep -Eo '[0-9\.]+')
|
||||
|
||||
echo "Stopping lbrycrdd at $BLOCKS blocks"
|
||||
pkill lbrycrdd
|
||||
echo "Waiting for lbrycrdd to shut down..."
|
||||
while pgrep lbrycrdd > /dev/null; do sleep 3; done
|
||||
echo "lbrycrdd stopped"
|
||||
|
||||
|
||||
|
||||
BLOCKCHAIN_SNAPSHOT="$SNAPSHOT_DIR/blockchain_snapshot_${BLOCKS}_v${LBRYCRD_VERSION}_$(date +%F).tgz"
|
||||
|
||||
case "$LBRYCRD_VERSION" in
|
||||
0.17.3.*)
|
||||
TARGETS="blocks/ chainstate/ claimtrie/ indexes/"
|
||||
;;
|
||||
0.17.4.*)
|
||||
TARGETS="blocks/ indexes/ claims.sqlite block_index.sqlite coins.sqlite"
|
||||
;;
|
||||
0.19.1.*)
|
||||
TARGETS="blocks/ indexes/ claims.sqlite block_index.sqlite coins.sqlite txindex.sqlite"
|
||||
;;
|
||||
*)
|
||||
echo "unsupported lbrycrd version $LBRYCRD_VERSION"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
echo "Making blockchain snapshot $BLOCKCHAIN_SNAPSHOT"
|
||||
tar -czvf "$BLOCKCHAIN_SNAPSHOT" -C "$CONF_DIR" $TARGETS
|
||||
if [ "$?" != 0 ]; then
|
||||
echo "Failed to make snapshot"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "Uploading blockchain snapshot to s3"
|
||||
aws $AWS_FLAGS s3 cp "$BLOCKCHAIN_SNAPSHOT" "$AWS_PATH"
|
||||
if [ "$?" != 0 ]; then
|
||||
echo "Upload failed. Leaving snapshot at $BLOCKCHAIN_SNAPSHOT"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "Upload finished. Deleting snapshot"
|
||||
|
||||
rm -f "$BLOCKCHAIN_SNAPSHOT"
|
||||
|
||||
echo "Done"
|
Loading…
Add table
Reference in a new issue