1月4日事件更新
UTC时间1月4日23:59,在约40分钟内,deno.land/x
和 deno.land/std
上提供的模块未能正确加载。这是由于一个存在缺陷的补丁导致代码以HTML而非原始文本的形式提供。本文详细介绍了具体发生的情况以及我们未来将采取的防范措施。
所有服务现已恢复正常运行。没有数据丢失。我们非常重视此类中断事件,并为造成的不便深表歉意。
事件时间线
UTC时间23:59,一项变更被合并到deno.land 仓库,该变更改进了语言服务器客户端的补全建议。它还包含了对代码的重构,该代码用于判断是向客户端提供原始代码,还是提供封装在HTML中的代码以在浏览器中显示。该代码对运行时客户端的行为做出了错误的假设,导致HTML被提供给了运行时客户端,而非原始代码。
周三UTC时间00:20,尝试回滚此逻辑,但部署未成功。
UTC时间00:39,代码再次被修改,直接引用 deno.land
的早期部署作为依赖项,这使得代码得以部署并恢复服务。
根本原因
deno.land/x
和 deno.land/std
向运行时提供了封装在HTML用户界面中的代码,而非纯代码。代码被重构以提供更符合规范的内容协商,但未考虑到 Deno CLI 和 Deno Deploy 等运行时客户端在请求中提供了 Accept
头部,表明所有内容类型(包括 text/html
)都是可接受的,因此代码向这些客户端提供了HTML。
Deno Deploy 缺少“回滚”(revert)功能,这意味着无法回滚到上一个提交,而推送到新提交(其依赖于 deno.land/x
和 deno.land/std
上托管的代码)也并非易事。
用于确定客户端是获取HTML还是纯代码的代码在测试时,对 Deno CLI 和 Deploy 发送的头部信息做出了错误的假设。
影响
在40分钟的中断期间,Deno Deploy 上依赖于 deno.land/x
或 deno.land/std
的新部署均告失败,提示依赖项不是有效的模块。此外,任何未在 Deno CLI 中本地缓存的 deno.land/x
或 deno.land/std
远程依赖项也会失败,提示依赖项不是有效的模块。
下一步是什么?
我们正在向 deno.land
worker 添加测试,以检验此代码的正确行为。我们还在努力为 Deno Deploy 添加一项功能,以允许“回滚”或“还原”(revert)到先前的部署。