Repository navigation
EasyBot v0.0.41
Fixed
-
管理后台日志环形缓冲不再无过滤采集依赖库内幕(并修复
RUST_LOG被忽略) —
LogCollector图层此前未挂过滤器,会接收并保存hyper/sqlx/tower_http/
axum等所有 target 的TRACE/DEBUG事件:环形缓冲(上限 5000 条)被依赖库噪音占满,
业务与插件日志被挤掉;同时未过滤的图层不对全局最大级别提供任何约束,tracing全局最大
级别被抬到TRACE,所有trace!/debug!宏(包括依赖内的)都被真实构造/记录,带来
不必要的 CPU 与内存开销。现让内存收集器与控制台fmt层共用同一过滤器(默认
easybot=<level>),并读取RUST_LOG(存在时接管过滤),兼现docs/16/docs/17中
RUST_LOG=<target>=<level>可按 target 细分日志的承诺——此前该环境变量被完全忽略。 -
修复空载下匿名内存持续增长直至 cgroup OOM(issue #139) — 事务性 outbox 发布器每 250ms 调用
unpublished_outbound_events(),其ORDER BY completed_at, id缺少覆盖索引,SQLite 每次排序都会
构建一个 TEMP B-tree;承载该临时结构的匿名内存不会被释放,导致空载下匿名内存单调增长
(实测空载 ~0.3MB/min,容器最终逼近内存上限并被 OOM kill)。GET /api/v1/messages/deliveries
与GET /api/v1/sessions/{key}/export的ORDER BY created_at DESC, id DESC同样退化为临时 B-tree。
新增 schema 迁移 v4:为outbound_deliveries建立
(event_published, completed_at, id)、(actor_id, created_at DESC, id DESC)、
(platform, chat_id, created_at DESC, id DESC)三个索引,使上述查询走索引排序、不再创建临时 B-tree。
升级前(schema < 4)的库会在启动时自动迁移;CREATE INDEX IF NOT EXISTS可重复执行。 -
修复 Windows Docker Desktop bind mount 上无法打开既有
gateway.db(Operation not permitted) —
storage::sqlite::create_pool在 Unix 下对已存在的数据库文件强制执行chmod 0600,
成功与否被当作打开数据库的硬性前提。Windows Docker Desktop 的 bind mount(9p/virtiofs)
会拒绝对迁移进来的既有文件执行chmod并返回EPERM(os error 1),导致create_pool
返回错误、bin/src/main.rs回退到内存库:消息/outbox 表不存在(no such table: messages)、
持久化的 API key 无法加载致 REST/WebSocket 认证全部 401。现将权限收紧改为纵深防御:
失败仅记录 warn 并继续,依赖底层文件系统 ACL 打开数据库;新建文件仍以0600创建。
容器自身创建的库(如auth.db)权限收紧正常,不受影响。 -
内存回退库不再静默降级:执行 schema 迁移 + 显式报告降级状态 —
当 SQLite 仍无法打开而回退到内存库时,bin/src/main.rs现在对内存库执行同一套
版本化迁移,避免消息/outbox 持久化持续报no such table: messages/
outbound_deliveries(此前单容器 2 天可刷出 162MB 日志)。回退日志从warn
升为单条error,附可操作指引(提示属主不匹配与chown 10001:10001)。
新增AppState.storage_ephemeral,/api/v1/ready在内存回退时把
message_storage标为ephemeral、整体status为degraded并返回 503,
/api/v1/health同步报告degraded,消除"数据未落盘但健康检查仍绿"的运维盲区。 -
根治下载/插件安装偶发"下载产物为空"缺陷(
updater::github::download_binary) —
根因是tokio::fs::File的write_all只保证字节拷入内部缓冲并派发后台阻塞写任务,
poll_write随即返回Ready——字节未必已写入 OS。download_binary未flush就
返回Ok,调用方(自动更新替换、插件安装)用独立 fd/path 读该文件做 sha256 校验时,
高负载下会读到尚未落盘的空文件(历史表现为下载测试偶发sha256 of empty,
e3b0c442…)。已在返回前补file.flush().await等待后台写任务完成,并把 0 字节
响应判为失败(此前无 Content-Length 的 0 字节完整响应会被静默当成成功)。
test_download_verifies_sha256中为此设的 8 次重试循环一并移除——回归即真缺陷,
应修根因而非加重试预算。