ClickHouse为了一款性能极佳的开源OLAP数据库,在最近几年也是越来越火,除了在各大互联网公司落地生根之外,也吸引了一大批热心的贡献者。
截止到v21.10版本,CH在全球一共有1064名contributor。
SELECT count(1) FROM system.contributors Query id: 7cdf54f1-cb50-45c0-99b9-14d73d283e39 ┌─count()─┐ │ 1064 │ └─────────┘
而要给社区贡献代码,首先就要经历一次完整的开发、编译和测试过程,文本将总结上述流程中常用到的一些工具和技巧,希望对有志于贡献CH代码的同学能有所帮助。
开发
开发环境配置可参考以下文章
- C++开发环境最佳实践
- vscode clangd c++开发常见问题和解决方案
编译
在编译之前,下载最新代码
git clone https://github.com/clickhouse/clickhouse
然后git submodule三连, 拉取第三方库代码
git submodule update --init --recursive git submodule foreach git checkout . git submodule sync --recursive
接下来便是编译了,由于社区已经明确不支持gcc
了,所以建议使用clang-12或clang-13编译。
mkdir -p build_clang cd build_clang cmake -G Ninja "-DCMAKE_C_COMPILER=$(command -v clang-13)" "-DCMAKE_CXX_COMPILER=$(command -v clang++-13)" -DCMAKE_BUILD_TYPE=Debug -DENABLE_TESTS=0 -DENABLE_UTILS=0 -DENABLE_THINLTO=0 -DENABLE_NURAFT=0 -DDISABLE_HERMETIC_BUILD=1 .. ninja clickhouse
调试
调试环境搭建可参考:vscode c++远程调试实战
另外调试CH的过程中最好忽略SIGUSR1
和SIGUSR2
信号(这俩信号用于统计query的一些指标),否则你会发现调试过程老被这俩信号打断。
debugger为gdb
时,设置:
handle SIGUSR1 noprint nostop handle SIGUSR2 noprint nostop
debugger为lldb
时,设置:
pro hand -p false -s false -n false SIGUSR1 pro hand -p false -s false -n false SIGUSR1
测试
虽然社区已经有github actions用于检查新提交PR, 但肯定不如本地检查来的快。以下将介绍几个常用的测试工具:
check-style
check-style用于检查代码风格,CH对代码的要求还是比较高的,所以建议写完代码之后用check-style工具跑一遍,看看有哪些地方不符合社区的要求。
./utils/check-style/check-style | tee style.log
一般新手常见的错误有两种:
- 大括号没有换行写
- 行尾有空格
functional test
CH中最普遍最常用的一种测试情况,输入为sql或shell文件, 输出为sql执行结果,如果发现sql预期执行结果与实际不同,则判定该functional test失败。
那么如何运行functional test呢,分两种情况
对于输入为sql的functional test:
export CLICKHOUSE_CLIENT="/path/to/clickhouse client --host XX --port XX --user XX --password XX -m" cat tests/queries/0_stateless/XXX.sql | $CLICKHOUSE_CLIENT
对于输入为shell的:
export CLICKHOUSE_CLIENT="/path/to/clickhouse client --host XX --port XX --user XX --password XX -m" bash -x tests/queries/0_stateless/01675_distributed_bytes_to_delay_insert_long.sh
fast test
被社区用于对PR的快速验证,会执行编译,并运行部分functional tests。当你发现提交的PR没通过fast test时,最好的办法便是在本地环境复现它。
export LLVM_VERSION=13 export PULL_REQUEST_NUMBER=31104 export stage="" # stage按照顺序有"", clone_root, run, clone_submodules, run_cmake, build, configure, run_test等选项,用户可按需设置stage参数。 export FASTTEST_WORKSPACE=/path/to/fasttest/workspace # fast test会在该目录下下载PR代码并编译运行 cd ./docker/test/fasttest bash -x run.sh | tee run.log
integration test
在CH中,有很多测试依赖集群环境或者其他组件(mysql, zookeeper, hdfs等等),这时functional test便行不通了,所以社区引入了integration test
在本地我们仍可运行集成测试,以test_storage_hdfs为例:
cd $prefix/tests/integration sudo ./runner --binary $prefix/build_clang/programs/clickhouse --odbc-bridge-binary $prefix/b