Hasty Briefsbeta

双语

How to reproduce and fix an I/O data race with Go and DTrace

7 months ago
  • #Race Condition
  • #TOCTOU
  • #Go
  • CI中的测试失败被追踪到由于写入和读取goroutine之间同步不当导致的文件数据竞争问题。
  • 该问题属于TOCTOU(检查时间与使用时间差)问题——读取前检查了文件是否存在,但此时写入操作尚未完成。
  • 一个最小化的Go复现代码重现了这种竞态条件,读取操作有时会看到空文件或部分内容。
  • 使用DTrace观察系统和Go函数调用,揭示了写入和读取操作的交错执行情况。
  • 通过`chill` DTrace动作模拟磁盘延迟,有效提高了竞态条件的复现概率。
  • 修复方案移除了冗余的`os.Stat`检查,并通过重试机制确保读取成功,彻底解决了TOCTOU问题。
  • 本文重点强调了在文件操作前使用`stat(2)`的不必要性及其可能引发的TOCTOU缺陷。
  • `chill` DTrace动作被特别推荐为模拟延迟、检测竞态条件的实用工具。