2019-03-07 18:16:36 +00:00
#!/usr/bin/env bash
set -e
CURDIR = $( cd " $( dirname " ${ BASH_SOURCE [0] } " ) " && pwd )
2020-08-01 00:51:12 +00:00
. " $CURDIR " /../shell_config.sh
2019-03-07 18:16:36 +00:00
2019-04-16 14:13:13 +00:00
echo "DROP TABLE IF EXISTS concurrent_alter_column" | ${ CLICKHOUSE_CLIENT }
echo "CREATE TABLE concurrent_alter_column (ts DATETIME) ENGINE = MergeTree PARTITION BY toStartOfDay(ts) ORDER BY tuple()" | ${ CLICKHOUSE_CLIENT }
2019-03-07 18:16:36 +00:00
2019-08-28 19:36:04 +00:00
function thread1( )
{
while true; do
2020-09-09 13:32:50 +00:00
for i in { 1..500} ; do echo " ALTER TABLE concurrent_alter_column ADD COLUMN c $i DOUBLE; " ; done | ${ CLICKHOUSE_CLIENT } -n --query_id= alter_00816_1
2019-08-28 19:36:04 +00:00
done
}
2019-03-07 18:16:36 +00:00
2019-08-28 19:36:04 +00:00
function thread2( )
{
while true; do
2020-09-09 13:32:50 +00:00
echo "ALTER TABLE concurrent_alter_column ADD COLUMN d DOUBLE" | ${ CLICKHOUSE_CLIENT } --query_id= alter_00816_2;
2020-08-01 01:20:22 +00:00
sleep " $( echo 0.0$RANDOM ) " ;
2020-09-09 13:32:50 +00:00
echo "ALTER TABLE concurrent_alter_column DROP COLUMN d" | ${ CLICKHOUSE_CLIENT } --query_id= alter_00816_2;
2019-08-28 19:36:04 +00:00
done
}
function thread3( )
{
while true; do
2020-09-09 13:32:50 +00:00
echo "ALTER TABLE concurrent_alter_column ADD COLUMN e DOUBLE" | ${ CLICKHOUSE_CLIENT } --query_id= alter_00816_3;
2020-08-01 01:20:22 +00:00
sleep " $( echo 0.0$RANDOM ) " ;
2020-09-09 13:32:50 +00:00
echo "ALTER TABLE concurrent_alter_column DROP COLUMN e" | ${ CLICKHOUSE_CLIENT } --query_id= alter_00816_3;
2019-08-28 19:36:04 +00:00
done
}
function thread4( )
{
while true; do
2020-09-09 13:32:50 +00:00
echo "ALTER TABLE concurrent_alter_column ADD COLUMN f DOUBLE" | ${ CLICKHOUSE_CLIENT } --query_id= alter_00816_4;
2020-08-01 01:20:22 +00:00
sleep " $( echo 0.0$RANDOM ) " ;
2020-09-09 13:32:50 +00:00
echo "ALTER TABLE concurrent_alter_column DROP COLUMN f" | ${ CLICKHOUSE_CLIENT } --query_id= alter_00816_4;
2019-08-28 19:36:04 +00:00
done
}
# https://stackoverflow.com/questions/9954794/execute-a-shell-function-with-timeout
export -f thread1;
export -f thread2;
export -f thread3;
export -f thread4;
TIMEOUT = 30
timeout $TIMEOUT bash -c thread1 2> /dev/null &
timeout $TIMEOUT bash -c thread2 2> /dev/null &
timeout $TIMEOUT bash -c thread3 2> /dev/null &
timeout $TIMEOUT bash -c thread4 2> /dev/null &
2019-03-07 18:16:36 +00:00
wait
2020-09-09 13:32:50 +00:00
echo "DROP TABLE concurrent_alter_column NO DELAY" | ${ CLICKHOUSE_CLIENT } # NO DELAY has effect only for Atomic database
db_engine = ` $CLICKHOUSE_CLIENT -q "SELECT engine FROM system.databases WHERE name=currentDatabase()" `
if [ [ $db_engine = = "Atomic" ] ] ; then
# DROP is non-blocking, so wait for alters
while true; do
$CLICKHOUSE_CLIENT -q "SELECT c = 0 FROM (SELECT count() as c FROM system.processes WHERE query_id LIKE 'alter_00816_%')" | grep 1 > /dev/null && break;
sleep 1;
done
fi
2019-03-07 18:16:36 +00:00
2019-08-28 19:36:04 +00:00
# Check for deadlocks
2020-09-09 13:32:50 +00:00
echo "SELECT * FROM system.processes WHERE query_id LIKE 'alter_00816_%'" | ${ CLICKHOUSE_CLIENT }
2019-08-28 19:36:04 +00:00
2019-03-07 18:16:36 +00:00
echo 'did not crash'