Commit 3636b610 authored by Helmut Jacob's avatar Helmut Jacob Committed by oroulet

Make sure all inverse refereneces are removed on node deletion

Iterating over the references list and deleting inside the same list
resulted in dangling inverse references if nodes where deleted.

Fix this by iterating over a copy of the references list.
parent b5a18e5a
......@@ -336,7 +336,7 @@ class NodeManagementService:
if item.DeleteTargetReferences:
for elem in self._aspace.keys():
for rdesc in self._aspace[elem].references:
for rdesc in self._aspace[elem].references[:]:
if rdesc.NodeId == item.NodeId:
self._aspace[elem].references.remove(rdesc)
......
......@@ -131,6 +131,26 @@ async def test_delete_nodes(opc):
assert var not in childs
async def test_delete_nodes_with_inverse_references(opc):
obj = opc.opc.nodes.objects
fold = await obj.add_folder(2, "FolderToDelete")
var = await fold.add_variable(2, "VarToDelete", 9.1)
var2 = await fold.add_variable(2, "VarWithReference", 9.2)
childs = await fold.get_children()
assert var in childs
assert var2 in childs
# add two references to var, this includes adding the inverse references to var2
await var.add_reference(var2.nodeid, reftype=ua.ObjectIds.HasDescription, forward=True, bidirectional=True)
await var.add_reference(var2.nodeid, reftype=ua.ObjectIds.HasEffect, forward=True, bidirectional=True)
await opc.opc.delete_nodes([var])
childs = await fold.get_children()
assert var not in childs
has_desc_refs = await var2.get_referenced_nodes(refs=ua.ObjectIds.HasDescription, direction=ua.BrowseDirection.Inverse)
assert len(has_desc_refs) == 0
has_effect_refs = await var2.get_referenced_nodes(refs=ua.ObjectIds.HasEffect, direction=ua.BrowseDirection.Inverse)
assert len(has_effect_refs) == 0
async def test_delete_nodes_recursive(opc):
obj = opc.opc.nodes.objects
fold = await obj.add_folder(2, "FolderToDeleteR")
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment