4c391f8e99
* initial commit: add setting and stub * typo * added test stub * fix * wip merging new integration test and code proto * adding steps interpreters * adding firstly proposed solution (moving parts etc) * added checking zookeeper path existence * fixing the include * fixing and sorting includes * fixing outdated struct * fix the name * added ast ptr as level of indirection * fix ref * updating the changes * working on test stub * fix iterator -> reference * revert rocksdb submodule update * fixed show privileges test * updated the test stub * replaced rand() with thread_local_rng(), updated the tests updated the test fixed test config path test fix removed error messages fixed the test updated the test fixed string literal fixed literal typo: = * fixed the empty replica error message * updated the test and the code with logs * updated the possible test cases, updated * added the code/test milestone comments * updated the test (added more testcases) * replaced native assert with CH one * individual replicas recursive delete fix * updated the AS db.name AST * two small logging fixes * manually generated AST fixes * Updated the test, added the possible algo change * Some thoughts about optimizing the solution: ALTER MOVE PARTITION .. TO TABLE -> move to detached/ + ALTER ... ATTACH * fix * Removed the replica sync in test as it's invalid * Some test tweaks * tmp * Rewrote the algo by using the executeQuery instead of hand-crafting the ASTPtr. Two questions still active. * tr: logging active parts * Extracted the parts moving algo into a separate helper function * Fixed the test data and the queries slightly * Replaced query to system.parts to direct invocation, started building the test that breaks on various parts. * Added the case for tables when at least one replica is alive * Updated the test to test replicas restoration by detaching/attaching * Altered the test to check restoration without replica restart * Added the tables swap in the start if the server failed last time * Hotfix when only /replicas/replica... path was deleted * Restore ZK paths while creating a replicated MergeTree table * Updated the docs, fixed the algo for individual replicas restoration case * Initial parts table storage fix, tests sync fix * Reverted individual replica restoration to general algo * Slightly optimised getDataParts * Trying another solution with parts detaching * Rewrote algo without any steps, added ON CLUSTER support * Attaching parts from other replica on restoration * Getting part checksums from ZK * Removed ON CLUSTER, finished working solution * Multiple small changes after review * Fixing parallel test * Supporting rewritten form on cluster * Test fix * Moar logging * Using source replica as checksum provider * improve test, remove some code from parser * Trying solution with move to detached + forget * Moving all parts (not only Committed) to detached * Edited docs for RESTORE REPLICA * Re-merging * minor fixes Co-authored-by: Alexander Tokmakov <avtokmakov@yandex-team.ru> |
||
---|---|---|
.. | ||
helpers | ||
test_access_control_on_cluster | ||
test_aggregation_memory_efficient | ||
test_allowed_client_hosts | ||
test_allowed_url_from_config | ||
test_alter_codec | ||
test_alter_on_mixed_type_cluster | ||
test_alter_settings_on_cluster | ||
test_always_fetch_merged | ||
test_asynchronous_metric_log_table | ||
test_atomic_drop_table | ||
test_attach_without_checksums | ||
test_attach_without_fetching | ||
test_authentication | ||
test_backup_restore | ||
test_backup_with_other_granularity | ||
test_backward_compatibility | ||
test_block_structure_mismatch | ||
test_broken_part_during_merge | ||
test_buffer_profile | ||
test_catboost_model_config_reload | ||
test_catboost_model_first_evaluate | ||
test_catboost_model_reload | ||
test_check_table | ||
test_cleanup_dir_after_bad_zk_conn | ||
test_cluster_all_replicas | ||
test_cluster_copier | ||
test_compression_codec_read | ||
test_compression_nested_columns | ||
test_concurrent_queries_for_all_users_restriction | ||
test_concurrent_queries_for_user_restriction | ||
test_concurrent_ttl_merges | ||
test_config_corresponding_root | ||
test_config_substitutions | ||
test_config_xml_full | ||
test_config_xml_main | ||
test_config_xml_yaml_mix | ||
test_config_yaml_full | ||
test_config_yaml_main | ||
test_consistant_parts_after_move_partition | ||
test_consistent_parts_after_clone_replica | ||
test_create_user_and_login | ||
test_cross_replication | ||
test_custom_settings | ||
test_ddl_alter_query | ||
test_ddl_worker_non_leader | ||
test_default_compression_codec | ||
test_default_database_on_cluster | ||
test_default_role | ||
test_delayed_replica_failover | ||
test_dictionaries_access | ||
test_dictionaries_all_layouts_separate_sources | ||
test_dictionaries_complex_key_cache_string | ||
test_dictionaries_ddl | ||
test_dictionaries_dependency | ||
test_dictionaries_dependency_xml | ||
test_dictionaries_mysql | ||
test_dictionaries_null_value | ||
test_dictionaries_postgresql | ||
test_dictionaries_redis | ||
test_dictionaries_select_all | ||
test_dictionaries_update_and_reload | ||
test_dictionaries_update_field | ||
test_dictionary_allow_read_expired_keys | ||
test_dictionary_custom_settings | ||
test_dictionary_ddl_on_cluster | ||
test_disabled_mysql_server | ||
test_disk_access_storage | ||
test_disk_types | ||
test_distributed_backward_compatability | ||
test_distributed_ddl | ||
test_distributed_ddl_on_cross_replication | ||
test_distributed_ddl_parallel | ||
test_distributed_ddl_password | ||
test_distributed_format | ||
test_distributed_inter_server_secret | ||
test_distributed_load_balancing | ||
test_distributed_over_distributed | ||
test_distributed_queries_stress | ||
test_distributed_respect_user_timeouts | ||
test_distributed_storage_configuration | ||
test_distributed_system_query | ||
test_drop_replica | ||
test_enabling_access_management | ||
test_extreme_deduplication | ||
test_fetch_partition_from_auxiliary_zookeeper | ||
test_fetch_partition_should_reset_mutation | ||
test_fetch_partition_with_outdated_parts | ||
test_filesystem_layout | ||
test_force_deduplication | ||
test_force_drop_table | ||
test_format_avro_confluent | ||
test_format_schema_on_server | ||
test_freeze_table | ||
test_globs_in_filepath | ||
test_grant_and_revoke | ||
test_graphite_merge_tree | ||
test_grpc_protocol | ||
test_grpc_protocol_ssl | ||
test_hedged_requests | ||
test_hedged_requests_parallel | ||
test_host_ip_change | ||
test_http_and_readonly | ||
test_http_handlers_config | ||
test_https_replication | ||
test_inherit_multiple_profiles | ||
test_input_format_parallel_parsing_memory_tracking | ||
test_insert_distributed_async_extra_dirs | ||
test_insert_distributed_async_send | ||
test_insert_distributed_load_balancing | ||
test_insert_into_distributed | ||
test_insert_into_distributed_sync_async | ||
test_insert_into_distributed_through_materialized_view | ||
test_jbod_balancer | ||
test_jdbc_bridge | ||
test_join_set_family_s3 | ||
test_keeper_auth | ||
test_keeper_back_to_back | ||
test_keeper_internal_secure | ||
test_keeper_multinode_blocade_leader | ||
test_keeper_multinode_simple | ||
test_keeper_persistent_log | ||
test_keeper_persistent_log_multinode | ||
test_keeper_restore_from_snapshot | ||
test_keeper_secure_client | ||
test_keeper_snapshots | ||
test_keeper_snapshots_multinode | ||
test_library_bridge | ||
test_limited_replicated_fetches | ||
test_log_family_hdfs | ||
test_log_family_s3 | ||
test_logs_level | ||
test_match_process_uid_against_data_owner | ||
test_materialize_mysql_database | ||
test_max_http_connections_for_replication | ||
test_MemoryTracking | ||
test_merge_table_over_distributed | ||
test_merge_tree_empty_parts | ||
test_merge_tree_hdfs | ||
test_merge_tree_s3 | ||
test_merge_tree_s3_failover | ||
test_merge_tree_s3_restore | ||
test_merge_tree_s3_with_cache | ||
test_multiple_disks | ||
test_mutations_hardlinks | ||
test_mutations_in_partitions_of_merge_tree | ||
test_mutations_with_merge_tree | ||
test_mysql_database_engine | ||
test_mysql_protocol | ||
test_no_local_metadata_node | ||
test_non_default_compression | ||
test_odbc_interaction | ||
test_old_versions | ||
test_on_cluster_timeouts | ||
test_optimize_on_insert | ||
test_part_log_table | ||
test_part_moves_between_shards | ||
test_part_uuid | ||
test_partition | ||
test_parts_delete_zookeeper | ||
test_passing_max_partitions_to_read_remotely | ||
test_polymorphic_parts | ||
test_postgresql_database_engine | ||
test_postgresql_protocol | ||
test_profile_events_s3 | ||
test_prometheus_endpoint | ||
test_query_deduplication | ||
test_quorum_inserts | ||
test_quorum_inserts_parallel | ||
test_quota | ||
test_random_inserts | ||
test_range_hashed_dictionary_types | ||
test_read_temporary_tables_on_failure | ||
test_recompression_ttl | ||
test_recovery_replica | ||
test_redirect_url_storage | ||
test_relative_filepath | ||
test_reload_auxiliary_zookeepers | ||
test_reload_clusters_config | ||
test_reload_max_table_size_to_drop | ||
test_reload_zookeeper | ||
test_reloading_settings_from_users_xml | ||
test_reloading_storage_configuration | ||
test_remote_prewhere | ||
test_rename_column | ||
test_replace_partition | ||
test_replica_can_become_leader | ||
test_replicated_database | ||
test_replicated_fetches_bandwidth | ||
test_replicated_fetches_timeouts | ||
test_replicated_merge_tree_config | ||
test_replicated_merge_tree_s3 | ||
test_replicated_merge_tree_s3_zero_copy | ||
test_replicated_merge_tree_with_auxiliary_zookeepers | ||
test_replicated_mutations | ||
test_replicated_parse_zk_metadata | ||
test_replicating_constants | ||
test_replication_credentials | ||
test_replication_without_zookeeper | ||
test_restore_replica | ||
test_role | ||
test_row_policy | ||
test_s3_cluster | ||
test_s3_with_https | ||
test_s3_with_proxy | ||
test_s3_zero_copy_replication | ||
test_secure_socket | ||
test_select_access_rights | ||
test_send_crash_reports | ||
test_send_request_to_leader_replica | ||
test_server_initialization | ||
test_settings_constraints | ||
test_settings_constraints_distributed | ||
test_settings_profile | ||
test_storage_hdfs | ||
test_storage_kafka | ||
test_storage_kerberized_hdfs | ||
test_storage_kerberized_kafka | ||
test_storage_mongodb | ||
test_storage_mysql | ||
test_storage_postgresql | ||
test_storage_rabbitmq | ||
test_storage_s3 | ||
test_system_clusters_actual_information | ||
test_system_ddl_worker_queue | ||
test_system_flush_logs | ||
test_system_merges | ||
test_system_metrics | ||
test_system_queries | ||
test_system_replicated_fetches | ||
test_table_functions_access_rights | ||
test_text_log_level | ||
test_timezone_config | ||
test_tmp_policy | ||
test_ttl_move | ||
test_ttl_replicated | ||
test_union_header | ||
test_user_directories | ||
test_user_ip_restrictions | ||
test_user_zero_database_access | ||
test_version_update | ||
test_version_update_after_mutation | ||
test_zookeeper_config | ||
.dockerignore | ||
.gitignore | ||
ci-runner.py | ||
CMakeLists.txt | ||
conftest.py | ||
parallel_skip.json | ||
parallel.json | ||
parallel.readme | ||
pytest.ini | ||
README.md | ||
runner |
ClickHouse integration tests
This directory contains tests that involve several ClickHouse instances, custom configs, ZooKeeper, etc.
Running natively
Prerequisites:
- Ubuntu 14.04 (Trusty) or higher.
- docker. Minimum required API version: 1.25, check with
docker version
.
You must install latest Docker from https://docs.docker.com/engine/installation/linux/docker-ce/ubuntu/#set-up-the-repository Don't use Docker from your system repository.
- pip and
libpq-dev
. To install:sudo apt-get install python3-pip libpq-dev zlib1g-dev libcrypto++-dev libssl-dev libkrb5-dev
- py.test testing framework. To install:
sudo -H pip install pytest
- docker-compose and additional python libraries. To install:
sudo -H pip install \
PyMySQL \
aerospike \
avro \
cassandra-driver \
confluent-kafka \
dicttoxml \
docker \
docker-compose==1.22.0 \
grpcio \
grpcio-tools \
kafka-python \
kazoo \
minio \
protobuf \
psycopg2-binary==2.7.5 \
pymongo \
pytest \
pytest-timeout \
redis \
tzlocal \
urllib3 \
requests-kerberos \
dict2xml
(highly not recommended) If you really want to use OS packages on modern debian/ubuntu instead of "pip": sudo apt install -y docker docker-compose python3-pytest python3-dicttoxml python3-docker python3-pymysql python3-pymongo python3-tzlocal python3-kazoo python3-psycopg2 kafka-python python3-pytest-timeout python3-minio
If you want to run the tests under a non-privileged user, you must add this user to docker
group: sudo usermod -aG docker $USER
and re-login.
(You must close all your sessions (for example, restart your computer))
To check, that you have access to Docker, run docker ps
.
Run the tests with the pytest
command. To select which tests to run, use: pytest -k <test_name_pattern>
By default tests are run with system-wide client binary, server binary and base configs. To change that, set the following environment variables:
CLICKHOUSE_TESTS_SERVER_BIN_PATH
to choose the server binary.CLICKHOUSE_TESTS_CLIENT_BIN_PATH
to choose the client binary.CLICKHOUSE_TESTS_BASE_CONFIG_DIR
to choose the directory from which base configs (config.xml
andusers.xml
) are taken.
For tests that use common docker compose files you may need to set up their path with environment variable: DOCKER_COMPOSE_DIR=$HOME/ClickHouse/docker/test/integration/runner/compose
Running with runner script
The only requirement is fresh configured docker and docker pull yandex/clickhouse-integration-tests-runner
Notes:
- If you want to run integration tests without
sudo
you have to add your user to docker groupsudo usermod -aG docker $USER
. More information about docker configuration. - If you already had run these tests without
./runner
script you may have problems with pytest cache. It can be removed withrm -r __pycache__ .pytest_cache/
. - Some tests maybe require a lot of resources (CPU, RAM, etc.). Better not try large tests like
test_cluster_copier
ortest_distributed_ddl*
on your laptop.
You can run tests via ./runner
script and pass pytest arguments as last arg:
$ ./runner --binary $HOME/ClickHouse/programs/clickhouse --bridge-binary $HOME/ClickHouse/programs/clickhouse-odbc-bridge --base-configs-dir $HOME/ClickHouse/programs/server/ 'test_odbc_interaction -ss'
Start tests
============================= test session starts ==============================
platform linux2 -- Python 2.7.15rc1, pytest-4.0.0, py-1.7.0, pluggy-0.8.0
rootdir: /ClickHouse/tests/integration, inifile: pytest.ini
collected 6 items
test_odbc_interaction/test.py Removing network clickhouse_default
...
Killing roottestodbcinteraction_node1_1 ... done
Killing roottestodbcinteraction_mysql1_1 ... done
Killing roottestodbcinteraction_postgres1_1 ... done
Removing roottestodbcinteraction_node1_1 ... done
Removing roottestodbcinteraction_mysql1_1 ... done
Removing roottestodbcinteraction_postgres1_1 ... done
Removing network roottestodbcinteraction_default
==================== 6 passed, 1 warnings in 95.21 seconds =====================
Path to binary and configs maybe specified via env variables:
$ export CLICKHOUSE_TESTS_BASE_CONFIG_DIR=$HOME/ClickHouse/programs/server/
$ export CLICKHOUSE_TESTS_SERVER_BIN_PATH=$HOME/ClickHouse/programs/clickhouse
$ export CLICKHOUSE_TESTS_ODBC_BRIDGE_BIN_PATH=$HOME/ClickHouse/programs/clickhouse-odbc-bridge
$ ./runner 'test_odbc_interaction'
$ # or ./runner '-v -ss'
Start tests
============================= test session starts ==============================
platform linux2 -- Python 2.7.15rc1, pytest-4.0.0, py-1.7.0, pluggy-0.8.0
rootdir: /ClickHouse/tests/integration, inifile: pytest.ini
collected 6 items
test_odbc_interaction/test.py ...... [100%]
==================== 6 passed, 1 warnings in 96.33 seconds =====================
You can just open shell inside a container by overwritting the command: ./runner --command=bash
Rebuilding the docker containers
The main container used for integration tests lives in docker/test/integration/Dockerfile
. Rebuild it with
cd docker/test/integration
docker build -t yandex/clickhouse-integration-test .
The helper container used by the runner
script is in docker/test/integration/runner/Dockerfile
.
Adding new tests
To add new test named foo
, create a directory test_foo
with an empty __init__.py
and a file
named test.py
containing tests in it. All functions with names starting with test
will become test cases.
helpers
directory contains utilities for:
- Launching a ClickHouse cluster with or without ZooKeeper in docker containers.
- Sending queries to launched instances.
- Introducing network failures such as severing network link between two instances.
To assert that two TSV files must be equal, wrap them in the TSV
class and use the regular assert
statement. Example: assert TSV(result) == TSV(reference)
. In case the assertion fails, pytest
will automagically detect the types of variables and only the small diff of two files is printed.
Troubleshooting
If tests failing for misterious reasons, this may help:
sudo service docker stop
sudo bash -c 'rm -rf /var/lib/docker/*'
sudo service docker start
iptables-nft
On Ubuntu 20.10 and later in host network mode (default) one may encounter problem with nested containers not seeing each other. It happens because legacy and nftables rules are out of sync. Problem can be solved by:
sudo iptables -P FORWARD ACCEPT