ClickHouse/tests/integration/test_drop_is_lock_free/test.py

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

223 lines
5.4 KiB
Python
Raw Normal View History

import time
import pytest
import logging
from contextlib import contextmanager
from helpers.cluster import ClickHouseCluster
from helpers.test_tools import assert_eq_with_retry
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)
cluster = ClickHouseCluster(__file__)
node = cluster.add_instance(
"node",
stay_alive=True,
with_zookeeper=False,
main_configs=[
"configs/keeper.xml",
"configs/transactions.xml",
],
)
@pytest.fixture(scope="module", autouse=True)
def start_cluster():
try:
cluster.start()
yield cluster
finally:
cluster.shutdown()
@pytest.fixture(scope="function")
def test_name(request):
return request.node.name
@pytest.fixture(scope="function")
def exclusive_table(test_name):
normalized = (
test_name.replace("[", "_")
.replace("]", "_")
.replace(" ", "_")
.replace("-", "_")
)
return "table_" + normalized
def get_event_select_count():
return int(
node.query(
"""
SELECT value FROM system.events WHERE event = 'SelectQuery';
"""
)
)
def get_query_processes_count(query_id):
q = f"""
SELECT count() FROM system.processes WHERE query_id = '{query_id}';
"""
return q
def is_query_running(query_id):
return 1 == int(node.query(get_query_processes_count(query_id)))
def wait_select_start(query_id):
assert_eq_with_retry(
node,
get_query_processes_count(query_id),
"1\n",
)
LOCK_FREE_QUERIES = {
"detach table": "DETACH TABLE {table};",
"drop part": "ALTER TABLE {table} DROP PART 'all_1_1_0';",
"detach part": "ALTER TABLE {table} DETACH PART 'all_1_1_0';",
"truncate": "TRUNCATE TABLE {table};",
}
@pytest.mark.parametrize(
"lock_free_query", LOCK_FREE_QUERIES.values(), ids=LOCK_FREE_QUERIES.keys()
)
def test_query_is_lock_free(lock_free_query, exclusive_table):
node.query(
f"""
CREATE TABLE {exclusive_table}
(a Int64)
Engine=MergeTree ORDER BY a;
"""
)
node.query(
f"""
INSERT INTO {exclusive_table} SELECT number FROM numbers(50);
"""
)
query_id = "select-" + exclusive_table
select_handler = node.get_query_request(
f"""
2023-07-24 16:13:15 +00:00
SELECT sleepEachRow(3) FROM {exclusive_table} SETTINGS function_sleep_max_microseconds_per_block = 0;
""",
query_id=query_id,
)
wait_select_start(query_id)
for _ in [1, 2, 3, 4, 5]:
assert is_query_running(query_id)
assert select_handler.process.poll() is None
time.sleep(1)
node.query(lock_free_query.format(table=exclusive_table))
assert is_query_running(query_id)
if "DETACH TABLE" in lock_free_query:
result = node.query_and_get_error(
f"""
SELECT count() FROM {exclusive_table};
"""
)
Added suggestions for mistyped names for db and tables with different… (#49801) * Added suggestions for mistyped names for db and tables with different scenarios commented * fixed bugs * fixed style check * fixed errors * fixed errors * fixed error with exceptions * fixed exceptions * fixed exceptions * fixed exceptions * added test and fixed bugs * fixed style check * fixed style check * fixed style check * fixed check black * Update test.py * Fixed server crash * Fixed server crash and style check * Fixed style check * Fixed style check * Fixed style check * Fixed bugs with drop_db * fixed fast test * added tests * fixed style check * fixed style check * fixed bug with lock_db * fixed bug with lock_db and fixed reviews * fixed bug with lock_db and fixed reviews * fixed style check * fixed fast test * fixed fast test * revert to fd582a2 * revert to fd582a2 * Removed unused parameters Co-authored-by: Yakov Olkhovskiy <99031427+yakov-olkhovskiy@users.noreply.github.com> * Remove unused parameters Co-authored-by: Yakov Olkhovskiy <99031427+yakov-olkhovskiy@users.noreply.github.com> * resolved arguments issue in assertDatabaseExists * fixing fast test * fixed fast test * fixed stateless test for default db * Update src/Interpreters/DatabaseCatalog.cpp Co-authored-by: Yakov Olkhovskiy <99031427+yakov-olkhovskiy@users.noreply.github.com> * Update src/Interpreters/DatabaseCatalog.cpp Co-authored-by: Yakov Olkhovskiy <99031427+yakov-olkhovskiy@users.noreply.github.com> * Update src/Interpreters/DatabaseCatalog.cpp Co-authored-by: Yakov Olkhovskiy <99031427+yakov-olkhovskiy@users.noreply.github.com> * Fixing tests. * resolved problem with mutex * Fixed mutex in assertDatabaseExists * changes about assertDatabaseExists * fixed bugs with file types * fixed string types * fixed fast test * fixed mutex * fixed mutex * fixed style check * Update src/Interpreters/DatabaseCatalog.cpp Co-authored-by: Yakov Olkhovskiy <99031427+yakov-olkhovskiy@users.noreply.github.com> * Update src/Interpreters/DatabaseCatalog.cpp Co-authored-by: Yakov Olkhovskiy <99031427+yakov-olkhovskiy@users.noreply.github.com> * Update src/Interpreters/DatabaseCatalog.cpp Co-authored-by: Yakov Olkhovskiy <99031427+yakov-olkhovskiy@users.noreply.github.com> * Update src/Interpreters/DatabaseCatalog.cpp Co-authored-by: Yakov Olkhovskiy <99031427+yakov-olkhovskiy@users.noreply.github.com> * Update src/Interpreters/DatabaseCatalog.cpp Co-authored-by: Yakov Olkhovskiy <99031427+yakov-olkhovskiy@users.noreply.github.com> * Update src/Interpreters/DatabaseCatalog.cpp Co-authored-by: Yakov Olkhovskiy <99031427+yakov-olkhovskiy@users.noreply.github.com> * fixed build * added -unlocked versions of functions * Revert "fixed build" This reverts commit 8ce961be210c3cfbca35e0d5fb9f86b2ec42ff78. * Revert "fixed build" This reverts commit 8ce961be210c3cfbca35e0d5fb9f86b2ec42ff78. * changed usage of assertDatabaseExistsUnlocked() * fixed style check * style check * style check * Revert "style check" This reverts commit 28a9ee85a0a801438f05ca8c6604d67b8c132e69. * Merge branch 'master' into hints-for-wrong-db-or-table-name * Changed AssertDatabaseExists and unified exception output * resolved proposed changes and modified tests * Revert "resolved proposed changes and modified tests" This reverts commit d45337d65c16bd55b6bbb5c29023a1d0e5e1a38e. * resolved requested changes * fixed tests * fixed tests * fixed check black * Update include brackets Co-authored-by: Yakov Olkhovskiy <99031427+yakov-olkhovskiy@users.noreply.github.com> * Update suggested changes * Update suggested changes * Fixed style check * Added test to analyzer_integration_broken * Update DatabaseCatalog.cpp * Update test.py * fixed test * Revert "fixed test" This reverts commit ca6d4c17c85b2bebba56ebc24dceac0e425afa0e. * fixed test * Revert "fixed test" This reverts commit fe6d0d9c865fcfe030ea63f370d2930a3bb3b53a, reversing changes made to 22f44967041fbd32f5f8884daa6f8736247f6fd8. * Update test.py * fixed black check * Update test.py * fixed long_log_tinylog_deadlock_race * Update DatabaseCatalog.cpp * Update test.py * style * Update DatabaseCatalog.cpp * Fixed test * implemented for IDatabase * Style check * removed const_cast * Update DatabaseCatalog.h * Update DatabaseCatalog.h * Update DatabaseCatalog.cpp * Update DatabaseCatalog.cpp * Added db name to hints * Update 00002_log_and_exception_messages_formatting.sql * Update 00002_log_and_exception_messages_formatting.sql --------- Co-authored-by: Yakov Olkhovskiy <99031427+yakov-olkhovskiy@users.noreply.github.com>
2023-08-11 10:24:16 +00:00
assert f"Table default.{exclusive_table} does not exist" in result
else:
assert 0 == int(
node.query(
f"""
SELECT count() FROM {exclusive_table};
"""
)
)
PERMANENT_QUERIES = {
"truncate": ("TRUNCATE TABLE {table};", 0),
2022-09-14 13:04:24 +00:00
"detach-partition-all": ("ALTER TABLE {table} DETACH PARTITION ALL;", 0),
"detach-part": ("ALTER TABLE {table} DETACH PARTITION '20221001';", 49),
"drop-part": ("ALTER TABLE {table} DROP PART '20220901_1_1_0';", 49),
}
@pytest.mark.parametrize(
"transaction", ["NoTx", "TxCommit", "TxRollback", "TxNotFinished"]
)
@pytest.mark.parametrize(
"permanent", PERMANENT_QUERIES.values(), ids=PERMANENT_QUERIES.keys()
)
def test_query_is_permanent(transaction, permanent, exclusive_table):
node.query(
f"""
CREATE TABLE {exclusive_table}
(
a Int64,
date Date
)
Engine=MergeTree
PARTITION BY date
ORDER BY a;
"""
)
node.query(
f"""
INSERT INTO {exclusive_table} SELECT number, toDate('2022-09-01') + INTERVAL number DAY FROM numbers(50);
"""
)
query_id = "select-" + exclusive_table
select_handler = node.get_query_request(
f"""
2023-07-24 16:13:15 +00:00
SELECT sleepEachRow(3) FROM {exclusive_table} SETTINGS function_sleep_max_microseconds_per_block = 0;
""",
query_id=query_id,
)
wait_select_start(query_id)
for _ in [1, 2, 3, 4, 5]:
assert is_query_running(query_id)
assert select_handler.process.poll() is None
time.sleep(1)
permanent_query = permanent[0]
result = permanent[1]
statement = permanent_query.format(table=exclusive_table)
if transaction == "TxCommit":
query = f"""
BEGIN TRANSACTION;
{statement}
COMMIT;
"""
elif transaction == "TxRollback":
query = f"""
BEGIN TRANSACTION;
{statement}
ROLLBACK;
"""
result = 50
elif transaction == "TxNotFinished":
query = f"""
BEGIN TRANSACTION;
{statement}
"""
result = 50
else:
query = statement
node.query(query)
node.restart_clickhouse(kill=True)
assert result == int(
node.query(
f"""
SELECT count() FROM {exclusive_table};
"""
)
)