forked from goodboy/tractor
Add a deep nested error propagation test
parent
2b53c74b1c
commit
abf8bb2813
|
@ -0,0 +1,58 @@
|
||||||
|
import tractor
|
||||||
|
|
||||||
|
|
||||||
|
async def name_error():
|
||||||
|
"Raise a ``NameError``"
|
||||||
|
getattr(doggypants)
|
||||||
|
|
||||||
|
|
||||||
|
async def breakpoint_forever():
|
||||||
|
"Indefinitely re-enter debugger in child actor."
|
||||||
|
while True:
|
||||||
|
await tractor.breakpoint()
|
||||||
|
|
||||||
|
|
||||||
|
async def spawn_until(depth=0):
|
||||||
|
""""A nested nursery that triggers another ``NameError``.
|
||||||
|
"""
|
||||||
|
async with tractor.open_nursery() as n:
|
||||||
|
if depth < 1:
|
||||||
|
# await n.run_in_actor('breakpoint_forever', breakpoint_forever)
|
||||||
|
await n.run_in_actor('name_error', name_error)
|
||||||
|
else:
|
||||||
|
depth -= 1
|
||||||
|
await n.run_in_actor(f'spawn_until_{depth}', spawn_until, depth=depth)
|
||||||
|
|
||||||
|
|
||||||
|
async def main():
|
||||||
|
"""The main ``tractor`` routine.
|
||||||
|
|
||||||
|
The process tree should look as approximately as follows when the debugger
|
||||||
|
first engages:
|
||||||
|
|
||||||
|
python examples/debugging/multi_nested_subactors_bp_forever.py
|
||||||
|
├─ python -m tractor._child --uid ('spawner1', '7eab8462 ...)
|
||||||
|
│ └─ python -m tractor._child --uid ('spawn_until_3', 'afcba7a8 ...)
|
||||||
|
│ └─ python -m tractor._child --uid ('spawn_until_2', 'd2433d13 ...)
|
||||||
|
│ └─ python -m tractor._child --uid ('spawn_until_1', '1df589de ...)
|
||||||
|
│ └─ python -m tractor._child --uid ('spawn_until_0', '3720602b ...)
|
||||||
|
│
|
||||||
|
└─ python -m tractor._child --uid ('spawner0', '1d42012b ...)
|
||||||
|
└─ python -m tractor._child --uid ('spawn_until_2', '2877e155 ...)
|
||||||
|
└─ python -m tractor._child --uid ('spawn_until_1', '0502d786 ...)
|
||||||
|
└─ python -m tractor._child --uid ('spawn_until_0', 'de918e6d ...)
|
||||||
|
|
||||||
|
"""
|
||||||
|
async with tractor.open_nursery() as n:
|
||||||
|
|
||||||
|
# spawn both actors
|
||||||
|
portal = await n.run_in_actor('spawner0', spawn_until, depth=3)
|
||||||
|
portal1 = await n.run_in_actor('spawner1', spawn_until, depth=4)
|
||||||
|
|
||||||
|
# gah still an issue here.
|
||||||
|
# await portal.result()
|
||||||
|
# await portal1.result()
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
tractor.run(main, debug_mode=True)
|
|
@ -19,8 +19,8 @@ async def main():
|
||||||
|
|
||||||
The process tree should look as approximately as follows:
|
The process tree should look as approximately as follows:
|
||||||
|
|
||||||
-python examples/debugging/multi_subactors.py
|
python examples/debugging/multi_subactors.py
|
||||||
|-python -m tractor._child --uid ('name_error', 'a7caf490 ...)
|
├─ python -m tractor._child --uid ('name_error', 'a7caf490 ...)
|
||||||
`-python -m tractor._child --uid ('spawn_error', '52ee14a5 ...)
|
`-python -m tractor._child --uid ('spawn_error', '52ee14a5 ...)
|
||||||
`-python -m tractor._child --uid ('name_error', '3391222c ...)
|
`-python -m tractor._child --uid ('name_error', '3391222c ...)
|
||||||
"""
|
"""
|
||||||
|
|
|
@ -310,3 +310,24 @@ def test_multi_subactors_root_errors(spawn):
|
||||||
|
|
||||||
before = str(child.before.decode())
|
before = str(child.before.decode())
|
||||||
assert "AssertionError" in before
|
assert "AssertionError" in before
|
||||||
|
|
||||||
|
|
||||||
|
def test_multi_nested_subactors_error_through_nurseries(spawn):
|
||||||
|
"""Verify deeply nested actors that error trigger debugger entries
|
||||||
|
at each level up the tree.
|
||||||
|
"""
|
||||||
|
|
||||||
|
# TODO: inside this script there's still a bug where if the parent
|
||||||
|
# errors before a 2 levels lower actor has released the lock, the
|
||||||
|
# parent tries to cancel it but it's stuck in the debugger?
|
||||||
|
|
||||||
|
child = spawn('multi_nested_subactors_error_up_through_nurseries')
|
||||||
|
|
||||||
|
for _ in range(12):
|
||||||
|
child.expect(r"\(Pdb\+\+\)")
|
||||||
|
child.sendline('c')
|
||||||
|
|
||||||
|
child.expect(pexpect.EOF)
|
||||||
|
|
||||||
|
before = str(child.before.decode())
|
||||||
|
assert "NameError" in before
|
||||||
|
|
Loading…
Reference in New Issue