agentscope-ai / agentscope-ai/agentscope-java

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

Đang mở
#2,693 1 bình luận 0 reaction 0 người được giao Xem trên GitHub
area/core/memory bug
Ngôn ngữ chính
Java
Star
5.6k
Fork
1.3k
Merge trung bình
4 ngày 12 giờ
Pull request đã merge (30 ngày)
77

Mô tả

> 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 缺真正的删除保留期」。

Hướng dẫn đóng góp

Mở hướng dẫn đóng góp

Đánh giá

Issue này chưa được đánh giá.

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.