ClickHouse/tests/integration/test_rocksdb_read_only/test.py

138 lines
4.2 KiB
Python
Raw Normal View History

# pylint: disable=unused-argument
# pylint: disable=redefined-outer-name
# pylint: disable=line-too-long
import pytest
from helpers.client import QueryRuntimeException
from helpers.cluster import ClickHouseCluster
cluster = ClickHouseCluster(__file__)
node = cluster.add_instance(
"node", main_configs=["configs/rocksdb.xml"], stay_alive=True
)
@pytest.fixture(scope="module")
def start_cluster():
try:
cluster.start()
yield cluster
finally:
cluster.shutdown()
def test_read_only(start_cluster):
# fail if read_only = true and directory does not exist.
with pytest.raises(QueryRuntimeException):
node.query(
"""
CREATE TABLE test (key UInt64, value String) Engine=EmbeddedRocksDB(0, '/var/lib/clickhouse/store/test_rocksdb_read_only', 1) PRIMARY KEY(key);
"""
)
# create directory if read_only = false
node.query(
"""
CREATE TABLE test (key UInt64, value String) Engine=EmbeddedRocksDB(0, '/var/lib/clickhouse/store/test_rocksdb_read_only') PRIMARY KEY(key);
INSERT INTO test (key, value) VALUES (0, 'a'), (1, 'b'), (2, 'c');
"""
)
# fail if create multiple non-read-only tables on the same directory
with pytest.raises(QueryRuntimeException):
node.query(
"""
CREATE TABLE test_fail (key UInt64, value String) Engine=EmbeddedRocksDB(0, '/var/lib/clickhouse/store/test_rocksdb_read_only') PRIMARY KEY(key);
"""
)
with pytest.raises(QueryRuntimeException):
node.query(
"""
CREATE TABLE test_fail (key UInt64, value String) Engine=EmbeddedRocksDB(10, '/var/lib/clickhouse/store/test_rocksdb_read_only') PRIMARY KEY(key);
"""
)
# success if create multiple read-only tables on the same directory
node.query(
"""
CREATE TABLE test_1 (key UInt64, value String) Engine=EmbeddedRocksDB(0, '/var/lib/clickhouse/store/test_rocksdb_read_only', 1) PRIMARY KEY(key);
DROP TABLE test_1;
"""
)
node.query(
"""
CREATE TABLE test_2 (key UInt64, value String) Engine=EmbeddedRocksDB(10, '/var/lib/clickhouse/store/test_rocksdb_read_only', 1) PRIMARY KEY(key);
DROP TABLE test_2;
"""
)
# success if create table on existing directory with no other tables on it
node.query(
"""
DROP TABLE test;
CREATE TABLE test (key UInt64, value String) Engine=EmbeddedRocksDB(10, '/var/lib/clickhouse/store/test_rocksdb_read_only', 1) PRIMARY KEY(key);
"""
)
result = node.query("""SELECT count() FROM test;""")
assert result.strip() == "3"
# fail if insert into table with read_only = true
with pytest.raises(QueryRuntimeException):
node.query(
"""INSERT INTO test (key, value) VALUES (4, 'd');
"""
)
node.query(
"""
DROP TABLE test;
"""
)
def test_dirctory_missing_after_stop(start_cluster):
# for read_only = false
node.query(
"""
CREATE TABLE test (key UInt64, value String) Engine=EmbeddedRocksDB(0, '/var/lib/clickhouse/store/test_rocksdb_read_only_missing') PRIMARY KEY(key);
"""
)
node.stop_clickhouse()
node.exec_in_container(
[
"bash",
"-c",
"rm -r /var/lib/clickhouse/store/test_rocksdb_read_only_missing",
]
)
node.start_clickhouse()
result = node.query(
"""INSERT INTO test (key, value) VALUES (0, 'a');
SELECT * FROM test;
"""
)
assert result.strip() == "0\ta"
node.query(
"""DROP TABLE test;
"""
)
# for read_only = true
node.query(
"""
CREATE TABLE test (key UInt64, value String) Engine=EmbeddedRocksDB(0, '/var/lib/clickhouse/store/test_rocksdb_read_only_missing', 1) PRIMARY KEY(key);
"""
)
node.stop_clickhouse()
node.exec_in_container(
[
"bash",
"-c",
"rm -r /var/lib/clickhouse/store/test_rocksdb_read_only_missing",
]
)
node.start_clickhouse()
with pytest.raises(QueryRuntimeException):
node.query("""INSERT INTO test (key, value) VALUES (1, 'b');""")
result = node.query("""SELECT * FROM test;""")
assert result.strip() == ""
node.query(
"""DROP TABLE test;
"""
)