RFC-0156:串流附加模式

RFC-0156:串流附加模式
狀態已接受
區域
  • 核心
說明

為串流新增附加模式。

問題
  • 88678
變更
  • 664693
作者
審查人員
提交日期 (年/月)2022-04-06
審查日期 (年/月)2022-04-20

摘要

這個 RFC 提議修改串流 API,方法是在串流中新增附加模式,並從 zx_stream_writev 移除附加選項。

提振精神

串流附加選項 ZX_STREAM_APPEND 目前只能在 C++ VFS 中使用,以便針對 memfs 實作 fuchsia.io/File.Write。所有 Memfs 串流都會在 FIDL 連線的伺服器端串流,其中已知連線的附加模式。透過存取附加模式,選擇性地將 ZX_STREAM_APPEND 傳遞給每個 zx_stream_writev 呼叫,這對這個特定情況有效。

實作使用者空間分頁器的寫回後,串流可以傳送至 FIDL 連線的用戶端,以大幅提高 IO 效能。使用目前的串流 API 將串流移至用戶端時,則需要 fdio 追蹤連線的附加模式。

設計

總覽

這項設計的目標是避免在 fdio 中追蹤附加模式,並讓串流 API 以更內嵌的方式與 POSIX 整合。

串流 API 類似於在 POSIX 中讀取、寫入及搜尋檔案,但附加方式除外。在 POSIX 中,您可以將 O_APPEND 傳遞至 open,以附加模式開啟檔案。在附加模式中對檔案進行的所有 POSIX write 呼叫行為與使用 ZX_STREAM_APPEND 選項的 zx_stream_writev 類似。

在串流中新增附加模式,可避免 fdio 儲存附加模式,並以 POSIX 更以內嵌方式呈現。新增後,不再需要使用 zx_stream_writevZX_STREAM_APPEND 選項。

API 變更

本 RFC 由 3 個 API 變更組成:

  1. 系統將會新增名為 ZX_STREAM_MODE_APPENDzx_stream_create 新選項。使用 ZX_STREAM_MODE_APPEND 建立的串流會進入附加模式。在附加模式中,對串流的所有 zx_stream_writev 呼叫都會如同 ZX_STREAM_APPEND 傳遞至 zx_stream_writev 呼叫一樣。

  2. 系統會新增名為 ZX_PROP_STREAM_MODE_APPEND 的屬性。Fdio 必須使用這個屬性,才能使用 F_SETFLO_APPEND 實作 fcntl

    • ZX_PROP_STREAM_MODE_APPEND 的值類型為 uint8_t
    • 使用 ZX_PROP_STREAM_MODE_APPEND 呼叫 zx_object_set_property 且值為 0 時,會停止附加模式。
    • 使用 ZX_PROP_STREAM_MODE_APPEND 呼叫 zx_object_set_property 且任何值不是 0 時,會使串流進入附加模式。
    • 對於使用 ZX_PROP_STREAM_MODE_APPENDzx_object_get_property 呼叫,如果串流正在附加,則屬性的值為 1;如果串流未處於附加模式,則屬性的值為 0
  3. 系統將移除「zx_stream_writev」的「ZX_STREAM_APPEND」選項。

實作

以下 RFC 將在 3 個 Gerrit 變更中實作:

  1. ZX_STREAM_MODE_APPENDZX_PROP_STREAM_MODE_APPEND 新增至串流 API。

  2. 將 C++ VFS 從 ZX_STREAM_APPEND 遷移至 ZX_STREAM_MODE_APPENDZX_PROP_STREAM_MODE_APPEND

  3. 從串流 API 中移除 ZX_STREAM_APPEND 選項。

效能

這項提案應該對成效沒有影響。

人體工學

將附加模式儲存在串流中,可將串流 API 內嵌在 fuchsia.io/Directory.Openopen 中,因為開發人員應該熟悉這種模式。

安全性考量

無。

隱私權注意事項

無。

測試

核心測試將用於執行新的 API,包括使用多個執行緒的測試。

Memfs 使用的現有 fs_test 套件已包含附加相關測試,應在遷移期間擷取任何潛在的迴歸問題。

說明文件

Zircon 串流說明文件將更新為 API 的變更。

缺點、替代方案和未知

替代方案:將附加模式儲存在 fdio 中

直接將連線的附加模式儲存在 fdio 中,然後依原樣使用串流 API。

建議將附加模式儲存在串流中,因為此模式與 POSIX 的附加方式相符。

替代做法:為zx_stream_writev保留 ZX_STREAM_APPEND

支援串流的檔案系統通常會將要求分派至內部串流,藉此實作 fuchsia.io/File.ReadWriteSeek。每個連線都已追蹤其附加模式,用於回應 GetFlags 要求,讓使用 zx_stream_writevZX_STREAM_APPEND 相當方便。

移除 ZX_STREAM_APPEND 會強制檔案系統保持連線的附加模式,同時讓串流的附加模式保持同步,這點並不困難。比起保留 ZX_STREAM_APPEND,建議減少 API 介面區域並比對 POSIX。

先前的圖片和參考資料

zx_stream_create 帶有 ZX_STREAM_MODE_APPENDopen 來自 POSIX 的 O_APPEND

具有 ZX_PROP_STREAM_MODE_APPENDzx_object_set_property 類似於 POSIX 的 F_SETFLO_APPENDfcntl