What happened?

If you submit your karma ROP to deadline and happen to have some Fetch nodes (inevidablly) in your LOPs network, you will get a bunch of errors like this:

1
2
3
File “Z:/repository/submission/Houdini/Main\SubmitDeadlineRop.py”, line 208, in _getInputNodes  
selectedInput = curNode.parm(“index”).eval()
AttributeError: ‘NoneType’ object has no attribute ‘eval’

That means deadline refused to accept data from Houdini. And the error indicated that the bug locates at the submitter python file.

Where is the bug?

Let’s take a look at the source code.

1
2
3
4
5
6
7
if not bypassed:
#if this is not a rop or fetch we cannot render anything so do not submit a job to deadline
if isFetch:
#if thie node is a fetch and the node it points to exists then we want to prepare the node it points to for submission and have it's chain be dependent on everything the fetch node is dependent on.
fetchRop = self._getFetchedNode( curNode )
if fetchRop:
...

This is where the error happens. The submitter trys to get the nodes in Fetch node. According to the annotations, it wants to know what kind of node the Fetch node grabs. However something out of expectation happens in the class function getFtechNode().

1
2
3
4
5
6
@staticmethod
def _getFetchedNode( curNode ):
# In addition to the normal inputs fetch nodes point to an additional node which we can treat like other input nodes
fetchedPath = curNode.parm( "source" ).eval()
fetchedRop = curNode.node( fetchedPath )
return fetchedRop

Here is where the bug start. It trys to get the “source” of the Fetch node, but failed to get anything. So we can see the error saying:

1
‘NoneType’ object has no attribute ‘eval’

How to fix it?

Deadline user yongsoon provided his solution in Mar 7, 2024, by adding 2 lines of code in the getFtechedNode() function.
yongsoon’s bug report

1
2
3
4
5
6
7
8
9
@staticmethod
def _getFetchedNode( curNode ):
# In addition to the normal inputs fetch nodes point to an additional node which we can treat like other input nodes
try:
fetchedPath = curNode.parm("source").eval()
except:
return None
fetchedRop = curNode.node(fetchedPath)
return fetchedRop

By returning a None but not force the submitter to trace the source of the Fetch node to avoid the error.
And there is another way to solve it.

Why it happens?

The root reason is that the Deadline is developed before Karma comes up to the stage, and the code serves for ROPs nodes. It works well on ROPs Fetch, but the LOPs Fetch has a different attribute name, that’s why curNode.parm(“source”).eval() will throw an error, for the name of the upper stream source is different.

And that’s why we can return None. For deadline submitter only care about what happens in ROPs, but not LOPs.
Further deeper, another user mois.moshev mentions that if realy needs to fix the logic, we should make change in the func isFetch(), or even more earlier, but not fix it where it is about to crash.

1
isFetch = ( curNode.type().name() == "fetch" )

LOPs Fetch and ROPs Fetch are both called “fetch” and that leads to the issue.
After I checked some documents, here is a more elegant patch.

1
isFetch = ( curNode.type().name() == "fetch" and curNode.type().category().label() == "Outputs")

Rambling

This bug actually has been mentioned in 2020, (the fetch bug) but nobody solved it. Deadline has a very slow updating rate, we would never know when would they release their next version or if they would fix this problem.