Databend 的质量保障

质量保障(Quality Assurance)用于确认产品和服务能够满足规定的质量需求。让我们一起来看一下 Databend 的质量保障实践。

作为从 Day 1 就开源的现代云数仓,Databend 依托于 GitHub Actions 建立了一套相对完备的质量保障体系,以支撑快速迭代。

简介

Databend 的质量保障大概分为以下几个方面:

流程篇

  • Issue 管理
  • 周期性维护
  • 版本发布与路线图

基础篇

  • 代码审计
  • 跨平台编译
  • 性能监控

测试篇

  • 单元测试
  • 功能测试

流程篇

好的流程有助于质量保障,从而持续推动 Databend 的进步。

Issue 管理

质量保障离不开对 Issue 的管理。Features / Bugs / Questions ,不同的分类决定了投递的形式和处理的方式。

目前,Databend 格外关注 Bugs 类 Issue ,要求提供包括版本、报错、复现步骤并要求确认是否会提交相关的补丁。

Databend 团队成员会检查 Issue 、沟通确认情况并进行评估。如确认存在需求,则会根据优先级和排期处理;而对于缺陷,则会及时修复并进行验证。

周期性维护

周期性维护的目标是:在保证 Databend 稳定的前提下,有序推进工具链和依赖的更新。

Databend 会在每月初进行一次集中维护:

  • 将工具链更新到当前最新版本,应用对应的审计规则;
  • 更新并协调依赖版本,确保构建工作能够有效进行。

在无特殊需要的情况下,避免工具链和依赖版本的频繁变更,可以降低协作成本,帮助开发工作的稳定推进。

版本发布与路线图

当前 Databend 采用 nightly release 和 milestone release 结合的发布机制。每日都会发布的 nightly release 有助于日常情况的跟踪,而不定期的 milestone release 则方便进行阶段性的规划。

Databend 的路线图由年度规划和版本计划组成,年度规划将会列出当年关注的一些主要目标,而版本计划则会根据当前的开发情况和 issue 组成进行调整。

随着版本和路线图的不断演进,对 Databend 的质量也会有更高的要求,比如稳定性、跨版本兼容性等。

基础篇

除了测试之外,推进质量保障的一些常规手段。

代码审计

代码审计是保障 Databend 代码质量和稳定构建的第一道关口,在这一过程中,主要关注以下两个方面:

  • 代码检查:许可协议是否正确设置、代码有无格式化、以及通过静态分析检测常见的错误和可以优化的代码。
  • 依赖审计:是否引入了存在安全漏洞的依赖,以及是否引入了多余的依赖。

代码审计不光是提高质量的一种手段,同时也能降低 reviewer 的负担。

跨平台编译

作为跨平台的 Cloud Warehouse ,确保在各个平台上的顺利编译也是质量保障的重要环节。

Databend 的跨平台编译主要是针对 Linux(GNU) 和 MacOS 这两个平台,且完成对 x86aarch64 两种体系结构的支持。额外地,在 release 阶段,也会构建针对 Linux(MUSL) 的静态编译版本。

对于日常提交,需要保证能够顺利在这些平台上完成构建。

性能监控

性能监控是质量保障中必不可少的一环,目前 Databend 主要关注:

  • In-Memory 向量化引擎的性能:一些数值计算任务,由 numbers 表函数提供百亿级别的数据。
  • 常规查询分析任务下的性能:目前选用 OnTime 数据集和对应的一组常见分析查询。

所有数据都会收集到 datafuselabs/databend-perf 这一 repo 中。访问 https://perf.databend.rs 即可查看可视化结果。

测试篇

测试是确保开发迭代和质量控制的重要内容。

单元测试

单元测试主要考虑基本组成单元(如:函数、过程)的正确性。

Databend 目前共有接近 800 条单元测试,对重点函数做到了应测尽测。通过 Mock 部分全局状态,帮助开发者更加容易的编写测试用例。

所有单元测试按 crate 进行组织,分布在对应的 tests/it 目录下,并按对应模块进行组织。这种编排方式可以减轻测试构建压力,在修改/添加新的测试时,无需重复编译对应的 lib 。

功能测试

每个功能都是由若干函数/过程组成的,功能测试正是为评估功能的正确性而设立。功能测试会以 standalone 和 cluster 两种模式进行,以确保 Databend 的分布式执行功能,。

当前 Databend 的功能测试主要由 sqllogictest 测试和 stateful 测试两个部分组成,这两类测试都可以在 tests 目录下找到。

sqllogictest 即 SQL 逻辑测试,是为了解决之前的 stateless 的一些旧有问题而专门设计实现的测试方案。RFC | New SQL Logic Test Framework 中介绍了其基本背景和方案概要。

Databend stateful 功能测试目前采用 Clickhouse 的方法,将测试所需执行的 SQL 集放入一个文件,预期结果集放入另一个文件。在测试时会调用 SQL 集生成对应的测试结果集,并与预期结果集进行对比。

进一步探索

上面简要介绍了 Databend 日常开发中涉及的质量保障内容,但质量保障体系仍然处于持续演进的过程中,这里列出了一些值得关注的内容:

  • SQLancer,一款针对数据库管理系统DBMS的自动化安全测试工具。Databend 计划使用这一工具探测潜在的逻辑错误,目前作为 OSPP 2022 项目 ,由 @hanyisong 同学负责开发,可以关注 SQLancer supports databend
  • Domain-aware Fuzzing,Databend 有一个针对 SQL Parser 的简单模糊测试,但只是生成一些随机字符串。一个比较值得探索的方式是像 sqlsmith 那样的方案,生成更有意义和具有针对性的测试用例。