Reduced test flakiness

This commit is contained in:
Alexey Gerasimchuck 2023-08-04 06:09:29 +00:00
parent 1e7daca85b
commit 24cdaf305d
5 changed files with 58 additions and 66 deletions

View File

@ -207,8 +207,8 @@ def test_postgres_session(started_cluster):
def test_parallel_sessions(started_cluster):
thread_list = []
for _ in range(10):
# Sleep time does not dignificantly matters here,
# test should pass even without sleeping
# Sleep time does not significantly matter here,
# test should pass even without sleeping.
for function in [postgres_query, grpc_query, mysql_query]:
thread = threading.Thread(
target=function,

View File

@ -1,46 +1,34 @@
sessions:
360
150
port_0_sessions:
0
address_0_sessions:
0
tcp_sessions
90
60
http_sessions
90
30
http_with_session_id_sessions
90
30
my_sql_sessions
90
30
Corresponding LoginSuccess/Logout
15
10
LoginFailure
15
10
Corresponding LoginSuccess/Logout
15
10
LoginFailure
15
10
Corresponding LoginSuccess/Logout
15
10
LoginFailure
15
10
Corresponding LoginSuccess/Logout
15
10
LoginFailure
15
10
Corresponding LoginSuccess/Logout
15
10
LoginFailure
15
Corresponding LoginSuccess/Logout
15
LoginFailure
15
Corresponding LoginSuccess/Logout
15
LoginFailure
15
Corresponding LoginSuccess/Logout
15
LoginFailure
15
10

View File

@ -1,5 +1,7 @@
#!/usr/bin/env bash
# Tags: no-fasttest
# Tags: no-fasttest, no-parallel
# If tests run in parallel, results can become flaky.
# Because each test starts many processes and waits for the query to run.
CURDIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)
# shellcheck source=../shell_config.sh
@ -7,10 +9,11 @@ CURDIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)
readonly PID=$$
readonly TCP_USERS=( "TCP_USER_${PID}"_{1,2} )
readonly HTTP_USERS=( "HTTP_USER_${PID}"_{1,2} )
readonly HTTP_WITH_SESSION_ID_SESSION_USERS=( "HTTP_WITH_SESSION_ID_USER_${PID}"_{1,2} )
readonly MYSQL_USERS=( "MYSQL_USER_${PID}"_{1,2} )
# Each user uses a separate thread.
readonly TCP_USERS=( "TCP_USER_${PID}"_{1,2} ) # 2 concurrent TCP users
readonly HTTP_USERS=( "HTTP_USER_${PID}" )
readonly HTTP_WITH_SESSION_ID_SESSION_USERS=( "HTTP_WITH_SESSION_ID_USER_${PID}" )
readonly MYSQL_USERS=( "MYSQL_USER_${PID}")
readonly ALL_USERS=( "${TCP_USERS[@]}" "${HTTP_USERS[@]}" "${HTTP_WITH_SESSION_ID_SESSION_USERS[@]}" "${MYSQL_USERS[@]}" )
readonly TCP_USERS_SQL_COLLECTION_STRING="$( echo "${TCP_USERS[*]}" | sed "s/[^[:space:]]\+/'&'/g" | sed 's/[[:space:]]/,/g' )"
@ -27,18 +30,18 @@ for user in "${ALL_USERS[@]}"; do
${CLICKHOUSE_CLIENT} -q "GRANT SELECT ON INFORMATION_SCHEMA.* TO ${user}";
done
# All <type>_session functions execute in separate threads
# These functions tries to create a session with succesful login and logout,
# sleep small random amount of time to make concurency more intesive
# and try to login with invalid password.
# Test actually not timing dependent, it should work even without sleep at all.
# All <type>_session functions execute in separate threads.
# These functions try to create a session with successful login and logout.
# Sleep a small, random amount of time to make concurrency more intense.
# and try to login with an invalid password.
# test is actually not timing dependent. it should work even without sleep at all.
function tcp_session()
{
local user=$1
local i=0
while (( (i++) < 15 )); do
while (( (i++) < 10 )); do
# login logout
${CLICKHOUSE_CLIENT} -q "SELECT 1, sleep 0.03${RANDOM}" --user="${user}" --password="pass"
${CLICKHOUSE_CLIENT} -q "SELECT 1, sleep(0.02${RANDOM})" --user="${user}" --password="pass"
# login failure
${CLICKHOUSE_CLIENT} -q "SELECT 2" --user="${user}" --password 'invalid'
done
@ -48,9 +51,9 @@ function http_session()
{
local user=$1
local i=0
while (( (i++) < 15 )); do
while (( (i++) < 10 )); do
# login logout
${CLICKHOUSE_CURL} -sS "${CLICKHOUSE_URL}&user=${user}&password=pass" -d "SELECT 3, sleep 0.03${RANDOM}"
${CLICKHOUSE_CURL} -sS "${CLICKHOUSE_URL}&user=${user}&password=pass" -d "SELECT 3, sleep(0.02${RANDOM})"
# login failure
${CLICKHOUSE_CURL} -sS "${CLICKHOUSE_URL}&user=${user}&password=wrong" -d "SELECT 4"
@ -61,9 +64,9 @@ function http_with_session_id_session()
{
local user=$1
local i=0
while (( (i++) < 15 )); do
while (( (i++) < 10 )); do
# login logout
${CLICKHOUSE_CURL} -sS "${CLICKHOUSE_URL}&session_id=${user}&user=${user}&password=pass" -d "SELECT 5, sleep 0.03${RANDOM}"
${CLICKHOUSE_CURL} -sS "${CLICKHOUSE_URL}&session_id=${user}&user=${user}&password=pass" -d "SELECT 5, sleep 0.02${RANDOM}"
# login failure
${CLICKHOUSE_CURL} -sS "${CLICKHOUSE_URL}&session_id=${user}&user=${user}&password=wrong" -d "SELECT 6"
@ -74,9 +77,9 @@ function mysql_session()
{
local user=$1
local i=0
while (( (i++) < 15 )); do
while (( (i++) < 10 )); do
# login logout
${CLICKHOUSE_CLIENT} -q "SELECT 1, sleep(0.03${RANDOM}) FROM mysql('127.0.0.1:9004', 'system', 'one', '${user}', 'pass')"
${CLICKHOUSE_CLIENT} -q "SELECT 1, sleep(0.02${RANDOM}) FROM mysql('127.0.0.1:9004', 'system', 'one', '${user}', 'pass')"
# login failure
${CLICKHOUSE_CLIENT} -q "SELECT 1 FROM mysql('127.0.0.1:9004', 'system', 'one', '${user}', 'wrong', SETTINGS connection_max_tries=1)"

View File

@ -37,8 +37,8 @@ ${CLICKHOUSE_CLIENT} -q "SELECT count(*) FROM system.session_log WHERE user = '$
echo "login failures:"
${CLICKHOUSE_CLIENT} -q "SELECT count(*) FROM system.session_log WHERE user = '${TEST_USER}' and type = 'LoginFailure'"
# remote(...) function sometimes reuse old cached sessions for query execution.
# This makes LoginSuccess/Logout entries count unsable but success and logouts must always match.
# remote(...) function sometimes reuses old cached sessions for query execution.
# This makes LoginSuccess/Logout entries count unstable, but success and logouts must always match.
for interface in 'TCP' 'HTTP' 'MySQL'
do

View File

@ -1,4 +1,7 @@
#!/usr/bin/env bash
# Tags: no-parallel
# If tests run in parallel, results can become flaky.
# Because each test starts many processes and waits for the query to run.
CURDIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)
# shellcheck source=../shell_config.sh
@ -14,31 +17,29 @@ readonly SESSION_LOG_MATCHING_FIELDS="auth_id, auth_type, client_version_major,
function tcp_session()
{
local user=$1
${CLICKHOUSE_CLIENT} -q "SELECT * FROM system.numbers" --user="${user}"
${CLICKHOUSE_CLIENT} -q "SELECT COUNT(*) FROM system.numbers" --user="${user}"
}
function http_session()
{
local user=$1
${CLICKHOUSE_CURL} -sS "${CLICKHOUSE_URL}&user=${user}&password=pass" -d "SELECT * FROM system.numbers"
${CLICKHOUSE_CURL} -sS "${CLICKHOUSE_URL}&user=${user}&password=pass" -d "SELECT COUNT(*) FROM system.numbers"
}
function http_with_session_id_session()
{
local user=$1
${CLICKHOUSE_CURL} -sS "${CLICKHOUSE_URL}&user=${user}&password=pass" -d "SELECT * FROM system.numbers"
${CLICKHOUSE_CURL} -sS "${CLICKHOUSE_URL}&user=${user}&password=pass" -d "SELECT COUNT(*) FROM system.numbers"
}
# Busy-waits until user $1, specified amount of queries ($2) will run simultaneosly.
# Busy-waits until user $1, specified amount of queries ($2) will run simultaneously.
function wait_for_queries_start()
{
local user=$1
local queries_count=$2
# 5 seconds waiting
counter=0 retries=50
I=0
# 10 seconds waiting
counter=0 retries=100
while [[ $counter -lt $retries ]]; do
I=$((I + 1))
result=$($CLICKHOUSE_CLIENT --query "SELECT COUNT(*) FROM system.processes WHERE user = '${user}'")
if [[ $result == "${queries_count}" ]]; then
break;
@ -58,9 +59,9 @@ export -f tcp_session;
export -f http_session;
export -f http_with_session_id_session;
timeout 5s bash -c "tcp_session ${TEST_USER}" >/dev/null 2>&1 &
timeout 5s bash -c "http_session ${TEST_USER}" >/dev/null 2>&1 &
timeout 5s bash -c "http_with_session_id_session ${TEST_USER}" >/dev/null 2>&1 &
timeout 10s bash -c "tcp_session ${TEST_USER}" >/dev/null 2>&1 &
timeout 10s bash -c "http_session ${TEST_USER}" >/dev/null 2>&1 &
timeout 10s bash -c "http_with_session_id_session ${TEST_USER}" >/dev/null 2>&1 &
wait_for_queries_start $TEST_USER 3
${CLICKHOUSE_CLIENT} -q "DROP USER ${TEST_USER}"
@ -72,9 +73,9 @@ wait
${CLICKHOUSE_CLIENT} -q "CREATE ROLE IF NOT EXISTS ${TEST_ROLE}"
${CLICKHOUSE_CLIENT} -q "CREATE USER ${TEST_USER} DEFAULT ROLE ${TEST_ROLE}"
timeout 5s bash -c "tcp_session ${TEST_USER}" >/dev/null 2>&1 &
timeout 5s bash -c "http_session ${TEST_USER}" >/dev/null 2>&1 &
timeout 5s bash -c "http_with_session_id_session ${TEST_USER}" >/dev/null 2>&1 &
timeout 10s bash -c "tcp_session ${TEST_USER}" >/dev/null 2>&1 &
timeout 10s bash -c "http_session ${TEST_USER}" >/dev/null 2>&1 &
timeout 10s bash -c "http_with_session_id_session ${TEST_USER}" >/dev/null 2>&1 &
wait_for_queries_start $TEST_USER 3
${CLICKHOUSE_CLIENT} -q "DROP ROLE ${TEST_ROLE}"
@ -88,9 +89,9 @@ wait
${CLICKHOUSE_CLIENT} -q "CREATE SETTINGS PROFILE IF NOT EXISTS '${TEST_PROFILE}'"
${CLICKHOUSE_CLIENT} -q "CREATE USER ${TEST_USER} SETTINGS PROFILE '${TEST_PROFILE}'"
timeout 5s bash -c "tcp_session ${TEST_USER}" >/dev/null 2>&1 &
timeout 5s bash -c "http_session ${TEST_USER}" >/dev/null 2>&1 &
timeout 5s bash -c "http_with_session_id_session ${TEST_USER}" >/dev/null 2>&1 &
timeout 10s bash -c "tcp_session ${TEST_USER}" >/dev/null 2>&1 &
timeout 10s bash -c "http_session ${TEST_USER}" >/dev/null 2>&1 &
timeout 10s bash -c "http_with_session_id_session ${TEST_USER}" >/dev/null 2>&1 &
wait_for_queries_start $TEST_USER 3
${CLICKHOUSE_CLIENT} -q "DROP SETTINGS PROFILE '${TEST_PROFILE}'"