RFC-0175:ELF 執行器 stdio 轉送預設值

RFC-0175:ELF Runner stdio 轉送預設值
狀態已接受
區域
  • 元件架構
說明

預設將 stdout/stderr 轉送至 LogSink,改善元件開發人員體驗。

問題
Gerrit 變更
作者
審查人員
提交日期 (年-月-日)2022-06-03
審查日期 (年-月-日)2022-07-06

摘要

變更 ELF runner 的預設值,以便將 stdout 和 stderr 轉送至 LogSink (如果可用)。

提振精神

這個 RFC 以 RFC-0069 為基礎,該 RFC 指定了 ELF 執行元件的功能,以便支援將 stdout 和 stderr 轉送至 fuchsia.logger.LogSink。自從實作這項功能以來,我們發現在許多情況下,元件雖然有 LogSink,但在從元件 v1 遷移至 v2 時,會遺漏重要的記錄訊息,因為在遷移過程中,stdout/stderr 訊息會遭到靜默捨棄。

Fuchsia 的測試執行程式預設會擷取及顯示 stdout 和 stderr,而使用者經常會因 ELF 執行元件 (需要明確轉寄) 的不同行為而感到困惑。

如果程式碼只在未經常執行的失敗模式中使用 stdio,就會導致未設定的 stdout 或 stderr 出現意外,導致實際當機報告缺少重要資訊。舉例來說,ZX_ASSERT 巨集會將失敗的斷言回報至 stderr,而 HLCPP FIDL 繫結會將某些類型的剖析錯誤回報至 stderr。

相關人員

導師:hjfreyer@google.com

審查者:

  • geb@google.com (元件架構)
  • yaneury@google.com (RFC-0069 作者)

諮詢對象:hjfreyer@google.com、abdulla@google.com、miguelfrde@google.com、surajmalhotra@google.com、wez@google.com、shayba@google.com

社交化:這個 RFC 是元件架構團隊在電子郵件和離線討論後的成果。

設計

如果 ELF 元件作者在 program 區段中未指定 forward_stdout_toforward_stderr_to 欄位,ELF 執行元件會嘗試為未指定的串流設定轉送。在這個設定中,如果無法將 stdio 串流轉送至 LogSink,系統會保持靜默,元件仍會啟動。

實作

我們會放寬將 stdio 轉送至 LogSink 的行為,這樣一來,如果元件要求轉送但沒有 LogSink,還是會啟動。

如果元件資訊清單中未指定 forward_stdout_to: "log"forward_stderr_to: "log",ELF 執行元件會假設預設值為 forward_stdout_to: "log"forward_stderr_to: "log"

如果初始化轉送作業時發生錯誤,ELF 執行元件仍會將 stdout 和/或 stderr 句柄提供給要求或預設為轉送的已啟動元件。

成效

我們認為這項變更不會對成效造成太大差異。

人體工學

提供實用的預設行為,可減少元件開發人員需要做出的決策數量,進而改善人因工程。

我們會在完成這項變更的實作後刪除 sdk/lib/syslog/elf_stdio.shard.cml,並將其用戶端切換至主要 syslog 分片,後者會對 ELF 元件執行相同的行為。

回溯相容性

如果元件沒有 LogSink,且使用預設 stdio 轉送設定,當元件嘗試在其命名空間中開啟 LogSink 時,就會在元件管理服務工具的記錄中產生路由錯誤。在新的預設值初始推出時,我們會在平台元件資訊清單中加入明確的 forward_std{out,err}_to: "none" 欄位,但不會加入 LogSink。日後,您可以使用更精密的命名空間探查功能,判斷元件是否應提供 LogSink,藉此消除這些錯誤訊息。

安全性考量

這項設計不會透過授予元件任何額外功能來提高元件的權限,只有在元件資訊清單要求 LogSink 且已將該能力導向時,才會啟用轉送功能。

隱私權注意事項

這會導致系統記錄寫入額外的記錄訊息,其中可能包含使用者產生的資料。記錄管道已設有控制項,可稽核及清除隱私權敏感資料,因此不需要進行任何變更。

測試

我們已針對 stdio 轉送功能進行整合測試,並將擴展至涵蓋預設情境。

說明文件

您需要更新多個元件開發人員指南,通常是為了移除必須設定 stdio 轉送的警告。這表示這項變更將降低開發或遷移元件的認知複雜度。

缺點、替代方案和未知事項

缺點:增加「魔法」

這項變更會為啟動 ELF 元件新增行為,且不像多數元件功能那樣,要求元件在資訊清單中指定任何內容。不過,這種行為變更並不會增加元件所授予的權限。

本 RFC 中提出的行為,是試圖在元件架構設計原則 (明確性、最小權限) 和現有類 POSIX 系統中開發人員的期望 (stdio 是普遍且實用的功能) 之間取得平衡。

替代做法:合理化執行緒

如果我們將測試執行工具變更為實際使用 ELF 執行元件做為基礎實作,就能讓 ELF 執行元件和測試執行工具的行為更為相似。目前 ELF 和測試執行工具會共用 Rust 程式庫的實作程式碼,但其實可以讓執行工具將實作工作委派給其他執行工具,藉此共用實作程式碼。

這也是許多其他原因值得追求的方向。這項工作比變更 ELF 執行元件的預設值更為龐大,而作者認為我們仍希望將此 RFC 的行為設為 ELF 執行元件的預設值,以確保統一的開發人員體驗。

既有技術與參考資料

本 RFC 提出 RFC-0069 所述功能的擴充功能。