| 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_writev 选项的ZX_STREAM_APPEND。
向数据流添加追加模式将避免 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的新属性。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。
安全注意事项
无。
隐私注意事项
无。
测试
我们将编写核心测试来练习新的 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_create
使用 ZX_STREAM_MODE_APPEND 类似于
open
使用 O_APPEND 的 POSIX。
zx_object_set_property
使用 ZX_PROP_STREAM_MODE_APPEND 类似于
fcntl
POSIX 中的使用 F_SETFL 和 O_APPEND。