agentscope-ai / agentscope-ai/agentscope-java
[Bug]:pruneOldSessions 的 glob 路径层级与路由前缀不匹配,远程 session 数据永远扫不到(sessionRetentionDays 静默失效)
- 主要語言
- Java
- 星號
- 5.6k
- 分支
- 1.3k
- 平均合併
- 4 天 12 小時
- 30 天內合併 PR
- 77
描述
> Labels 建议:`bug` / `harness` / `memory`
## 环境
| | |
|---|---|
| agentscope-harness | 2.0.2 |
| store | `agentscope-extensions-mysql` 2.0.2(`JdbcStore` → MySQL 8.0.21) |
| 场景 | **非 sandbox**,`CompositeFilesystem` + 远程 store,workspace 为 `emptyDir` |
## 问题
`MemoryMaintenanceMiddleware.pruneOldSessions()` 想清理过期会话文件,但它 glob 的路径只有**一层**:
```java
// MemoryMaintenanceMiddleware.java:281
GlobResult glob = fs.glob(rc, "*.log.jsonl", WorkspaceConstants.AGENTS_DIR); // AGENTS_DIR = "agents"
```
而 `RemoteFilesystemSpec` 注册的会话路由前缀是**三层**:
```java
// RemoteFilesystemSpec.java:224-231
routes.put("agents/" + effectiveAgentId + "/sessions/", overlayRoute(...));
```
`CompositeFilesystem.routeForPath("agents")` 与 `agents//sessions/` 匹配不上,于是落到 **defaultBackend**(本地)。而多副本部署里 workspace 是 emptyDir、本地压根没有远程那份数据 —— **一个文件都找不到,循环体不执行,什么都不会被删**。
整个过程**没有异常、没有 WARN**,日志上看起来清理正常完成。
## 另外两处一并提一下
1. **只匹配 `*.log.jsonl`**,漏掉了 `SessionTree` 同时维护的 `.jsonl`(压缩后的上下文)和 `sessions.json`(会话树索引)。即使前面的路径问题修好,也只清掉一半。
2. **`sessions.json` 只增不减**:它由 `WorkspaceManager.updateSessionIndex():403` 每次 offload 整份重写,条目只加不删,框架侧没有任何清理逻辑。它在响应路径上被同步读写,体积直接换算成每轮延迟。
## 影响
- `MemoryConfig.sessionRetentionDays` 配了等于没配,远程存储**无界增长**
- 由于是静默的,只有等到 DB 体量异常时才会被发现
我们最终只能自己写一个定时任务,**直接对存储表执行 SQL** 来清理。这意味着绕过框架抽象,还得自己维护命名空间的字节格式(`JdbcStore` 用 ASCII `0x1F` 连接各段且结尾带一个;`item_key` 带前导斜杠)—— 这些都是实现细节,本不该由使用方依赖。
## 复现
1. 用 `RemoteFilesystemSpec` + `JdbcStore` 构建 agent,`IsolationScope.USER`
2. 设一个很短的 `sessionRetentionDays`(如 1 天),并伪造/等待若干过期会话文件
3. 触发 memory maintenance
4. 预期远程 store 里过期的 `*.log.jsonl` 被删除;实际一行未删
## 建议
- glob 路径改为与路由前缀一致的 `agents//sessions`(或直接对每条已注册路由前缀分别扫描),确保能落到远程后端
- 匹配模式覆盖 `*.jsonl`(含 `.log.jsonl`)
- 给 `sessions.json` 增加条目级的过期剪枝,与 `sessionRetentionDays` 用同一保留期
## 相关
即使路径问题修复,还会撞上另一个独立缺陷:索引快速路径返回空 mtime,而 `:289-294` 遇空 mtime 会 `continue` 跳过 —— 见姊妹 issue「WorkspaceIndex 快速路径返回空 mtime」。**两个缺陷各自都足以让清理完全不工作,需要一并修。**
关于「只归档不删除」的配套诉求,见姊妹 issue「memory/archive/ 与 session 缺真正的删除保留期」。
貢獻指南
評估
這個 Issue 還沒有評估資料。