argoproj/argo-workflows · error
coudln't obtain child %s
Error message
coudln't obtain child %s
What it means
Also from newWorkflowsDag (workflow/util/util.go:993): while wiring children for each node, a node's Children list contains an ID that has no corresponding entry in the workflow's Status.Nodes map. The referenced child node simply doesn't exist in the status, so the DAG can't be constructed and retry fails.
Source
Thrown at workflow/util/util.go:993
}
for _, wfNode := range wf.Status.Nodes {
parentWfNode, ok := parentsMap[wfNode.ID]
if !ok && wfNode.Name != wf.Name && !strings.HasPrefix(wfNode.Name, wf.Name+".onExit") {
return nil, fmt.Errorf("couldn't find parent node for %s", wfNode.ID)
}
var parentNode *dagNode
if parentWfNode != nil {
parentNode = nodes[parentWfNode.ID]
}
children := make([]*dagNode, 0)
for _, childID := range wfNode.Children {
childNode, ok := nodes[childID]
if !ok {
return nil, fmt.Errorf("coudln't obtain child %s", childID)
}
children = append(children, childNode)
}
nodes[wfNode.ID].parent = parentNode
nodes[wfNode.ID].children = children
}
values := make([]*dagNode, 0)
for _, v := range nodes {
values = append(values, v)
}
return values, nil
}
func singularPath(nodes []*dagNode, toNode string) ([]*dagNode, error) {
if len(nodes) == 0 {
return nil, fmt.Errorf("expected at least 1 node")
}View on GitHub (pinned to 35bff19146)
Solutions
- Confirm the missing child ID is absent from `argo get <wf> -o yaml` status.nodes — this indicates corrupted/truncated status, not a user config problem.
- Use `argo resubmit` (fresh run) instead of `argo retry`, which requires reconstructing the original DAG.
- Restore the workflow from a backup/snapshot where status was complete, if retry of the original run is required.
- Upgrade argo-workflows if this stemmed from a known status-truncation/offload bug fixed in later releases.
Defensive patterns
Strategy: fallback
Validate before calling
wf, _ := client.ArgoprojV1alpha1().Workflows(ns).Get(ctx, name, metav1.GetOptions{})
for _, n := range wf.Status.Nodes {
for _, child := range n.Children {
if _, ok := wf.Status.Nodes[child]; !ok {
fmt.Println("children reference missing node:", child)
}
}
} Try / catch
newWf, err := util.FormulateRetryWorkflow(ctx, wf, ...)
if err != nil && strings.Contains(err.Error(), "coudln't obtain child") {
// fall back to resubmitting a fresh run instead of retrying
newWf, err = util.FormulateResubmitWorkflow(wf)
} Prevention
- Avoid external tooling that prunes or rewrites status.nodes
- Upgrade the controller if status truncation bugs are known for your version
- Validate workflow YAML integrity after any backup/restore operation
- Treat 'children reference missing node' in status as corruption — resubmit rather than retry
When it happens
Trigger: FormulateRetryWorkflow / newWorkflowsDag encounters wfNode.Children entries pointing at node IDs absent from wf.Status.Nodes — typically truncated node status (large status dropped nodes during compression/offload), deleted pruned nodes, or corrupted status from an aborted controller write.
Common situations: Retrying workflows whose status was truncated because it exceeded size limits; workflows edited by scripts that removed a node but not the parent's Children reference; older cluster data migrated to a new version.
Related errors
- couldn't find parent node for %s
- resolve UID: %w
- critical error; unable to find %s
- no Retry Node found by the name of %s; wf.Status.Nodes=%+v
- was unable to obtain childNode for %s
AI-assisted analysis of argoproj/argo-workflows@35bff19146 (2026-09-03).
Data as JSON: /api/errors/02879e02dd027689.
Report an issue: GitHub.