The Consensus - Articles

3 篇内容

技术文章The Consensus - Articles

Data races and the limits of ThreadSanitizer in C and Go

文章以 C 和 Go 为例解释数据竞争定义,并指出 ThreadSanitizer(TSan)文档不足、实现已到 v3。作者用 Python 实现理想化的多线程 C 子集解释器,再接入 FastTrack 风格向量时钟作为竞态检测器,展示 TSan 的大致原理。随后通过可复现实验说明 TSan 的资源预算盲区:255 线程槽、14 位同步释放计数、每 8 字节 4 个访问单元都可能溢出,导致漏报明显竞态;Go 的 sync.Pool 地址哈希复用也会掩盖竞态。结论是 TSan 仍很有价值,但无报告不等于无竞态,使用者需理解其适用边界。

推荐收录。文章不是泛泛介绍竞态,而是通过自建解释器和检测器、C/Go 可复现实验,直接展示 TSan 在 255 线程、计数器、访问槽和 sync.Pool 上的漏报机制,证据具体且可迁移。适合使用 C/Go 并发、维护 CI 竞态检测或研究动态分析工具的读者,能帮助建立“无报告≠无竞态”的判断,并指导压测与人工复核。

工程实践The Consensus - Articles

Another look at SQLite's WAL-Reset bug

文章深入复现并分析 SQLite 长期存在的 WAL-Reset 并发缺陷:checkpoint 过程中因读到了陈旧的共享内存状态,可能把已提交的 WAL 帧误判为已回填并丢弃。作者用约 100 行 C 代码构造两个线程、三个数据库连接的工作负载,借助大 mmap 拉长 checkpoint 的竞态窗口,仅通过公开 API 就在数秒内触发永久丢写,偶尔还会造成数据库文件损坏。文章逐行对照 wal.c 中的交织时序,并用 Thread Sanitizer 定位到 nBackfill 的原子写与陈旧读之间的冲突;在 3.53.0 修复版上不再复现,但在 SQLITE_DEBUG 构建下仍会触发一处断言失败。该复现依赖特定时序与较大数据库,缺陷本身仍较罕见,但说明应用主动执行 checkpoint 时需要关注丢写风险并及时升级版本。

推荐收录。文章给出可直接编译运行的约 100 行 C 复现代码,并逐行对应 wal.c 时序,稳定复现丢写与损坏,证据扎实且可验证。对使用 SQLite WAL、负责数据库可靠性或排查并发缺陷的工程师有直接参考价值,其竞态窗口构造、sanitizer 定位和版本对照验证的方法也可迁移到其他存储系统。

工程实践The Consensus - Articles

The road to ACID transactions in Cassandra 6

文章在单机三节点 Cassandra 6.0 预发布集群上,用记账转账负载对比四种事务方案的 ACID 表现:默认覆盖写、BATCH、轻量级事务(LWT/Paxos)以及基于 EPaxos 的 Accord 事务。作者用并发测试工具 Monastery 构造盲写与读改写两类负载,并区分单分区与跨分区场景,通过第三个读线程实时校验两账户余额恒为 2000。结论显示:默认写常违反隔离性;BATCH 在单分区提供原子与隔离,但跨分区只保证最终原子应用、不保证隔离,且客户端时间戳相撞时会按单元格取较大值导致总和错误;LWT 能实现单分区严格可串行化的条件更新,但条件批次无法跨分区。Accord 通过 transactional_mode='full' 首次提供跨分区严格可串行化事务,但作者在单分区并发读中观测到余额不变量被破坏,随后被 Apple 工程师确认是真实 bug。文章边界在于使用本地无故障环境、事务为非交互式、Cassandra 6 尚未正式发布。

收录理由是它用可复现的三节点实验逐项验证 Cassandra 从 BATCH、LWT 到 Accord 的事务语义边界,并附带集群搭建脚本、CQL 负载与失败证据(时间戳并列取大、跨分区条件批次报错、Accord 隔离性 bug)。适合分布式数据库研发、存储与共识协议方向读者,可迁移价值在于理解原子性、隔离性、可串行化在不同机制下的取舍,以及如何设计并发不变量测试来发现真实缺陷。