mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-12-02 04:22:03 +00:00
98cd92017e
When WRITE lock attemp fails (exclusive lock for ALTER/DELETE), and there are multiple READ locks (shared lock for SELECT/INSERT), i.e. one INSERT is in progress and one SELECT is queued after ALTER/DELETE started but before it fails, this SELECT will wait until INSERT will finishes. This happens because in case of WRITE lock failure it does not notify the next READ lock that can be acquired. Signed-off-by: Azat Khuzhin <a.khuzhin@semrush.com>
44 lines
1.7 KiB
Bash
Executable File
44 lines
1.7 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
|
|
# Test that ensures that WRITE lock failure notifies READ.
|
|
# In other words to ensure that after WRITE lock failure (DROP),
|
|
# READ lock (SELECT) available instantly.
|
|
|
|
CUR_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)
|
|
# shellcheck source=../shell_config.sh
|
|
. "$CUR_DIR"/../shell_config.sh
|
|
|
|
function wait_query_by_id_started()
|
|
{
|
|
local query_id=$1 && shift
|
|
# wait for query to be started
|
|
while [ "$($CLICKHOUSE_CLIENT "$@" -q "select count() from system.processes where query_id = '$query_id'")" -ne 1 ]; do
|
|
sleep 0.1
|
|
done
|
|
}
|
|
|
|
# to avoid removal via separate thread
|
|
$CLICKHOUSE_CLIENT -q "CREATE DATABASE ${CLICKHOUSE_DATABASE}_ordinary Engine=Ordinary" --allow_deprecated_database_ordinary=1
|
|
$CLICKHOUSE_CLIENT -q "CREATE TABLE ${CLICKHOUSE_DATABASE}_ordinary.data_02352 (key Int) Engine=Null()"
|
|
|
|
query_id="insert-$(random_str 10)"
|
|
# 20 seconds sleep
|
|
$CLICKHOUSE_CLIENT --query_id "$query_id" -q "INSERT INTO ${CLICKHOUSE_DATABASE}_ordinary.data_02352 SELECT sleepEachRow(1) FROM numbers(20) GROUP BY number" &
|
|
wait_query_by_id_started "$query_id"
|
|
|
|
query_id="drop-$(random_str 10)"
|
|
# 10 second wait
|
|
$CLICKHOUSE_CLIENT --query_id "$query_id" -q "DROP TABLE ${CLICKHOUSE_DATABASE}_ordinary.data_02352 SYNC" --lock_acquire_timeout 10 > >(grep -m1 -o 'WRITE locking attempt on ".*" has timed out') 2>&1 &
|
|
wait_query_by_id_started "$query_id"
|
|
|
|
# NOTE: we need to run SELECT after DROP and
|
|
# if the bug is there, then the query will wait 20 seconds (INSERT), instead of 10 (DROP) and will fail
|
|
#
|
|
# 11 seconds wait (DROP + 1 second lag)
|
|
$CLICKHOUSE_CLIENT -q "SELECT * FROM ${CLICKHOUSE_DATABASE}_ordinary.data_02352" --lock_acquire_timeout 11
|
|
|
|
# wait DROP and INSERT
|
|
wait
|
|
|
|
$CLICKHOUSE_CLIENT -q "DROP DATABASE ${CLICKHOUSE_DATABASE}_ordinary"
|