RFC-0156:串流附加模式

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

在串流中新增附加模式。

問題
Gerrit 變更
作者
審查人員
提交日期 (年-月-日)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_APPEND」的 zx_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_APPEND0 值呼叫 zx_object_set_property,即可將串流從附加模式中取出。
    • 使用 ZX_PROP_STREAM_MODE_APPEND0 以外的任何值呼叫 zx_object_set_property,會將串流設為附加模式。
    • 如果是 zx_object_get_property 呼叫 (含 ZX_PROP_STREAM_MODE_APPEND),如果串流處於附加模式,屬性值會是 1;如果串流未處於附加模式,屬性值會是 0
  3. 系統將移除 zx_stream_writevZX_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_APPEND zx_stream_writev

支援串流的檔案系統通常會實作 fuchsia.io/File.ReadWriteSeek,方法是將要求內部調度至串流。每個連線都會追蹤其附加模式,以回應 GetFlags 要求,因此使用 ZX_STREAM_APPENDzx_stream_writev 十分方便。

移除 ZX_STREAM_APPEND 會強制檔案系統保持連線的附加模式,以及串流的附加模式同步,這並不困難。相較於保留 ZX_STREAM_APPEND,我們更希望縮減 API 介面面積並符合 POSIX。

既有技術和參考資料

zx_stream_createZX_STREAM_MODE_APPEND 類似, open 與 POSIX 的 O_APPEND 類似。

zx_object_set_propertyZX_PROP_STREAM_MODE_APPEND 類似於 fcntl 與 POSIX 的 F_SETFLO_APPEND