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