Repository navigation
v0.7.1a2 — SQLite 门 finalize 饿死修复(面板卡死)
Pre-release
Pre-release
修复:SQLite 门的 finalize 被读侧饿死,team server 面板整体超时卡死
_SQLiteCallGate 的独占侧(连接 finalize)会被共享侧无限期饿死:等待中的 finalize 不置标志,新调用一直插队。进程里稳定有 3~4 个并发 SQLite 调用时,close() 就永远回不来,卡住的是发起它的线程——请求线程、事件循环线程,或任何触发 GC 的线程(__del__ 兜底调 close,连带冻住循环 GC)。线上表现为面板所有接口超时(/health 也不响应)、进程还活着、CPU 不高、且不会自愈。
同一把门的第二个缺陷:共享侧判断时不看持有独占侧的是不是自己,于是 close 期间 cursor/blob 的 __del__ 回到共享侧会永久自锁,整个进程的 SQLite 全部 park。
改动
- 门新增 finalize 优先:有 finalize 在等时新的共享调用排到它后面,finalize 只等已经在飞的调用,等待有界。两个必须的例外——已持有共享侧的同线程调用放行;连接上有未结束事务时放行(查
in_transaction),否则会形成 A 等 C 的写锁 → C 的下一条语句被 finalize 挡住 → finalize 等 A 的三方环。 - 共享侧承认 finalize 自己的线程,堵掉自锁。
api_list_trajectories/api_trajectory_logs由async def改def,把同步 SQLite 挪下事件循环,交给 Starlette 线程池。
升级提示:无配置变更、无数据/schema 变更,pip install -U --pre xskill 或等 client 自动升级即可。
已知:release workflow 的 skillhub search smoke 闸自 v0.7.0a2 起连续失败(它在 7~12 个样本上算 health p99,噪声太大,与本次改动无关),本版 PyPI 产物为手工 twine 上传。