OpenProgram · SessionStore concurrency
SessionStore 锁范围
SessionStore._lock 仅保护会话位置映射和 LRU 缓存结构。当前 _open、位置索引持久化和 delete_session 在该锁内执行目录扫描、原子写、fsync 或递归删除,使一个会话的慢 I/O 阻塞其他会话。
并发合同
| 资源 | 锁 | 要求 |
|---|---|---|
_locations、_sessions 和 LRU 顺序 | _lock | 仅在读取、修改或复制这些内存结构时持有;不允许在锁内进行文件系统 I/O。 |
单个 session_id 的首次加载、重建、删除和缓存失效 | 每会话 RLock | 同一会话串行,不同会话可并行。不创建通用 transaction 层。 |
locations.json 发布 | 专用写锁 | 在全局状态锁内更新并复制快照,释放状态锁后串行落盘,防止旧快照后写覆盖新快照。 |
SessionMemoryIndex 持久化 | 现有 _persist_lock → idx._lock | 保持现有锁序和 stale rebuild 语义;不在 idx._lock 内进行 I/O。 |
本任务只缩小 store 全局锁的 I/O 范围。不改 SessionStore 文件格式、LRU 容量、删除语义、跨进程 stale 检测或 Windows 行为。
验收
- 会话 A 的
read_meta/list_history被阻塞时,会话 B 的缓存读取在有界时间内完成。 - 会话 A 的递归删除被阻塞时,会话 B 的读取不等待 A。
- 同一会话的并发首次加载只发布一个缓存对象;删除与加载不交错发布已删除对象。
- 两个会话并发更新位置映射后,重载的
locations.json包含两项。