feat(gateway,loop): 忙时并行回合基础管线(I1′ 有条件放宽)
- turnId 由编排器生成、loop Run 复用(硬前提:否则 turn_begin 与流帧各铸一个,客户端两级分桶立即失配) - StateSink 增带 turnId 的变体(未接线时退化为现签名,不丢状态帧) - 上行 chat.parallel(WS chat 帧 + REST 三入口同形;省略 = 逐字不变) - 单会话额度默认 2 / 硬上限 3 / <2 关闭;额度满或未声明 ⇒ 落回既有排队语义 - I1′:checkpoint 归属、历史配对、忙态计数三处从会话级单例升为路级 - session_idle 收紧为「所有在途路收尾且 pending 空」(仅并行时生效;单路逐字不变) - 预留接口(形状定死、无实现无接线):tool/legfile.go 的 FileClaimer / ErrFileBusy / WithLegID - 顺手修一个真 bug:并行路 ctx 派生自提交请求作用域,REST 同步入口一写响应就把它连坐杀死(改 context.WithoutCancel 派生) - 23 个新用例(含 -race -count=3);变异 6 条(turnId 复用 / idle 时点 / 并行升级 / checkpoint 键 / 编排器交 id / pending_ack reason) - 契约变更点 10 条待监工升 v0.65(本人未改 Docs/**)
This commit is contained in:
1 parent
7d2ff74cfc
commit
89e13cf53d
23 files changed
+1921
-275
No files matched your search
@@ -42,17 +42,22 @@ type documentStatusWriter interface {
|
||||
UpdateMessageDocument(ctx context.Context, id, document string) error
|
||||
}
|
||||
|
||||
// rememberTurnDocuments 记下本回合已落库的用户消息(按代次配对),供回合结束
|
||||
// rememberTurnDocuments 记下本路已落库的用户消息(按世代号配对),供回合结束
|
||||
// 后把抽取结论回写进它们的 document 列。空列表是空操作(这条回合没有落库任何
|
||||
// 用户消息,也就没有结论可补)。
|
||||
//
|
||||
// 它按**路**配对(design/15 §2.5.9「历史配对」升为路级):并行时两路各自持有
|
||||
// 自己那几条已落库的用户消息,任何一路结算都只回写自己那几行,绝不会把结论
|
||||
// 写进另一路的行。路已失效(被打断清空)时什么都不做 —— 这次迟到结算不属于
|
||||
// 当前状态。
|
||||
func (o *Orchestrator) rememberTurnDocuments(sessionID string, gen uint64, msgs []history.Message) {
|
||||
if len(msgs) == 0 {
|
||||
return
|
||||
}
|
||||
o.mu.Lock()
|
||||
defer o.mu.Unlock()
|
||||
if st := o.states[sessionID]; st != nil {
|
||||
st.turnDocs = turnDocuments{gen: gen, msgs: msgs}
|
||||
if leg := o.legLocked(o.states[sessionID], gen); leg != nil {
|
||||
leg.docs = turnDocuments{gen: gen, msgs: msgs}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -81,21 +86,18 @@ func (o *Orchestrator) attachPendingDocuments(sessionID string, seq uint64, msgs
|
||||
}
|
||||
}
|
||||
|
||||
// takeTurnDocuments 取走与 gen 配对的已落库用户消息并清空记录。第二个返回值
|
||||
// 报告这次代次是否仍是当代:非当代说明这是一次陈旧回合的迟到结算(中断/取代),
|
||||
// 调用方据此静默返回 —— 迟到的结算是正常竞态,不是缺陷。
|
||||
// takeTurnDocuments 取走**本路**(世代号配对)已落库的用户消息并清空记录。
|
||||
// 第二个返回值报告这条路是否仍然在途:不在途说明这是一次失效路的迟到结算
|
||||
// (被中断清空 / 被取代),调用方据此静默返回 —— 迟到的结算是正常竞态,不是缺陷。
|
||||
func (o *Orchestrator) takeTurnDocuments(sessionID string, gen uint64) ([]history.Message, bool) {
|
||||
o.mu.Lock()
|
||||
defer o.mu.Unlock()
|
||||
st := o.states[sessionID]
|
||||
if st == nil {
|
||||
return nil, true
|
||||
}
|
||||
if st.turnDocs.gen != gen {
|
||||
leg := o.legLocked(o.states[sessionID], gen)
|
||||
if leg == nil {
|
||||
return nil, false
|
||||
}
|
||||
msgs := st.turnDocs.msgs
|
||||
st.turnDocs = turnDocuments{}
|
||||
msgs := leg.docs.msgs
|
||||
leg.docs = turnDocuments{}
|
||||
return msgs, true
|
||||
}
|
||||
|
||||
|
||||
Reference in new issue
Block a user