Skip to content

fix(research-diff): 并发保存差异会静默丢失历史与 material 信号 #361

Closed

Description

@huyengiang101086-spec

问题

ResearchDiffRepository.save() 对共用的 research-diffs.json 执行无锁读改写。两个保存操作读取同一快照后分别覆盖文件,会静默丢掉其中一条差异;原子 rename 只防止半文件,无法合并旧快照。

生产中既有报告完成后的 saveDiffForReport(),也有 researchGetDiff() 的按需计算写入。不同证券的报告或按需请求可同时进入保存路径。丢失的差异还可能是自动化通过 getBySymbol() 读取的 material 信号。

复现

基线 main:7ddc3c65ec6327275821404dec3dda1485d1ae16。

对真实临时文件的 store.read 在读取后注入 20ms 延迟,再通过 Promise.all 保存两份不同 id 的差异;两个调用成功完成,但重新建立仓库实例只读回一条。

新增测试先在原生产代码运行:

bun test packages/shared/src/research-diff/repository.test.ts
→ 6 pass / 2 fail

失败覆盖不同证券的 buildDiff → 并发保存 → 重载集成路径,以及同证券的并发历史保存/最新查询。第三个回归验证写入失败对调用方可见且不阻塞后续保存。

预期与修复方向

复用当前 main 已有的 storage/withWriteLock,按绝对目标路径保护完整 read → upsert → sort → write。同进程内多个仓库/store 实例应共享锁;保持格式、稳定 id、排序和读取接口。

与开放 PR #352 的筛选历史保存属同类问题,但这里是独立的研究差异文件,改动文件不重叠。已检查相关研究报告选择 PR #337 / #345 / #354,均未修改此仓库。

环境:Bun 1.4.2 / Windows 11 (10.0.26200)。Codex 在用户授权下准备;只处理进程内并发,不承诺跨进程事务或恢复历史丢失记录。

Activity

  1. huyengiang101086-spec commented on Oct 20, 2026

    @huyengiang101086-spec
    ContributorAuthor

    /claim

  2. github-actions commented on Oct 20, 2026

    @github-actions

    @huyengiang101086-spec 已认领该 Issue,并已自动设为 Assignee。提交 PR 时请在描述中写 Closes #361。

  3. added a commit that references this issue on Oct 21, 2026
    579b0ba
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Labels

claimedClaimed by a contributor and currently in progress

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions