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_MODE_APPEND
的zx_stream_create
新选项。使用ZX_STREAM_MODE_APPEND
创建的数据流将处于附加模式。对追加模式下的流的所有zx_stream_writev
调用都将像向zx_stream_writev
调用传递ZX_STREAM_APPEND
一样运行。系统会添加一个名为
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_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_APPEND
与 zx_stream_writev
搭配使用非常方便。
移除 ZX_STREAM_APPEND
会强制文件系统使连接的附加模式与数据流的附加模式保持同步,这并不难。与保留 ZX_STREAM_APPEND
相比,缩减 API Surface 区域并与 POSIX 匹配更为理想。
在先技术和参考文档
带有 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
。