# pylint: disable=line-too-long
# pylint: disable=unused-argument
# pylint: disable=redefined-outer-name
import pytest
from helpers.cluster import ClickHouseCluster
cluster = ClickHouseCluster(__file__)
node = cluster.add_instance(
"node_default",
main_configs=["configs/config.d/storage_configuration.xml"],
stay_alive=True,
)
@pytest.fixture(scope="module", autouse=True)
def start_cluster():
try:
cluster.start()
yield cluster
finally:
cluster.shutdown()
def test_system_logs_recreate():
system_logs = [
# enabled by default
"query_log",
"query_thread_log",
"part_log",
"trace_log",
"metric_log",
"error_log",
]
node.query("SYSTEM FLUSH LOGS")
for table in system_logs:
assert "ENGINE = MergeTree" in node.query(f"SHOW CREATE TABLE system.{table}")
assert "ENGINE = Null" not in node.query(f"SHOW CREATE TABLE system.{table}")
assert (
len(
node.query(f"SHOW TABLES FROM system LIKE '{table}%'")
.strip()
.split("\n")
)
== 1
)
# NOTE: we use zzz- prefix to make it the last file,
# so that it will be applied last.
for table in system_logs:
node.exec_in_container(
[
"bash",
"-c",
f"""echo "
<{table}>
ENGINE = Null
{table}>
" > /etc/clickhouse-server/config.d/zzz-override-{table}.xml
""",
]
)
node.restart_clickhouse()
node.query("SYSTEM FLUSH LOGS")
for table in system_logs:
assert "ENGINE = MergeTree" not in node.query(
f"SHOW CREATE TABLE system.{table}"
)
assert "ENGINE = Null" in node.query(f"SHOW CREATE TABLE system.{table}")
assert (
len(
node.query(f"SHOW TABLES FROM system LIKE '{table}%'")
.strip()
.split("\n")
)
== 2
)
# apply only storage_policy for all system tables
for table in system_logs:
node.exec_in_container(
[
"bash",
"-c",
f"""echo "
<{table}>
system_tables
{table}>
" > /etc/clickhouse-server/config.d/zzz-override-{table}.xml
""",
]
)
node.restart_clickhouse()
node.query("SYSTEM FLUSH LOGS")
import logging
for table in system_logs:
create_table_sql = node.query(f"SHOW CREATE TABLE system.{table} FORMAT TSVRaw")
logging.debug(
"With storage policy, SHOW CREATE TABLE system.%s is: %s",
table,
create_table_sql,
)
assert "ENGINE = MergeTree" in create_table_sql
assert "ENGINE = Null" not in create_table_sql
assert "SETTINGS storage_policy = 'system_tables'" in create_table_sql
assert (
len(
node.query(f"SHOW TABLES FROM system LIKE '{table}%'")
.strip()
.split("\n")
)
== 3
)
for table in system_logs:
node.exec_in_container(
["rm", f"/etc/clickhouse-server/config.d/zzz-override-{table}.xml"]
)
node.restart_clickhouse()
node.query("SYSTEM FLUSH LOGS")
for table in system_logs:
assert "ENGINE = MergeTree" in node.query(f"SHOW CREATE TABLE system.{table}")
assert "ENGINE = Null" not in node.query(f"SHOW CREATE TABLE system.{table}")
assert (
len(
node.query(f"SHOW TABLES FROM system LIKE '{table}%'")
.strip()
.split("\n")
)
== 4
)
node.query("SYSTEM FLUSH LOGS")
# Ensure that there was no superfluous RENAME's
# IOW that the table created only when the structure is indeed different.
for table in system_logs:
assert (
len(
node.query(f"SHOW TABLES FROM system LIKE '{table}%'")
.strip()
.split("\n")
)
== 4
)
def test_drop_system_log():
node.exec_in_container(
[
"bash",
"-c",
f"""echo "
1000000
" > /etc/clickhouse-server/config.d/yyy-override-query_log.xml
""",
]
)
node.restart_clickhouse()
node.query("select 1")
node.query("system flush logs")
node.query("select 2")
node.query("system flush logs")
assert node.query("select count() >= 2 from system.query_log") == "1\n"
node.query("drop table system.query_log sync")
node.query("select 3")
node.query("system flush logs")
assert node.query("select count() >= 1 from system.query_log") == "1\n"
node.query("drop table system.query_log sync")
node.restart_clickhouse()
node.query("system flush logs")
assert (
node.query("select count() >= 0 from system.query_log") == "1\n"
) # we check that query_log just exists
node.exec_in_container(
["rm", f"/etc/clickhouse-server/config.d/yyy-override-query_log.xml"]
)
node.restart_clickhouse()