Skip to content

Commit 58efa7b

Browse files
authored
Pass edited nodes to snap._applyNodeEdits (#3520)
1 parent fa2a0b6 commit 58efa7b

File tree

4 files changed

+59
-15
lines changed

4 files changed

+59
-15
lines changed

synapse/lib/node.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -331,8 +331,7 @@ async def pop(self, name, init=False):
331331
if not edits:
332332
return False
333333

334-
await self.snap.applyNodeEdit((self.buid, self.form.name, edits))
335-
self.props.pop(name, None)
334+
await self.snap.applyNodeEdit((self.buid, self.form.name, edits), nodecache={self.buid: self})
336335
return True
337336

338337
def repr(self, name=None, defv=None):
@@ -524,7 +523,7 @@ async def delTag(self, tag, init=False):
524523
edits = await self._getTagDelEdits(tag, init=init)
525524
if edits:
526525
nodeedit = (self.buid, self.form.name, edits)
527-
await self.snap.applyNodeEdit(nodeedit)
526+
await self.snap.applyNodeEdit(nodeedit, nodecache={self.buid: self})
528527

529528
def _getTagPropDel(self, tag):
530529

@@ -585,7 +584,7 @@ async def delTagProp(self, tag, name):
585584
(s_layer.EDIT_TAGPROP_DEL, (tag, name, None, prop.type.stortype), ()),
586585
)
587586

588-
await self.snap.applyNodeEdit((self.buid, self.form.name, edits))
587+
await self.snap.applyNodeEdit((self.buid, self.form.name, edits), nodecache={self.buid: self})
589588

590589
async def delete(self, force=False):
591590
'''

synapse/lib/snap.py

Lines changed: 20 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1085,7 +1085,8 @@ async def getNodeEditor(self, node):
10851085

10861086
nodeedits = editor.getNodeEdits()
10871087
if nodeedits:
1088-
await self.applyNodeEdits(nodeedits)
1088+
nodecache = {proto.buid: proto.node for proto in editor.protonodes.values()}
1089+
await self.applyNodeEdits(nodeedits, nodecache=nodecache)
10891090

10901091
@contextlib.asynccontextmanager
10911092
async def getEditor(self):
@@ -1096,18 +1097,20 @@ async def getEditor(self):
10961097

10971098
nodeedits = editor.getNodeEdits()
10981099
if nodeedits:
1099-
await self.applyNodeEdits(nodeedits)
1100+
nodecache = {proto.buid: proto.node for proto in editor.protonodes.values()}
1101+
await self.applyNodeEdits(nodeedits, nodecache=nodecache)
11001102

1101-
async def applyNodeEdit(self, edit):
1102-
nodes = await self.applyNodeEdits((edit,))
1103-
return nodes[0]
1103+
async def applyNodeEdit(self, edit, nodecache=None):
1104+
nodes = await self.applyNodeEdits((edit,), nodecache=nodecache)
1105+
if nodes:
1106+
return nodes[0]
11041107

1105-
async def applyNodeEdits(self, edits):
1108+
async def applyNodeEdits(self, edits, nodecache=None):
11061109
'''
11071110
Sends edits to the write layer and evaluates the consequences (triggers, node object updates)
11081111
'''
11091112
meta = await self.getSnapMeta()
1110-
saveoff, changes, nodes = await self._applyNodeEdits(edits, meta)
1113+
saveoff, changes, nodes = await self._applyNodeEdits(edits, meta, nodecache=nodecache)
11111114
return nodes
11121115

11131116
async def saveNodeEdits(self, edits, meta):
@@ -1124,7 +1127,7 @@ async def saveNodeEdits(self, edits, meta):
11241127

11251128
return saveoff, changes
11261129

1127-
async def _applyNodeEdits(self, edits, meta):
1130+
async def _applyNodeEdits(self, edits, meta, nodecache=None):
11281131

11291132
if self.readonly:
11301133
mesg = 'The snapshot is in read-only mode.'
@@ -1145,11 +1148,17 @@ async def _applyNodeEdits(self, edits, meta):
11451148

11461149
cache = {wlyr.iden: sode}
11471150

1148-
node = await self._joinStorNode(buid, cache)
1151+
node = None
1152+
if nodecache is not None:
1153+
node = nodecache.get(buid)
11491154

11501155
if node is None:
1151-
# We got part of a node but no ndef
1152-
continue
1156+
node = await self._joinStorNode(buid, cache)
1157+
if node is None:
1158+
# We got part of a node but no ndef
1159+
continue
1160+
else:
1161+
await asyncio.sleep(0)
11531162

11541163
nodes.append(node)
11551164

synapse/tests/test_lib_snap.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -276,6 +276,16 @@ async def test_cortex_lift_layers_simple(self):
276276
self.len(1, await alist(view1.eval('inet:ipv4 +:asn=42')))
277277
self.len(1, await alist(view1.eval('inet:ipv4 +#woot')))
278278

279+
await view0.core.nodes('[ inet:ipv4=1.1.1.1 :asn=5 ]')
280+
nodes = await view0.core.nodes('inet:ipv4=1.1.1.1 [ :asn=6 ]', opts={'view': view1.iden})
281+
282+
await view0.core.nodes('inet:ipv4=1.1.1.1 | delnode')
283+
edits = await nodes[0]._getPropDelEdits('asn')
284+
285+
root = view0.core.auth.rootuser
286+
async with await view1.snap(user=root) as snap:
287+
await snap.applyNodeEdit((nodes[0].buid, 'inet:ipv4', edits))
288+
279289
async def test_cortex_lift_layers_bad_filter(self):
280290
'''
281291
Test a two layer cortex where a lift operation gives the wrong result

synapse/tests/test_lib_storm.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1936,6 +1936,32 @@ async def test_storm_dmon_user_autobump(self):
19361936
await core.setUserLocked(visi.iden, False)
19371937
self.true(await stream.wait(2))
19381938

1939+
async def test_storm_dmon_caching(self):
1940+
1941+
async with self.getTestCore() as core:
1942+
1943+
q = f'''
1944+
$lib.dmon.add(${{
1945+
for $x in $lib.range(2) {{
1946+
inet:ipv4=1.2.3.4
1947+
if $node {{
1948+
$lib.queue.gen(foo).put($node.props.asn)
1949+
$lib.queue.gen(bar).get(1)
1950+
}}
1951+
[ inet:ipv4=1.2.3.4 :asn=5 ]
1952+
$lib.queue.gen(foo).put($node.props.asn)
1953+
$lib.queue.gen(bar).get(0)
1954+
}}
1955+
| spin
1956+
}}, name=foo)'''
1957+
await core.nodes(q)
1958+
1959+
self.eq((0, 5), await core.callStorm('return($lib.queue.gen(foo).get(0))'))
1960+
1961+
await core.nodes('inet:ipv4=1.2.3.4 [ :asn=6 ] $lib.queue.gen(bar).put(0)')
1962+
1963+
self.eq((1, 6), await core.callStorm('return($lib.queue.gen(foo).get(1))'))
1964+
19391965
async def test_storm_pipe(self):
19401966

19411967
async with self.getTestCore() as core:

0 commit comments

Comments
 (0)