Description
Summary
The following pattern:
Node(IdentityInterface) -- ... --> JoinNode(IdentityInterface) --> Node(IdentityInterface) -- ... --> JoinNode(IdentityInterface)
with iterable field <---------------| (joinsource) with iterable field <---------------| (joinsource)
Leads the last JoinNode
to enter a deadlock. I think it only happens when the iterable and Join nodes wrap identity interfaces. The deadlock can be averted simply spliting out the iterable field from the second Node:
Node(IdentityInterface) -- ... --> JoinNode(IdentityInterface) --> Node(IdentityInterface) -- ... -------|
with iterable field <---------------| (joinsource) without iterable field |
Node(IdentityInterface) -- ... --> JoinNode(IdentityInterface)
with iterable field <---------------| (joinsource)
The problem is rooted in that this expansion exploration for the first iterable node:
https://github.com/nipy/nipype/blob/master/nipype/pipeline/engine/utils.py#L992-L998
reaches out to the final JoinNode, instead of stopping at the first JoinNode.
My impression is that the problem has always been there, but after the refactor of the results files, the workflow enters a deadlock. I haven't checked, but changing this AttributeError
(https://github.com/nipy/nipype/blob/master/nipype/pipeline/engine/nodes.py#L1066) to some other type (e.g., ValueError
or RuntimeError
) potentially could do