Retrospective and Technical Details on the recent Firefox Outage

Bài tóm tắt Mozilla 2022 3. Quy mô lớn Độ khó: Trung bình

Mozilla · 2022 · 3. Quy mô lớn · Độ khó: Trung bình — bài gốc

Bối cảnh

  • Firefox gọi nhiều service nội bộ (update, telemetry, chứng chỉ, crash report) đặt sau load balancer của nhiều cloud. Trên GCP, load balancer có cài đặt HTTP/3 ba trạng thái; Mozilla để "Automatic (default)".
  • Ngày 13/1/2022 lúc 07:28 UTC, GCP âm thầm đổi mặc định sang bật HTTP/3. Firefox dùng HTTP/3 khi server hỗ trợ, nên một số kết nối tới service nội bộ đổi giao thức.

Diễn biến

  • Crash report tăng vọt, nhiều báo cáo trình duyệt treo. Team thấy client treo trong một request mạng, nhưng tìm mãi "thay đổi kích hoạt" mà không thấy: không ship update, không đổi cấu hình.
  • Nghi một thay đổi "vô hình" của cloud; log cho thấy load balancer của Telemetry đang phục vụ HTTP/3. Tắt HTTP/3 tường minh lúc 09:12 UTC: user hết treo (gần 2 giờ ảnh hưởng toàn cầu).
  • Gốc: thành phần Rust gọi mạng qua thư viện viaduct, vốn chữ thường hoá header. Kiểm tra Content-Length ở tầng API của Necko không phân biệt hoa thường, còn code HTTP/3 cấp thấp có phân biệt, nên không thấy header, coi request đã xong trong khi body chưa gửi, và lặp vô hạn. Mọi request đi qua một socket thread, nên cả trình duyệt mất mạng. Telemetry là thành phần Rust duy nhất đặt Content-Length, nên tắt telemetry cũng "chữa" được dù lỗi không nằm ở telemetry.
  • Các service quan trọng như update có cờ beConservative cấm công nghệ thử nghiệm (HTTP/3), nên không bị.

Bài học (theo Mozilla)

  • Thay đổi mặc định không báo trước của nhà cung cấp; có báo thì có lẽ đã thử có kiểm soát ở staging.
  • Để cấu hình ở "default" thay vì chọn tường minh là cho phép bên khác đổi hành vi của mình; rà lại mọi cấu hình service.
  • Tổ hợp HTTP/3 + viaduct không có trong CI; cần system test với nhiều phiên bản HTTP.

Bài học cho SWE

  • Một thay đổi deploy có thể không phải của bạn: giá trị "default" của nhà cung cấp là một phụ thuộc có thể đổi bất cứ lúc nào (Deploy và release an toàn).
  • Khi không tìm thấy thay đổi nào của mình, nhìn sang tầng hạ tầng ngoài (log giao thức) sớm (Sự cố và postmortem).
  • Một vòng lặp không trả lỗi trong thread dùng chung biến lỗi cục bộ thành sập toàn bộ.
  • Đường đi quan trọng (update) nên bảo thủ về công nghệ: đó là đường để phát bản vá.

Liên quan