RFC-0156:流附加模式

RFC-0156:串流附加模式
状态已接受
领域
  • 内核
说明

向数据流添加附加模式。

问题
  • 88678
Gerrit 更改
  • 664693
作者
审核人
提交日期(年-月-日)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_writevZX_STREAM_APPEND 选项。

API 更改

此 RFC 包含 3 项 API 更改:

  1. 系统将为 zx_stream_create 添加一个名为 ZX_STREAM_MODE_APPEND 的新选项。使用 ZX_STREAM_MODE_APPEND 创建的数据流将置于附加模式。在附加模式下,对数据流进行的所有 zx_stream_writev 调用的行为都会就像将 ZX_STREAM_APPEND 传递给 zx_stream_writev 调用一样。

  2. 系统将添加一个名为 ZX_PROP_STREAM_MODE_APPEND 的新属性。要使用 F_SETFLO_APPEND 实现 fcntl,fdio 需要使用此属性。

    • ZX_PROP_STREAM_MODE_APPEND 的值类型将为 uint8_t
    • 使用 ZX_PROP_STREAM_MODE_APPEND 且值为 0 调用 zx_object_set_property 会使数据流退出附加模式。
    • 使用 ZX_PROP_STREAM_MODE_APPEND0 以外的任何值调用 zx_object_set_property 都会使流进入附加模式。
    • 对于使用 ZX_PROP_STREAM_MODE_APPENDzx_object_get_property 调用,如果数据流处于附加模式,则属性的值为 1;如果数据流未处于附加模式,则属性的值为 0
  3. 系统将移除 zx_stream_writevZX_STREAM_APPEND 选项。

实现

此 RFC 将在 3 项 Gerrit 变更中实现:

  1. ZX_STREAM_MODE_APPENDZX_PROP_STREAM_MODE_APPEND 添加到数据流 API。

  2. 将 C++ VFS 从 ZX_STREAM_APPEND 迁移到 ZX_STREAM_MODE_APPENDZX_PROP_STREAM_MODE_APPEND

  3. 从 Stream API 中移除了 ZX_STREAM_APPEND 选项。

性能

此提案应该不会对性能产生任何影响。

工效学设计

将附加模式存储在数据流中会使数据流 API 内嵌到开发者已经熟悉的 fuchsia.io/Directory.Openopen

安全注意事项

无。

隐私注意事项

无。

测试

将编写核心测试以运行新 API,包括使用多个线程的测试。

memfs 使用的现有 fs_test 套件已包含附加相关测试,这些测试应该可以捕获迁移过程中的任何潜在回归问题。

文档

Zircon 流文档将随 API 的变化而更新。

缺点、替代方案和未知情况

替代方案:将附加模式存储在 fdio 中

将连接的附加模式直接存储在 fdio 中,并按原样使用流 API。

建议将附加模式存储在数据流中,因为它与 POSIX 中附加的工作方式相符。

替代方案:将 ZX_STREAM_APPEND 保留 zx_stream_writev

支持数据流的文件系统通常通过在内部将请求调度到数据流来实现 fuchsia.io/File.ReadWriteSeek。每个连接都已跟踪其附加模式,以响应 GetFlags 请求,让您可以方便地将 ZX_STREAM_APPENDzx_stream_writev 搭配使用。

移除 ZX_STREAM_APPEND 会强制文件系统使连接的附加模式与数据流的附加模式保持同步,这并不困难。首选减少 API Surface 区域并匹配 POSIX,而不是保留 ZX_STREAM_APPEND

早期技术和参考资料

使用 ZX_STREAM_MODE_APPENDzx_stream_create 类似于使用 POSIX 中的 O_APPENDopen

使用 ZX_PROP_STREAM_MODE_APPENDzx_object_set_property 类似于使用 POSIX 中的 F_SETFLO_APPENDfcntl