tangled.org 近期針對其自動化 WPT(Web Platform Tests)測試基建進行了一次深度除錯與修補,揭露三起相互獨立的連環故障。第一起故障發生於 aspect-ratio 任務的 clone 階段:原本用於 bench lane 工作樹的符號連結(symlink)設定,從未被套用於 job clone,導致 `wpt` 階段回報「suite wpt … missing on the share」錯誤;修補後於 clone 內以「僅在本地無資料時建立連結」的方式重新掛載。第二起故障源自 folknet lane 0 的檔案描述器繼承問題:sccache 服務啟動時繼承了排程刷新鎖的檔案描述器,導致後續所有刷新動作皆誤判「另一個刷新正在進行中」,即使實際上並無任何程序在跑;修補方式是將執行緒完全包入 `flock -n -o`,由 flock 行程持有鎖並於執行命令時關閉之。第三起故障源自 NFS 上的 EEXIST 競爭:lock 暫存目錄名稱含本次執行的 PID 與隨機位元組,卻在第一次排程刷新時就收到 EEXIST 錯誤,暗示 mkdir 被重傳後成功;修補策略為抑制已存在時的 shell 錯誤訊息,避免誤導後續診斷。
此事件本質屬於軟體工程領域的基礎設施韌性與分散式系統除錯實錄,並非涉及國家、企業或利益團體之間的策略性博弈,因此不宜以利益角力框架進行解讀。深入剖析其技術與結構性成因,更能凸顯當代開源測試自動化平台所面臨的深層挑戰。
從歷史脈絡觀察,WPT 套件作為跨瀏覽器網頁標準相容性測試的基石,長期以來仰賴大量分散式工作節點與共享檔案系統(如 folknet share 所使用的 NFS)來同步測試套件。此一架構在帶來高效能、可平行化優勢的同時,也遺留了 UNIX 檔案描述器、NFS 鎖定語意與 POSIX flock 機制之間的微妙不一致。檔案描述器繼承問題之所以長期潛伏,反映出容器化與工作樹 clone 模型下,行程邊界與檔案系統鎖的關係並非顯而易見——sccache 伺服器繼承父行程的 fd,導致 flock 鎖在子行程結束後仍被佔用,是分散式系統中典型的「隱形資源洩漏」。
從技術原理脈絡觀察,`flock` 與 `fcntl` 在 NFS 上的語意差異是業界老問題:NFS 對 flock 的支援並非原生,而是透過 lockd 模擬,且檔案描述器一旦被繼承,即使原行程已退出,鎖仍可能因參照計數非零而無法釋放。引入 `-o` 旗標(關閉繼承)是 flock(1) 的標準解法,但容易被忽略。EEXIST 競爭則源自 NFS 的弱一致性(weak consistency)模型:不同節點對目錄是否存在的判斷,可能在數十毫秒內出現短暫分歧,導致本應冪等的 mkdir 因重傳而失敗。修補方式選擇「容忍已存在」而非「重試」,反映團隊傾向於讓失敗路徑更安靜,而非更複雜。
方面,2017 年 Chromium 從 NFS 轉向更分散式快取架構時曾遭遇類似的 fd 繼承與 lock 污染問題,最終以引入 process_group 隔離與顯式 fcntl 鎖重設解決;2021 年 GitHub Actions 在大規模 runner 池也曾因類似症狀造成 CI 卡死,需以 timeout + flock 雙保險緩解。這顯示分散式測試基建的鎖定足這類問題並非個案,而是平台規模化過程中的結構性常態。
基於以上脈絡,未來 12 至 24 個月可預見以下三種情境:
針對平台架構師與開源維護者,提供以下行動決策建議:
01 起因觸發:aspect-ratio 任務的 clone 階段從未執行 lane-apply.sh 的符號連結設定
02 一階傳導:WPT 套件於共享端被回報缺失,導致 aspect-ratio 整條 CI 流水線中斷
03 二階擴散:sccache 繼承 fd 後污染 folknet lane 0 的排程刷新鎖,使所有後續 refresh 假性卡住
04 三階外溢:NFS 共享端的 EEXIST 競爭使 WPT suite refresh 失敗,可能影響跨瀏覽器標準相容性測試的時效性
05 宏觀終局:分散式 CI 平台在 fd 繼承與檔案系統弱一致性下的結構性脆弱性被再次驗證,推動業界重新思考 NFS 與 POSIX 鎖在現代 CI 基建中的定位
因果網路圖譜 3 節點
可拖曳節點 · 點兩下開啟文章
ACLED 地緣衝突與安全熱區監測
ELEVATED (灰色地帶高壓)監測熱區:台海與西太平洋第一島鏈 (Taiwan Strait & First Island Chain)(台灣海峽 · 巴士海峽 · 南海九段線)
📡 區域安全態勢評估: 海空聯合戰備警巡與海警常態化執法壓縮海峽中線默契,牽動全球 50% 貨櫃船隊通過之黃金水道風險溢價。