| RFC-0156:串流附加模式 | |
|---|---|
| 狀態 | 已接受 |
| 區域 |
|
| 說明 | 在串流中新增附加模式。 |
| 問題 | |
| 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_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和0值呼叫zx_object_set_property,即可將串流從附加模式中取出。 - 使用
ZX_PROP_STREAM_MODE_APPEND和0以外的任何值呼叫zx_object_set_property,會將串流設為附加模式。 - 如果是
zx_object_get_property呼叫 (含ZX_PROP_STREAM_MODE_APPEND),如果串流處於附加模式,屬性值會是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_APPEND zx_stream_writev
支援串流的檔案系統通常會實作 fuchsia.io/File.Read、Write 和 Seek,方法是將要求內部調度至串流。每個連線都會追蹤其附加模式,以回應 GetFlags 要求,因此使用 ZX_STREAM_APPEND 和 zx_stream_writev 十分方便。
移除 ZX_STREAM_APPEND 會強制檔案系統保持連線的附加模式,以及串流的附加模式同步,這並不困難。相較於保留 ZX_STREAM_APPEND,我們更希望縮減 API 介面面積並符合 POSIX。
既有技術和參考資料
zx_stream_create
與 ZX_STREAM_MODE_APPEND 類似,
open
與 POSIX 的 O_APPEND 類似。
zx_object_set_property
與 ZX_PROP_STREAM_MODE_APPEND 類似於
fcntl
與 POSIX 的 F_SETFL 和 O_APPEND。