feat(queuefs): Add SQLite backend with ack/recover and unified control-file/config specs#1500
Conversation
|
|
PR Reviewer Guide 🔍Here are some key observations to aid the review process:
|
PR Code Suggestions ✨Explore these optional code suggestions:
|
qin-ctx
left a comment
There was a problem hiding this comment.
本次 review 发现 3 个 blocking 问题:
QueueFSPlugin从 unit struct 改成带字段的 struct 后,crates/ragfs-python/src/lib.rs仍然按旧方式直接注册QueueFSPlugin,cargo build -p ragfs-python/pip install -e .会直接编译失败。- SQLite 迁移只补列和索引,没有把旧
queue_messages中已有的队列名回填到新加的queue_metadata;升级旧版queue.db后,可能出现消息还在、但ls/stat看不到队列的情况。 - SQLite backend 会把不存在的队列静默当成空队列或 0 条消息,和当前 QueueFS / MemoryBackend 的
NotFound语义不一致,会吞掉真实的配置或拼写错误。
另外建议补上 legacy queue.db 升级和 nonexistent queue 语义的回归测试,并把 cargo check -p ragfs-python 纳入 CI,避免这类 workspace 内的编译回归再次漏过。
Description
旧版 QueueFS 依赖 Go/SQLite 的 queue.db 做“队列落盘+重启恢复”,而更新后这条链路在 Rust 版 queuefs 里缺失了 SQLite 后端/恢复语义,所以新版重启后任务队列不再天然可恢复。
本 PR 为
queuefs引入 SQLite 持久化后端,用于让队列任务在进程重启后仍可继续消费;并实现与旧版行为一致的dequeue -> ack两阶段确认(at-least-once)语义:dequeue只把消息标记为 processing 并返回,只有ack才真正删除。与此同时,补齐 queuefs 的 mount 配置项,并修复一个 server 启动日志示例 URL 的小问题。Related Issue
N/A
Type of Change
Changes Made
SQLiteQueueBackend)queue_metadata(记录队列名)与queue_messages(记录消息、状态、时间等)status(pending/processing)与processing_started_atpending选取一条消息后更新为processing并返回(保证“取出即锁定”,防止被重复取出)queue_name + message_id + status='processing'删除;返回值表示是否真的删到recover_stale_sec=0时恢复全部processing为pending;recover_stale_sec>0时仅恢复超过阈值的processingbusy_timeout_ms,启用 WAL 相关 pragma(提高并发读写表现)backend:memory | sqlite | sqlite3db_path: sqlite DB 文件路径(当 backend=sqlite/sqlite3 必填)recover_stale_sec: 启动时恢复 processing 的阈值(秒,0 表示全部恢复)busy_timeout_ms: sqlite busy timeout(毫秒)enqueue(写) /dequeue(读) /peek(读) /size(读) /clear(写) /ack(写 msg_id)dequeue/peek在无消息时返回{}(用于兼容现有客户端判空逻辑)readme()补齐ack的用法与控制文件列表http://{}/api/v1/mountTesting
本地验证命令与结果:
cargo test -p ragfs queuefs(23/23 passed)Checklist
Screenshots (if applicable)
N/A
Additional Notes