工程实践

  • 使用C++17,内存管理上以RAII为规范。
  • 引入Expect Monad简化返回值错误处理。
  • 基于C++的asio异步模块设计网络模块与线程池模块。
  • 使用CMake构建工程
  • 使用了asio/rocksdb/gtest/glog三方库

单元测试

  • 使用gtest作为单元测试框架
  • 模块化开发,各个模块都支持单元测试。例如lock/record/rocks_kvstore/network等模块,都有对应的单元模块测试

集成测试

  • tclsh,使用Tendis存储版替换原生redis,复用redis的测试用例
  • go集成测试,基于go代码,测试集群、备份恢复、复制、故障处理等复杂场景。

代码规范

Google C++ Style Guide

Tendis遵循Google C++ Style Guide 规范,使用cpplint工具。

提交时保证cpplint执行通过。例如,可将如下脚本放到.git/hooks/pre-commit中:

  1. files=`git diff --name-only HEAD HEAD~1`
  2. echo "$files" | while read file
  3. do
  4. if [[ $file =~ \.cc$ || $file =~ \.h$ || $file =~ \.hpp$ || $file =~ \.cpp$ ]]; then
  5. if [[ -f $file ]]; then
  6. if [[ $file =~ optional\.h$ ]]; then
  7. continue
  8. else
  9. echo "cpplint --filter=\"-runtime/reference\" $file"
  10. cpplint --filter="-runtime/reference" $file
  11. if [[ $? -ne 0 ]]; then
  12. echo "Run cpplint against $file failed..."
  13. exit 1
  14. fi
  15. fi
  16. fi
  17. fi
  18. done

格式化工具

格式化依赖clang-format工具。具体格式看文件.clang-format