Skip to content

Commit

Permalink
Add test showing issue with child in tty lock when cancelled
Browse files Browse the repository at this point in the history
  • Loading branch information
goodboy committed Oct 7, 2020
1 parent abf8bb2 commit 3917117
Show file tree
Hide file tree
Showing 2 changed files with 61 additions and 0 deletions.
48 changes: 48 additions & 0 deletions examples/debugging/root_cancelled_but_child_is_in_tty_lock.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
import tractor


async def name_error():
"Raise a ``NameError``"
getattr(doggypants)


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_0', '3720602b ...)
│ └─ python -m tractor._child --uid ('name_error', '505bf71d ...)
└─ python -m tractor._child --uid ('spawner0', '1d42012b ...)
└─ python -m tractor._child --uid ('name_error', '6c2733b8 ...)
"""
async with tractor.open_nursery() as n:

# spawn both actors
portal = await n.run_in_actor('spawner0', spawn_until, depth=0)
portal1 = await n.run_in_actor('spawner1', spawn_until, depth=1)

# nursery cancellation should be triggered due to propagated error
await portal.result()
await portal1.result()


if __name__ == '__main__':
tractor.run(main, debug_mode=True, loglevel='trace')
13 changes: 13 additions & 0 deletions tests/test_debugger.py
Original file line number Diff line number Diff line change
Expand Up @@ -331,3 +331,16 @@ def test_multi_nested_subactors_error_through_nurseries(spawn):

before = str(child.before.decode())
assert "NameError" in before


def test_root_nursery_cancels_before_child_releases_tty_lock(spawn):
"""Exemplifies a bug where the root sends a cancel message before a nested child
which has the tty lock (and is in pdb) doesn't cancel after exiting the debugger.
"""
child = spawn('root_cancelled_but_child_is_in_tty_lock')

for _ in range(5):
child.expect(r"\(Pdb\+\+\)")
child.sendline('c')

# child.expect(pexpect.EOF)

1 comment on commit 3917117

@goodboy
Copy link
Owner Author

@goodboy goodboy commented on 3917117 Oct 7, 2020

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Afaict this is something to do with a cancel message being sent to a subactor but that child is already in "synchronous land" blocking inside pdb.

I'm not entirely sure I understand why the cancellation isn't triggering once the debugger is exited and the next checkpoint is hit..

Please sign in to comment.