fix: Invalidate cache of removed input sockets.
This was a nasty (interesting?) one - usually, input sockets are not attempted used after the socket no longer exists. Various checks in ex. `events` tend to help that process along. Unfortunately (fortunately?), `Extract` uses a `_compute_input` query with `optional=True`, which results in a direct attempt to hit the cache without any other checks. Because old input socket caches were never deleted, it would **continue to get cached data from sockets that no longer exist**. While on the surface this could be considered a case of "the private method (`_compute_input`) is private for a reason", or alternatively, "don't hijack the graph flow", I'm more convinced that the usage is actually quite clean, being read-only and generally well-conceived. It's reasonable to presume that asking for a thing that doesn't exist won't produce output! Moreover, I wouldn't be surprised if several other mysterious bugs were caused by this. Not to mention the memory leak of endless caching! (Well, until the node is deleted). It's a good things we noticed!main
parent
c82862dde9
commit
785995117e
|
@ -69,10 +69,8 @@ class ExtractDataNode(base.MaxwellSimNode):
|
|||
'Sim Data', kind=ct.FlowKind.Value, optional=True
|
||||
)
|
||||
if not ct.FlowSignal.check(sim_data):
|
||||
log.critical('Sim Data was Not FlowSignal')
|
||||
return sim_data
|
||||
|
||||
log.critical('Sim Data was FlowSignal: %s', str(sim_data))
|
||||
return None
|
||||
|
||||
@bl_cache.cached_bl_property()
|
||||
|
@ -190,9 +188,6 @@ class ExtractDataNode(base.MaxwellSimNode):
|
|||
Returns:
|
||||
Valid `self.extract_filter` in a format compatible with dynamic `EnumProperty`.
|
||||
"""
|
||||
log.critical('Searching Extract Filters')
|
||||
log.critical(self.sim_data_monitor_nametype)
|
||||
log.critical(self.monitor_data_components)
|
||||
if self.sim_data_monitor_nametype is not None:
|
||||
return [
|
||||
(monitor_name, monitor_name, monitor_type.removesuffix('Data'), '', i)
|
||||
|
|
|
@ -430,6 +430,11 @@ class MaxwellSimNode(bpy.types.Node):
|
|||
# Remove Sockets
|
||||
for bl_socket in bl_sockets_to_remove:
|
||||
node_tree.on_node_socket_removed(bl_socket)
|
||||
self._compute_input.invalidate(
|
||||
input_socket_name=bl_socket.name,
|
||||
kind=...,
|
||||
unit_system=...,
|
||||
)
|
||||
all_bl_sockets.remove(bl_socket)
|
||||
|
||||
def _add_new_active_sockets(self):
|
||||
|
@ -771,12 +776,6 @@ class MaxwellSimNode(bpy.types.Node):
|
|||
# Invalidate Input Socket Cache
|
||||
if input_socket_name is not None:
|
||||
if socket_kinds is None:
|
||||
log.critical(
|
||||
'[%s] Invalidating: (%s, %s)',
|
||||
self.sim_node_name,
|
||||
input_socket_name,
|
||||
str(socket_kinds),
|
||||
)
|
||||
self._compute_input.invalidate(
|
||||
input_socket_name=input_socket_name,
|
||||
kind=...,
|
||||
|
@ -784,12 +783,6 @@ class MaxwellSimNode(bpy.types.Node):
|
|||
)
|
||||
else:
|
||||
for socket_kind in socket_kinds:
|
||||
log.critical(
|
||||
'[%s] Invalidating: (%s, %s)',
|
||||
self.sim_node_name,
|
||||
input_socket_name,
|
||||
str(socket_kind),
|
||||
)
|
||||
self._compute_input.invalidate(
|
||||
input_socket_name=input_socket_name,
|
||||
kind=socket_kind,
|
||||
|
@ -844,15 +837,11 @@ class MaxwellSimNode(bpy.types.Node):
|
|||
)
|
||||
for event_method in triggered_event_methods:
|
||||
stop_propagation |= event_method.stop_propagation
|
||||
log.critical(
|
||||
'$[%s] [%s %s %s %s] Running: (%s)',
|
||||
self.sim_node_name,
|
||||
event,
|
||||
socket_name,
|
||||
socket_kinds,
|
||||
prop_name,
|
||||
event_method.callback_info,
|
||||
)
|
||||
# log.critical(
|
||||
# '$[%s] [%s %s %s %s] Running: (%s)',
|
||||
# self.sim_node_name,
|
||||
# event_method.callback_info,
|
||||
# )
|
||||
event_method(self)
|
||||
|
||||
# Propagate Event to All Sockets in "Trigger Direction"
|
||||
|
|
Loading…
Reference in New Issue