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

  1. 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.
  2. Use `argo resubmit` (fresh run) instead of `argo retry`, which requires reconstructing the original DAG.
  3. Restore the workflow from a backup/snapshot where status was complete, if retry of the original run is required.
  4. 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

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


AI-assisted analysis of argoproj/argo-workflows@35bff19146 (2026-09-03). Data as JSON: /api/errors/02879e02dd027689. Report an issue: GitHub.