mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-24 16:42:05 +00:00
104 lines
3.1 KiB
Python
104 lines
3.1 KiB
Python
|
import pytest
|
||
|
import logging
|
||
|
import time
|
||
|
from helpers.cluster import ClickHouseCluster
|
||
|
from helpers.test_tools import TSV
|
||
|
from helpers.test_tools import assert_eq_with_retry
|
||
|
|
||
|
cluster = ClickHouseCluster(__file__)
|
||
|
node1 = cluster.add_instance("node1", stay_alive=True, with_zookeeper=True)
|
||
|
node2 = cluster.add_instance("node2", with_zookeeper=True)
|
||
|
|
||
|
instance = node1
|
||
|
q = node1.query
|
||
|
|
||
|
path_to_data = "/var/lib/clickhouse/"
|
||
|
|
||
|
|
||
|
@pytest.fixture(scope="module")
|
||
|
def started_cluster():
|
||
|
try:
|
||
|
cluster.start()
|
||
|
yield cluster
|
||
|
finally:
|
||
|
cluster.shutdown()
|
||
|
|
||
|
|
||
|
def wait_merged_part(table, part_name, retries=100):
|
||
|
q("OPTIMIZE TABLE {} FINAL".format(table))
|
||
|
for i in range(retries):
|
||
|
result = q(
|
||
|
"SELECT name FROM system.parts where table='{}' AND name='{}'".format(
|
||
|
table, part_name
|
||
|
)
|
||
|
)
|
||
|
if result:
|
||
|
return True
|
||
|
time.sleep(0.5)
|
||
|
else:
|
||
|
return False
|
||
|
|
||
|
|
||
|
def test_make_clone_covered_by_broken_detached_dir_exists(started_cluster):
|
||
|
q("DROP TABLE IF EXISTS test_make_clone_cvbdde SYNC")
|
||
|
|
||
|
q(
|
||
|
"CREATE TABLE test_make_clone_cvbdde(n int, m String) ENGINE=ReplicatedMergeTree('/test_make_clone_cvbdde', '1') ORDER BY n SETTINGS old_parts_lifetime=3600, min_age_to_force_merge_seconds=1, min_age_to_force_merge_on_partition_only=0"
|
||
|
)
|
||
|
path = path_to_data + "data/default/test_make_clone_cvbdde/"
|
||
|
|
||
|
q("INSERT INTO test_make_clone_cvbdde VALUES (0, 'hbl')")
|
||
|
|
||
|
q("INSERT INTO test_make_clone_cvbdde VALUES (1, 'hbl')")
|
||
|
if not (wait_merged_part("test_make_clone_cvbdde", "all_0_1_1")):
|
||
|
assert False, "Part all_0_1_1 doesn't appeared in system.parts"
|
||
|
|
||
|
q("INSERT INTO test_make_clone_cvbdde VALUES (2, 'hbl')")
|
||
|
if not (wait_merged_part("test_make_clone_cvbdde", "all_0_2_2")):
|
||
|
assert False, "Part all_0_2_2 doesn't appeared in system.parts"
|
||
|
|
||
|
q("INSERT INTO test_make_clone_cvbdde VALUES (3, 'hbl')")
|
||
|
if not (wait_merged_part("test_make_clone_cvbdde", "all_0_3_3")):
|
||
|
assert False, "Part all_0_3_3 doesn't appeared in system.parts"
|
||
|
|
||
|
res = str(instance.exec_in_container(["ls", path]).strip().split("\n"))
|
||
|
|
||
|
# broke the merged parts
|
||
|
instance.exec_in_container(
|
||
|
[
|
||
|
"bash",
|
||
|
"-c",
|
||
|
"echo 'broken' > {}".format(path + "all_0_1_1/data.bin"),
|
||
|
]
|
||
|
)
|
||
|
|
||
|
instance.exec_in_container(
|
||
|
[
|
||
|
"bash",
|
||
|
"-c",
|
||
|
"echo 'broken' > {}".format(path + "all_0_2_2/data.bin"),
|
||
|
]
|
||
|
)
|
||
|
|
||
|
instance.exec_in_container(
|
||
|
[
|
||
|
"bash",
|
||
|
"-c",
|
||
|
"echo 'broken' > {}".format(path + "all_0_3_3/data.bin"),
|
||
|
]
|
||
|
)
|
||
|
|
||
|
instance.restart_clickhouse(kill=True)
|
||
|
|
||
|
assert [
|
||
|
"broken-on-start_all_0_1_1",
|
||
|
"broken-on-start_all_0_2_2",
|
||
|
"broken-on-start_all_0_3_3",
|
||
|
"covered-by-broken_all_0_0_0",
|
||
|
"covered-by-broken_all_1_1_0",
|
||
|
"covered-by-broken_all_2_2_0",
|
||
|
"covered-by-broken_all_3_3_0",
|
||
|
] == sorted(
|
||
|
instance.exec_in_container(["ls", path + "detached/"]).strip().split("\n")
|
||
|
)
|