• 请不要在回答技术问题时复制粘贴 AI 生成的内容
twursc
V2EX  ›  程序员

[吐槽] OpenCode 惊现 两年虫 大 bug,线上业务几千个会话在同一时间一起炸了...

  •  
  •   twursc · 2h 8m ago · 621 views

    我司有一个在线对话+开发的平台,是基于 opencode acp 实现的。

    昨天晚上刚准备下班,就看到业务群里有一大波反馈,说对话消息不回复了,但创建新的会话就能恢复正常。与此同时我本地的 opencode 开发任务似乎也不回复了。

    仔细排查了半天容器日志和 opencode 会话日志,发现是 opencode 在七点之后生成的 message ID 竟然比之前小,ID 生成器轮转了,而 opencode 的 message.latest() 是基于最大的 message ID 来找的。这就导致新消息发出去之后,获取的最新用户消息仍然是七点前的消息,导致对话不能正常工作了。。

    结合代码发现确实如此,message id 中的时间戳是被截断之后存进 buffer 的,最多只能存 2^36ms ~= 795 天,大概两年,刚好在昨天 (8.14) 晚上 19:19 会发生轮转msg_id 会从 msg_ffff 变成 msg_0000

    let now = BigInt(currentTimestamp) * BigInt(0x1000) + BigInt(counter)
    now = direction === "descending" ? ~now : now
    
    const timeBytes = Buffer.alloc(6)   // MessageID 只存了时间戳的 48 位
    for (let i = 0; i < 6; i++) {
      timeBytes[i] = Number((now >> BigInt(40 - 8 * i)) & BigInt(0xff))
    }
    

    准备提 issue 的时候发现已经有老哥也踩到坑了,看起来官方也已经修了:

    https://github.com/anomalyco/opencode/issues/42583

    但还是不理解为啥 opencode 要对时间戳做截断,官方似乎也没有对这个 bug 发更新通知,更重要的是如果当时任务在循环里,会一直无限重试,把 token 额度用光。

    不知道有没有 V 友也遇到这个问题的,感觉多少有点草台班子了,orz

    5 replies    2026-08-15 13:18:04 +08:00
    yidinghe
        1
    yidinghe  
    PRO
       2h 6m ago
    太可怕了。这个用最新的大模型去排查,不知道能不能排掉。
    isbase
        2
    isbase  
    PRO
       2h 5m ago via iPad
    这个软件质量确实非常一般,我现在用 pi 代替它
    twursc
        3
    twursc  
    OP
       1h 59m ago
    @yidinghe 就是发现 msg_id 不对劲之后用 AI 扫了一遍源码确认的 bug ,用的 ds v4 flash ,还是很好使的
    twursc
        4
    twursc  
    OP
       1h 57m ago
    @isbase 是的,opencode 本身就很多 bug ,我们是内部维护了一个 fork ,提前修了一批官方还没来的修的 bug ,然后定期 follow 官方的最新版本。但这次还是给我们整了个措手不及
    lqbk
        5
    lqbk  
       1h 48m ago
    很好奇 “在线对话+开发的平台” 这个平台主要用途是啥。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   3016 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 07:06 · PVG 15:06 · LAX 00:06 · JFK 03:06
    ♥ Do have faith in what you're doing.