2022-09-02 10:45:37 +00:00
|
|
|
# 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');
|
|
|
|
"""
|
|
|
|
)
|
2022-09-03 02:44:07 +00:00
|
|
|
# fail if create multiple non-read-only tables on the same directory
|
2022-09-02 10:45:37 +00:00
|
|
|
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);
|
|
|
|
"""
|
|
|
|
)
|
2022-09-03 02:44:07 +00:00
|
|
|
# success if create multiple read-only tables on the same directory
|
|
|
|
node.query(
|
2022-09-02 10:45:37 +00:00
|
|
|
"""
|
2022-09-03 02:44:07 +00:00
|
|
|
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;
|
|
|
|
"""
|
|
|
|
)
|
2022-09-02 10:45:37 +00:00
|
|
|
# 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;
|
|
|
|
"""
|
|
|
|
)
|