#!/bin/bash
: '
A simple test for durability. It starts up clickhouse server in qemu VM and runs
inserts via clickhouse benchmark tool. Then it kills VM in random moment and
checks whether table contains broken parts. With enabled fsync no broken parts
should be appeared.
Usage:
./install.sh
./durability-test.sh
'
URL=http://cloud-images.ubuntu.com/bionic/current
IMAGE=bionic-server-cloudimg-amd64.img
SSH_PORT=11022
PASSWORD=root
TABLE_NAME=$1
CREATE_QUERY=$2
INSERT_QUERY=$3
if [[ -z $TABLE_NAME || -z $CREATE_QUERY || -z $INSERT_QUERY ]]; then
echo "Required 3 arguments: table name, file with create query, file with insert query"
exit 1
fi
function run()
{
sshpass -p $PASSWORD ssh -p $SSH_PORT root@localhost "$1" 2>/dev/null
}
function copy()
{
sshpass -p $PASSWORD scp -r -P $SSH_PORT "$1" "root@localhost:$2" 2>/dev/null
}
function wait_vm_for_start()
{
echo "Waiting until VM started..."
started=0
for _ in {0..100}; do
if run "exit"; then
started=1
break
fi
sleep 1s
done
if ((started == 0)); then
echo "Can't start or connect to VM."
exit 1
fi
echo "Started VM"
}
function wait_clickhouse_for_start()
{
echo "Waiting until ClickHouse started..."
started=0
for _ in {0..30}; do
if run "clickhouse client --query 'select 1'" > /dev/null; then
started=1
break
fi
sleep 1s
done
if ((started == 0)); then
echo "Can't start ClickHouse."
fi
echo "Started ClickHouse"
}
echo "Downloading image"
curl -O $URL/$IMAGE
qemu-img resize $IMAGE +10G
virt-customize -a $IMAGE --root-password password:$PASSWORD > /dev/null 2>&1
virt-copy-in -a $IMAGE sshd_config /etc/ssh
echo "Starting VM"
chmod +x ./startup.exp
./startup.exp > qemu.log 2>&1 &
wait_vm_for_start
echo "Preparing VM"
# Resize partition
run "growpart /dev/sda 1 && resize2fs /dev/sda1"
if [[ -z $CLICKHOUSE_BINARY ]]; then
CLICKHOUSE_BINARY=/usr/bin/clickhouse
fi
if [[ -z $CLICKHOUSE_CONFIG_DIR ]]; then
CLICKHOUSE_CONFIG_DIR=/etc/clickhouse-server
fi
echo "Using ClickHouse binary: $CLICKHOUSE_BINARY"
echo "Using ClickHouse config from: $CLICKHOUSE_CONFIG_DIR"
copy "$CLICKHOUSE_BINARY" /usr/bin
copy "$CLICKHOUSE_CONFIG_DIR" /etc
run "mv /etc/$CLICKHOUSE_CONFIG_DIR /etc/clickhouse-server"
echo "Prepared VM"
echo "Starting ClickHouse"
run "clickhouse server --config-file=/etc/clickhouse-server/config.xml > clickhouse-server.log 2>&1" &
wait_clickhouse_for_start
query=$(cat "$CREATE_QUERY")
echo "Executing query: $query"
run "clickhouse client --query '$query'"
query=$(cat "$INSERT_QUERY")
echo "Will run in a loop query: $query"
run "clickhouse benchmark <<< '$query' -c 8" &
echo "Running queries"
pid=$(pidof qemu-system-x86_64)
sec=$(( (RANDOM % 5) + 25 ))
ms=$(( RANDOM % 1000 ))
echo "Will kill VM in $sec.$ms sec"
sleep $sec.$ms
kill -9 "$pid"
echo "Restarting"
sleep 5s
./startup.exp > qemu.log 2>&1 &
wait_vm_for_start
run "rm -r *data/system"
run "clickhouse server --config-file=/etc/clickhouse-server/config.xml > clickhouse-server.log 2>&1" &
wait_clickhouse_for_start
pid=$(pidof qemu-system-x86_64)
result=$(run "grep $TABLE_NAME clickhouse-server.log | grep 'Caught exception while loading metadata'")
if [[ -n $result ]]; then
echo "FAIL. Can't attach table:"
echo "$result"
kill -9 "$pid"
exit 1
fi
result=$(run "grep $TABLE_NAME clickhouse-server.log | grep 'Considering to remove broken part'")
if [[ -n $result ]]; then
echo "FAIL. Have broken parts:"
echo "$result"
kill -9 "$pid"
exit 1
fi
kill -9 "$pid"
echo OK