RFC-0156:串流附加模式 | |
---|---|
状态 | 已接受 |
领域 |
|
说明 | 向数据流添加附加模式。 |
问题 | |
Gerrit 更改 | |
作者 | |
审核人 | |
提交日期(年-月-日) | 2022-04-06 |
审核日期(年-月-日) | 2022-04-20 |
总结
此 RFC 提议通过向数据流添加附加模式并从 zx_stream_writev
中移除附加选项来修改数据流 API。
设计初衷
流附加选项 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_create
添加一个名为ZX_STREAM_MODE_APPEND
的新选项。使用ZX_STREAM_MODE_APPEND
创建的数据流将置于附加模式。在附加模式下,对数据流进行的所有zx_stream_writev
调用的行为都会就像将ZX_STREAM_APPEND
传递给zx_stream_writev
调用一样。系统将添加一个名为
ZX_PROP_STREAM_MODE_APPEND
的新属性。要使用F_SETFL
和O_APPEND
实现fcntl
,fdio 需要使用此属性。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_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
从 Stream 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
会强制文件系统使连接的附加模式与数据流的附加模式保持同步,这并不困难。首选减少 API Surface 区域并匹配 POSIX,而不是保留 ZX_STREAM_APPEND
。
早期技术和参考资料
使用 ZX_STREAM_MODE_APPEND
的 zx_stream_create
类似于使用 POSIX 中的 O_APPEND
的 open
。
使用 ZX_PROP_STREAM_MODE_APPEND
的 zx_object_set_property
类似于使用 POSIX 中的 F_SETFL
和 O_APPEND
的 fcntl
。