RFC-0156:串流附加模式 | |
---|---|
狀態 | 已接受 |
區域 |
|
說明 | 為串流新增附加模式。 |
問題 | |
變更 | |
作者 | |
審查人員 | |
提交日期 (年/月) | 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_writev
的 ZX_STREAM_APPEND
選項。
API 變更
本 RFC 由 3 個 API 變更組成:
系統將會新增名為
ZX_STREAM_MODE_APPEND
的zx_stream_create
新選項。使用ZX_STREAM_MODE_APPEND
建立的串流會進入附加模式。在附加模式中,對串流的所有zx_stream_writev
呼叫都會如同ZX_STREAM_APPEND
傳遞至zx_stream_writev
呼叫一樣。系統會新增名為
ZX_PROP_STREAM_MODE_APPEND
的屬性。Fdio 必須使用這個屬性,才能使用F_SETFL
和O_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_APPEND
的zx_object_get_property
呼叫,如果串流正在附加,則屬性的值為1
;如果串流未處於附加模式,則屬性的值為0
。
系統將移除「
zx_stream_writev
」的「ZX_STREAM_APPEND
」選項。
實作
以下 RFC 將在 3 個 Gerrit 變更中實作:
將
ZX_STREAM_MODE_APPEND
和ZX_PROP_STREAM_MODE_APPEND
新增至串流 API。將 C++ VFS 從
ZX_STREAM_APPEND
遷移至ZX_STREAM_MODE_APPEND
和ZX_PROP_STREAM_MODE_APPEND
從串流 API 中移除
ZX_STREAM_APPEND
選項。
效能
這項提案應該對成效沒有影響。
人體工學
將附加模式儲存在串流中,可將串流 API 內嵌在 fuchsia.io/Directory.Open
和 open
中,因為開發人員應該熟悉這種模式。
安全性考量
無。
隱私權注意事項
無。
測試
核心測試將用於執行新的 API,包括使用多個執行緒的測試。
Memfs 使用的現有 fs_test 套件已包含附加相關測試,應在遷移期間擷取任何潛在的迴歸問題。
說明文件
Zircon 串流說明文件將更新為 API 的變更。
缺點、替代方案和未知
替代方案:將附加模式儲存在 fdio 中
直接將連線的附加模式儲存在 fdio 中,然後依原樣使用串流 API。
建議將附加模式儲存在串流中,因為此模式與 POSIX 的附加方式相符。
替代做法:為zx_stream_writev
保留 ZX_STREAM_APPEND
支援串流的檔案系統通常會將要求分派至內部串流,藉此實作 fuchsia.io/File.Read
、Write
和 Seek
。每個連線都已追蹤其附加模式,用於回應 GetFlags
要求,讓使用 zx_stream_writev
的 ZX_STREAM_APPEND
相當方便。
移除 ZX_STREAM_APPEND
會強制檔案系統保持連線的附加模式,同時讓串流的附加模式保持同步,這點並不困難。比起保留 ZX_STREAM_APPEND
,建議減少 API 介面區域並比對 POSIX。
先前的圖片和參考資料
zx_stream_create
帶有 ZX_STREAM_MODE_APPEND
與 open
來自 POSIX 的 O_APPEND
。
具有 ZX_PROP_STREAM_MODE_APPEND
的 zx_object_set_property
類似於 POSIX 的 F_SETFL
和 O_APPEND
的 fcntl
。