feat(starry): support MySQL on Debian rootfs#1147
Conversation
|
补充审查记录:PR 已合入,以下问题建议后续单独修复。
本地验证记录:
|
|
已创建 follow-up issue 跟踪补充审查中提到的 AIO context 退出清理、 |
There was a problem hiding this comment.
补充审查报告(PR #1147,已合入)
修改概述
本 PR 为 StarryOS 新增 MySQL on Debian rootfs 应用支持,主要包含:
apps/starry/mysql/:完整的 MySQL 8.4.6 应用适配,包括 prebuild.sh(Debian rootfs 准备、MySQL 安装、依赖注入)、mysql-test.sh(15 组 SQL 测试)、mysql-interactive.sh 和中英文 README。os/StarryOS/kernel/src/syscall/fs/aio.rs:完整重写 Linux AIO 兼容层,实现 io_setup/io_destroy/io_submit/io_getevents/io_pgetevents/io_cancel,包括用户态 ring 映射、请求排队、worker 执行、eventfd 通知、poll 请求等。os/StarryOS/kernel/src/syscall/task/ctl.rs:新增 get_mempolicy、set_mempolicy、mbind 的单 NUMA 节点兼容实现。- epoll 兼容入口(x86_64 epoll_create/epoll_wait)、epoll_ctl 自引用 EINVAL 处理、epoll_pwait 负数 timeout 兼容。
- fallocate hole punch / zero range 行为补充。
- 14 个新增 syscall/bugfix 回归测例,覆盖 AIO 生命周期、mempolicy、epoll 兼容入口、fallocate 等场景。
实现逻辑
AIO 实现遵循 Linux 内核的 ring buffer 模式:io_setup 在用户地址空间分配并映射 ring header + completion event 数组,写入 magic/版本/id 等头部字段,使 libaio 可直接读取。io_submit 解析 iocb,按操作类型(pread/pwrite/fsync/poll/noop/preadv/pwritev)快照用户态数据后交给 worker 执行。完成事件通过环形缓冲写回,支持 IOCB_FLAG_RESFD 事件通知。mempolicy 以单节点兼容方式实现,接受合法策略参数但忽略实际 placement。
本地验证
| 验证项 | 结果 |
|---|---|
cargo fmt --check |
✅ 通过 |
cargo xtask clippy --package starry-kernel(13 个 feature 配置) |
✅ 全部通过 |
CI 状态
CI 工作流 #27015149551 整体结论为 success。检查矩阵中 run_host 任务成功,run_container 和 board 任务按预期 skip(路径过滤和互斥矩阵条目)。无失败或取消的检查。
重复/重叠分析
搜索当前 open PR(#1158 ostool pin、#1159 CI dedupe、#1160 Wayland app),均与本 PR 的 AIO/mempolicy/epoll/fallocate/MySQL 改动无关。base 分支上没有等价实现。
已知后续问题
合入后的补充审查(@ZR233,issue #1157)已识别以下问题:
-
AIO context 缺少进程退出清理:
AIO_CONTEXTS是全局表,进程未显式io_destroy就退出时 context 不会移除、worker 不会退出。建议按 pid 清理,在释放 address space 前调用。代码验证确认exit.rs只调用do_exit(),无 AIO 清理路径。 -
IOCB_FLAG_RESFD未校验 eventfd:resolve_resfd通过get_file_like(cb.resfd)接受任意FileLike,Linux 要求必须是 eventfd。建议显式校验/downcast eventfd 并补充负向测试。代码验证确认resolve_resfd(第 610 行)和notify_resfd(第 736 行)均无 eventfd 校验。 -
prebuild.sh 依赖 passwordless sudo:loop mount 操作需要 root 权限,普通开发环境无法直接复现 MySQL app 流程。
以上问题已跟踪在 #1157,不影响本 PR 的核心功能正确性。AIO 实现对 MySQL/InnoDB 工作负载的兼容性语义符合预期,ring buffer 映射和 completion 机制与 Linux libaio 兼容。
Powered by mimo-v2.5-pro
|
|
||
| // Resolve the optional eventfd notification target from an iocb. | ||
| fn resolve_resfd(cb: &Iocb) -> AxResult<Option<Arc<dyn FileLike>>> { | ||
| if (cb.flags & IOCB_FLAG_RESFD) == 0 { |
There was a problem hiding this comment.
Linux AIO 要求 IOCB_FLAG_RESFD 中的 aio_resfd 必须是 eventfd,非 eventfd 应在 io_submit 阶段返回 EINVAL。当前 resolve_resfd 通过 get_file_like 接受任意 FileLike,notify_resfd 直接写入 8 字节,会导致普通文件 fd 被误写入。建议在此处显式 downcast eventfd 并对非 eventfd fd 返回错误。
支持 Debian 环境下的 MySQL
问题背景
MySQL 8.4 generic glibc 二进制包依赖 Debian/glibc rootfs、Linux AIO、epoll、fallocate、mempolicy、ioctl 等一组真实数据库运行路径。当前 StarryOS 已有 MariaDB app 验证基础,本 PR 延续 #906 的应用适配和回归验证方式,进一步支持 Oracle MySQL 在 x86_64 Debian rootfs 上完成初始化、启动、SQL 工作负载和重启持久化检查。
MySQL/InnoDB 运行过程中会触发以下兼容性需求:
fallocatehole punch / zero range 等文件空间操作路径。get_mempolicy、set_mempolicy、mbind兼容返回。TCGETS探测。修改内容
新增
apps/starry/mysql应用适配用例。prebuild.sh,自动准备 Debian rootfs archive,生成 MySQL 专用 rootfs,下载 MySQL 8.4.6 generic glibc 包,并注入libaio、libnuma、libncurses等运行时依赖。mysql-test.sh,自动初始化数据目录、启动mysqld、执行 15 组 SQL 工作负载,并验证重启后的持久化数据。mysql-interactive.sh,用于进入 MySQL client 手动执行 SQL。完善 Linux AIO 兼容层。
os/StarryOS/kernel/src/syscall/fs/aio.rs,支持 MySQL/libaio 可直接读取的 AIO ring 映射。io_setup、io_destroy、io_submit、io_getevents、io_pgetevents、io_cancel等路径,完整实现了 AIO。补齐 MySQL 触发的 syscall 兼容路径。
epoll_create、epoll_wait,并补充epoll_ctl对epfd == fd的非法参数处理。epoll_pwaittimeout 行为,兼容应用对负数 timeout 的使用方式。get_mempolicy、set_mempolicy、mbind的单 NUMA 节点兼容实现和参数校验。fallocate相关行为验证,覆盖 hole punch / zero range 场景。补充 syscall 和 bugfix 回归测试。
test-get-mempolicy、test-set-mempolicy、test-mbind。test-epoll、test-fallocate。bug-epoll-compat-entrypoints、bug-fallocate-zero-punch、bug-mempolicy-validation。移除没必要测例代码中没必要的 prebuild.sh
因为这些 prebuild.sh 中需要 apk 拉取依赖,但是都是重复的,执行一次即可。频繁的 apk add 容易导致 CI 不通过。经检验,移除后 CI 和本地测试均正常通过
关键修复说明
MySQL app
rootfs-x86_64-mysql.img/opt/mysqllibaio、libnuma、libncursesmysqld和mysqlclient 动态链接需求mysql-test.sh执行初始化、启动、SQL workload、重启持久化检查mysql-interactive.sh自动启动服务后进入 MySQL clientLinux AIO
io_setupio_submitio_geteventsio_pgeteventsio_destroyio_cancel其他 syscall 兼容
epoll_create、epoll_waitwrapperepoll_ctl对epfd == fd返回EINVALget_mempolicy、set_mempolicy、mbindMySQL SQL 覆盖场景
mysqld --initialize-insecure、数据目录重建SHOW CREATE TABLE、information_schemaMySQL 15 组 SQL 测试
starry_mysql_test并检查字符集和 collationEXPLAINinformation_schemamysqld后验证数据、视图和回滚结果Syscall 和 bugfix 回归测试
test-io-setuptest-io-destroytest-io-submittest-io-geteventstest-io-pgeteventstest-io-canceltest-get-mempolicytest-set-mempolicytest-mbindtest-epolltest-fallocatebug-epoll-compat-entrypointsbug-fallocate-zero-punchbug-mempolicy-validation验证结果
x86_64cargo xtask starry app qemu -t mysql --arch x86_64x86_64cargo xtask starry test qemu --arch x86_64aarch64cargo xtask starry test qemu --arch aarch64riscv64cargo xtask starry test qemu --arch riscv64loongarch64cargo xtask starry test qemu --arch loongarch64