mirror of
https://gitcode.com/JianFeeeee/HomeAgent.git
synced 2026-10-04 00:03:59 +00:00
fix(offload): 内核说明不能被再转投(自我循环)+ offload_owned 未接线
★ 线上实测两个缺陷: 1. **自我循环**:转投会在队列留一条 [系统] 说明(source=kernel), 而转投条件把这条说明也算进「积压够了」⇒ 每次转投都产生下一轮要转投的东西。 实测 5 秒内连续触发两次,分诊助手不断收到「N 条积压已转投」这类噪音。 修法:takeQueuedInputs 排除 isKernelNotice(source=kernel)。 2. **offload_owned 永远为 false**:我加了 ResidentInfo 字段、加了状态面映射, 却漏了在 rc.info() 里赋值 ⇒ 线上转投子明明存在,读出来是 null。 这类「加了字段但没接线」不会报错,只会让父的判断悄悄失效 (父据此决定回收策略,读到 false 就会把临时助手当成正式子)。 测试 +3:说明不转投 / 循环必须终止 / offload_owned 会被上报。 前两条已实测「禁用守卫会失败、恢复后通过」,是真回归测试。
This commit is contained in:
@ -454,6 +454,14 @@ func (s *scheduler) takeQueuedInputs(min int) []offloadCandidate {
|
||||
if t == nil || t.Class != TaskQueued || t.Kind != TaskKindInput || t.Event == nil {
|
||||
continue
|
||||
}
|
||||
// ❗内核自己造的说明(source=kernel)**不能再被转投**。
|
||||
//
|
||||
// 它本来就是"告知这条信息不用再处理"的通知,而转投又会在队列里留下
|
||||
// 一条新的同款通知 ⇒ 自我循环:每次转投都产生下一轮要转投的东西。
|
||||
// 实测(2026-09-19):5 秒内连续触发两次,子侧不断收到这类噪音。
|
||||
if isKernelNotice(t.Event) {
|
||||
continue
|
||||
}
|
||||
out = append(out, offloadCandidate{Event: t.Event})
|
||||
if len(out) >= min {
|
||||
break
|
||||
@ -1377,3 +1385,14 @@ func (a *Agent) resumeTask(t *Task, f *TaskFrame) {
|
||||
a.finishInputTask(f, out)
|
||||
a.sched.done(t)
|
||||
}
|
||||
|
||||
// kernelNoticeSource 是内核自己造的输入事件的来源名(见 offload.syntheticEvent)。
|
||||
//
|
||||
// 它存在的主要理由是**可被识别**:转投等机制必须能排除"自己造的说明",
|
||||
// 否则会在队列里自我循环(说明 → 被转投 → 产生新说明 → …)。
|
||||
const kernelNoticeSource = "kernel"
|
||||
|
||||
// isKernelNotice 判断一条输入是不是内核自己造的通知。
|
||||
func isKernelNotice(evt *agentIO.InputEvent) bool {
|
||||
return evt != nil && evt.Source == kernelNoticeSource
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user