RFC-0175:ELF Runner stdio 轉送預設值 | |
---|---|
狀態 | 已接受 |
區域 |
|
說明 | 根據預設,將 stdout/stderr 轉送至 LogSink,改善元件開發人員體驗。 |
問題 | |
變更 | |
作者 | |
審查人員 | |
提交日期 (年/月) | 2022-06-03 |
審查日期 (年/月) | 2022-07-06 |
摘要
將「ELF Runner」變更為預設值,將 stdout 和 stderr 轉送至 LogSink (如有)。
提振精神
這個 RFC 以 RFC-0069 為基礎建構,後者會指定 ELF 執行元件的功能,以便支援將 stdout 和 stderr 轉送到 fuchsia.logger.LogSink
的功能。自實作這項功能後,我們發現在許多情況下,元件在從元件 v1 遷移至 v2 時,會缺少重要的記錄訊息,因為其 stdout/stderr 訊息會在轉換過程中自動捨棄。LogSink
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_to
或 forward_stderr_to
欄位,ELF 執行元件就會嘗試為未指定的串流設定轉送。在這個設定中,任何無法將 stdio 串流轉送至 LogSink 的作業都會靜音,而且元件仍會啟動。
實作
我們將放寬將 stdio 轉送至 LogSink 的行為,讓在要求轉送但不具備 LogSink 的元件時,仍會保持啟動狀態。
如果在元件資訊清單中未指定任何值,ELF 執行元件會假設其預設值為 forward_stdout_to: "log"
和 forward_stderr_to: "log"
。
ELF 執行元件仍會為已要求的已啟動元件提供 stdout 和/或 stderr 控點,以在初始化轉送發生錯誤時要求或預設為轉寄。
效能
這項變更應該不會造成太大的效能差異。
人體工學
擁有實用的預設行為應減少元件開發人員需要做出的決策次數,進而提升符合人體工學的品質。
在完成這項變更的實作後,我們會刪除 sdk/lib/syslog/elf_stdio.shard.cml
,並將其用戶端切換至主要系統記錄檔資料分割,而 ELF 元件的行為也會相同。
回溯相容性
未使用預設 stdio 轉送設定的元件而沒有 LogSink 時,當元件管理員嘗試在其命名空間中開啟 LogSink 時,會在 元件管理員的記錄檔中產生轉送錯誤。在新預設設定中,我們會為沒有 LogSink 的平台元件資訊清單加入明確的 forward_std{out,err}_to: "none"
欄位。日後,您可以使用更複雜的命名空間探測功能,判斷元件是否應具備 LogSink 是否可用,以消除這些錯誤訊息。
安全性考量
這項設計不會透過授予任何其他功能來提高元件的權限,而是只有在其資訊清單要求 LogSink 並轉送該能力時,才會啟用轉送。
隱私權注意事項
這會導致系統將額外的記錄訊息寫入系統記錄,其中可能包含使用者產生的資料。記錄管道已有用於稽核及清除隱私機密資料的控制項,因此您不必在這裡進行任何變更。
測試
stdio 轉送功能目前已有整合測試,並進一步涵蓋預設情境。
說明文件
元件開發人員指南中需要更新的部分,通常即可移除必須設定 stdio 轉送的警告。這表示這項變更可降低開發或遷移元件的認知複雜度。
缺點、替代方案和未知
缺點:增加「魔術」
這項變更會新增啟動 ELF 元件的行為,不需要指定資訊清單中的任何內容,這點與大多數元件功能不同。不過,此行為變更不會增加元件的權限。
在本 RFC 中建議的行為,會在元件架構設計原則 (明確性、最低權限) 與開發人員對現有 POSIX 類似系統中的開發人員期望之間做出不良影響 (stdio 是全面性的必備功能)。
替代方法:合理化跑者
如果將測試執行器變更為實際使用 ELF 執行元件做為基礎實作,我們可以讓 ELF 執行元件和測試執行器以類似的方式運作。目前 ELF 和測試執行器會共用 Rust 程式庫中的實作程式碼,而是允許執行者委派給其他執行元件以分享實作程式碼。
基於許多其他原因,這個策略很吸引人。比起變更 ELF 執行元件的預設值,這遠比變更大上許多,作者認為我們仍希望這個 RFC 的行為做為 ELF 執行元件中的預設值,以確保一致的開發人員體驗。
先前的圖片和參考資料
這個 RFC 建議使用 RFC-0069 中所述的功能。