现象
FastGPT v4.14.0及以上私有部署版本中,运行包含复杂循环拓扑的工作流时,会在极短时间(如160ms)内无声结束。此时后台无报错日志,工作流未达到maxRunTimes限制,接口直接返回。该问题通常出现在循环结构内部的节点同时接收来自外部(如IF/ELSE节点)的另一条连线的多入口循环结构场景。例如导入病史总结-4.json工作流文件并调试运行时,仅会执行判断器及少量后续节点,随后工作流瞬间结束;若将循环内部节点的外部多余入口剥离,工作流即可正常执行。
可能原因
该问题由引擎底层死锁导致,根因位于packages/global/core/workflow/runtime/utils.ts的splitNodeEdges函数。在进行DFS深度优先遍历时,若一条连线同时满足两个条件:一是可追溯到起点节点(触发isStartNode),二是处于循环结构上(指向自身节点),当前逻辑会错误将其归类为“常规连线”(commonEdges)。后续在checkNodeRunStatus状态判定环节,这条被错误归类的循环连线仍处于waiting状态,导致目标节点无限期处于wait状态,最终引发调度队列清空,工作流异常结束。
排查步骤
- 确认当前使用的FastGPT版本为v4.14.0及以上的私有部署版本。
- 导入复现用的工作流文件(如
病史总结-4.json),通过工作流调试功能运行,观察是否在极短时间内无声结束,且后台无报错日志。 - 检查工作流的节点连线结构,确认是否存在循环内部节点同时接收外部(如IF/ELSE节点)连线的多入口循环结构。
- 临时剥离循环节点的外部多余入口,验证工作流是否能正常执行,辅助定位问题是否由该多入口结构引发。
解决与验证
解决该问题需要修正splitNodeEdges函数的逻辑,正确区分循环连线与常规连线,避免将循环结构的连线错误归类。验证步骤如下:1. 完成代码修复后重新部署FastGPT服务。2. 导入原复现用的工作流文件,运行工作流,确认不再出现极短时间内无声结束的情况。3. 查看工作流执行日志,确认流程可正常执行至结束,未出现死锁异常。
来源:https://github.com/labring/FastGPT/issues/6596