agentscope-ai / agentscope-ai/agentscope-java

[Bug]:pruneOldSessions 的 glob 路径层级与路由前缀不匹配,远程 session 数据永远扫不到(sessionRetentionDays 静默失效)

オープン
#2,693 コメント 1 件 リアクション 0 件 担当者 0 名 GitHub で見る
area/core/memory bug
主要言語
Java
スター
5.6k
フォーク
1.3k
平均マージ
4日 12時間
マージ済み PR(30日)
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 はまだ評価されていません。

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。