内容提要
2023年7月20日12:17至12:30 UTC期间,由于部署中包含下载URL生成的错误,导致crates.io上的所有crate下载都无法正常进行。在此期间,crates.io平均每秒收到4.71K个请求,共有约370万个请求失败,包括cargo的重试尝试。开发人员在部署后通过监控仪表板上升的请求每秒数发现了这一事件。此时,升高的数字的根本原因尚不清楚,但社区成员通过Zulip通知了开发人员。通知后,损坏的部署立即回滚到先前的部署,修复了下载问题。在此之前,有一个合并到crates.io的pull request,将crate和readme下载端点生成的重定向URL进行了重构。然而,该pull request引入了一些测试,但不幸的是,它使用的值与crates.io在生产中使用的环境变量内容不同,导致生产代码路径未经适当测试。生产代码路径存在一个错误,即从“CDN前缀”和“路径”组件生成的URL缺少斜杠(/)分隔符。这导致https://crates.io/api/v1/crates/smallvec/1.10.0/download重定向到https://static.crates.iocrates/smallvec/smallvec-1.10.0.crate,而不是https://static.crates.io/crates/smallvec/smallvec-1.10.0.crate。这个问题影响了所有在此期间尝试从crates.io下载crate文件的用户。用户在运行cargo时会看到类似以下错误的消息:警告:虚假的网络错误(剩余3次尝试):[6]无法解析主机名(无法解析主机:static.crates.iocrates)警告:虚假的网络错误(
关键要点
- 2023年7月20日12:17至12:30 UTC期间,crates.io上的所有crate下载因部署错误而无法正常进行。
- 在此期间,crates.io平均每秒收到4.71K个请求,约370万个请求失败,包括cargo的重试尝试。
- 开发人员通过监控仪表板发现请求数异常,社区成员通过Zulip通知了开发人员。
- 损坏的部署在通知后立即回滚,修复了下载问题。
- 2023年7月19日17:41 UTC,合并的pull request重构了crate和readme下载端点生成的重定向URL。
- 该pull request引入的测试使用了与生产环境变量不同的值,导致生产代码路径未经过适当测试。
- 生产代码路径中的错误导致生成的URL缺少斜杠,导致下载重定向到错误的URL。
- 在事件发生的13分钟内,所有尝试从crates.io下载crate文件的用户都受到影响。
- 用户在运行cargo时会看到无法解析主机名的错误消息。
- 开发人员在监控Grafana仪表板时注意到请求数异常,随后社区成员通过Zulip通知了团队。
- 事件被检测到后,开发人员立即通过Heroku用户界面回滚到先前的部署。
- 回滚后,系统立即恢复并生成正确的重定向URL。
- 修复了损坏的pull request,并在合并后进行了更多测试。
- 根本原因分析显示,代码结构使得测试不同路径变得困难,缺乏高影响pull request的检查清单。
- 烟雾测试程序未包括crate下载,且目前为手动过程。
- 检测时间可以更快,如果更早识别出重试行为导致的问题。
- 所有代码应结构化以便于测试不同代码路径,需明确哪些pull request需要代码审查。
- 烟雾测试程序应包括crate下载,并尽可能自动化。