2020-01-07 10:27:24 +00:00
|
|
|
import pytest
|
|
|
|
|
|
|
|
from helpers.cluster import ClickHouseCluster
|
2023-09-03 13:39:05 +00:00
|
|
|
from helpers.client import QueryRuntimeException
|
2020-01-07 10:27:24 +00:00
|
|
|
|
|
|
|
cluster = ClickHouseCluster(__file__)
|
|
|
|
|
2023-08-20 19:47:17 +00:00
|
|
|
node1 = cluster.add_instance("node1", main_configs=["configs/remote_servers.xml"])
|
|
|
|
node2 = cluster.add_instance("node2", main_configs=["configs/remote_servers.xml"])
|
2020-01-07 10:27:24 +00:00
|
|
|
|
2020-09-16 04:26:10 +00:00
|
|
|
|
2020-01-07 10:27:24 +00:00
|
|
|
@pytest.fixture(scope="module")
|
|
|
|
def start_cluster():
|
|
|
|
try:
|
|
|
|
cluster.start()
|
|
|
|
yield cluster
|
|
|
|
finally:
|
|
|
|
cluster.shutdown()
|
|
|
|
|
|
|
|
|
2023-09-03 13:39:05 +00:00
|
|
|
def test_cluster(start_cluster):
|
2020-01-07 10:27:24 +00:00
|
|
|
assert (
|
|
|
|
node1.query(
|
2024-08-12 05:01:52 +00:00
|
|
|
"SELECT hostName() FROM clusterAllReplicas('one_shard_two_nodes', system.one) ORDER BY ALL"
|
2020-01-07 10:27:24 +00:00
|
|
|
)
|
|
|
|
== "node1\nnode2\n"
|
2022-03-22 16:39:58 +00:00
|
|
|
)
|
2023-09-05 12:24:44 +00:00
|
|
|
|
|
|
|
assert set(
|
|
|
|
node1.query(
|
2024-08-12 05:01:52 +00:00
|
|
|
"""SELECT hostName(), * FROM clusterAllReplicas("one_shard_two_nodes", system.one) ORDER BY ALL"""
|
2023-09-05 12:24:44 +00:00
|
|
|
).splitlines()
|
|
|
|
) == {"node1\t0", "node2\t0"}
|
|
|
|
|
2020-01-07 10:27:24 +00:00
|
|
|
assert (
|
2023-09-03 14:03:18 +00:00
|
|
|
node1.query("SELECT hostName() FROM cluster('one_shard_two_nodes', system.one)")
|
2020-01-07 10:27:24 +00:00
|
|
|
== "node1\n"
|
2022-03-22 16:39:58 +00:00
|
|
|
)
|
2023-09-03 13:39:05 +00:00
|
|
|
assert (
|
2023-09-03 14:03:18 +00:00
|
|
|
node2.query("SELECT hostName() FROM cluster('one_shard_two_nodes', system.one)")
|
2023-09-03 13:39:05 +00:00
|
|
|
== "node2\n"
|
|
|
|
)
|
|
|
|
|
|
|
|
|
2024-04-08 14:50:13 +00:00
|
|
|
def test_global_in(start_cluster):
|
2024-04-09 15:17:26 +00:00
|
|
|
node1.query("DROP TABLE IF EXISTS u;")
|
|
|
|
node1.query("CREATE TABLE u(uid Int16) ENGINE=Memory as select 0")
|
2024-04-08 14:50:13 +00:00
|
|
|
|
|
|
|
assert set(
|
|
|
|
node1.query(
|
2024-08-12 05:01:52 +00:00
|
|
|
"""SELECT hostName(), * FROM clusterAllReplicas("one_shard_two_nodes", system.one) where dummy GLOBAL IN u ORDER BY ALL"""
|
2024-04-08 14:50:13 +00:00
|
|
|
).splitlines()
|
|
|
|
) == {"node1\t0", "node2\t0"}
|
|
|
|
|
|
|
|
|
2023-09-03 13:39:05 +00:00
|
|
|
@pytest.mark.parametrize(
|
|
|
|
"cluster",
|
|
|
|
[
|
|
|
|
pytest.param("one_shard_three_nodes"),
|
|
|
|
pytest.param("two_shards_three_nodes"),
|
2023-09-03 14:03:18 +00:00
|
|
|
],
|
2023-09-03 13:39:05 +00:00
|
|
|
)
|
|
|
|
def test_skip_unavailable_replica(start_cluster, cluster):
|
|
|
|
assert (
|
|
|
|
node1.query(
|
2024-08-12 05:01:52 +00:00
|
|
|
f"SELECT hostName() FROM clusterAllReplicas('{cluster}', system.one) ORDER BY ALL settings skip_unavailable_shards=1"
|
2023-09-03 13:39:05 +00:00
|
|
|
)
|
|
|
|
== "node1\nnode2\n"
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
|
|
"cluster",
|
|
|
|
[
|
|
|
|
pytest.param("one_shard_three_nodes"),
|
|
|
|
pytest.param("two_shards_three_nodes"),
|
2023-09-03 14:03:18 +00:00
|
|
|
],
|
2023-09-03 13:39:05 +00:00
|
|
|
)
|
|
|
|
def test_error_on_unavailable_replica(start_cluster, cluster):
|
|
|
|
# clusterAllReplicas() consider each replica as shard
|
|
|
|
# so when skip_unavailable_shards=0 - any unavailable replica should lead to an error
|
|
|
|
with pytest.raises(QueryRuntimeException):
|
|
|
|
node1.query(
|
2024-08-12 05:01:52 +00:00
|
|
|
f"SELECT hostName() FROM clusterAllReplicas('{cluster}', system.one) ORDER BY ALL settings skip_unavailable_shards=0"
|
2023-09-03 13:39:05 +00:00
|
|
|
)
|