開發與維運

聊聊ClickHouse的開發、編譯和測試

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的過程中最好忽略SIGUSR1SIGUSR2信號(這倆信號用於統計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

Leave a Reply

Your email address will not be published. Required fields are marked *