ClickHouse/tests/integration/test_SYSTEM_FLUSH_LOGS/test.py
Azat Khuzhin 103eb17107 Force table creation on SYSTEM FLUSH LOGS (v2)
After this patch SYSTEM FLUSH LOGS will force system.*_log table
creatoins (only for enabled tables of course).

This will avoid such hacks like:

   set log_queries=1;
   select 1;
   system flush logs;

This is the second version of the patch, since first has a deadlock [1]
(reported by @alesapin). This version does not use separate lock and do
not issue CREATE TABLE from the query execution thread, instead it
activate flushing thread to do so, hence this should be the same as if
the table will be created during flush.

  [1]: https://gist.github.com/alesapin/d915d1deaa27d49aa31223daded02be2

Fixes: #11563
Cc: @alesapin
Cc: @nikitamikhaylov
2020-06-11 23:12:23 +03:00

59 lines
1.6 KiB
Python

# 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')
system_logs = [
# disabled by default
('system.part_log', 0),
('system.text_log', 0),
# enabled by default
('system.query_log', 1),
('system.query_thread_log', 1),
('system.trace_log', 1),
('system.metric_log', 1),
]
# Default timeout for flush is 60
# decrease timeout for the test to show possible issues.
timeout = pytest.mark.timeout(30)
@pytest.fixture(scope='module', autouse=True)
def start_cluster():
try:
cluster.start()
yield cluster
finally:
cluster.shutdown()
@pytest.fixture(scope='function')
def flush_logs():
node.query('SYSTEM FLUSH LOGS')
@timeout
@pytest.mark.parametrize('table,exists', system_logs)
def test_system_logs(flush_logs, table, exists):
q = 'SELECT * FROM {}'.format(table)
if exists:
node.query(q)
else:
assert "Table {} doesn't exist".format(table) in node.query_and_get_error(q)
# Logic is tricky, let's check that there is no hang in case of message queue
# is not empty (this is another code path in the code).
@timeout
def test_system_logs_non_empty_queue():
node.query('SELECT 1', settings={
# right now defaults are the same,
# this set explicitly to avoid depends from defaults.
'log_queries': 1,
'log_queries_min_type': 'QUERY_START',
})
node.query('SYSTEM FLUSH LOGS')