goodboy / tractor

A distributed, structured concurrent runtime for Python (and friends)
GNU Affero General Public License v3.0
258 stars 12 forks source link

`OSError: [Errno 9] Bad file descriptor` in cluster test #345

Open goodboy opened 1 year ago

goodboy commented 1 year ago

Due to some change in the downstream history introduced in #343.

Thanks to @guilledk who also discovered this issue in practice during dev of a client project.

Not entirely sure which commit(s) are causing it yet but the error looks as follows (pulled out from #344):

 ERROR    tractor._supervise:_supervise.py:385 Nursery for ('root', '798cdc51-2c9e-4041-a162-6c4d0334feed') errored with
  + Exception Group Traceback (most recent call last):
  |   File "/home/goodboy/repos/tractor/tractor/_supervise.py", line 339, in _open_and_supervise_one_cancels_all_nursery
  |     yield anursery
  |   File "/home/goodboy/repos/tractor/tractor/_supervise.py", line 499, in open_nursery
  |     yield anursery
  |   File "/home/goodboy/repos/tractor/tractor/_clustering.py", line 58, in open_actor_cluster
  |     async with trio.open_nursery() as n:
  |   File "/home/goodboy/.virtualenvs/310tractor/lib/python3.10/site-packages/trio/_core/_run.py", line 850, in __aexit__
  |     raise combined_error_from_nursery
  | trio.NonBaseMultiError: OSError(9, 'Bad file descriptor'), OSError(9, 'Bad file descriptor'), OSError(9, 'Bad file descriptor'), OSError(9, 'Bad file descriptor')
  +-+---------------- 1 ----------------
    | Traceback (most recent call last):
    |   File "/home/goodboy/repos/tractor/tractor/_clustering.py", line 63, in _start
    |     portals[name] = await an.start_actor(
    |   File "/home/goodboy/repos/tractor/tractor/_supervise.py", line 155, in start_actor
    |     parent_addr = self._actor.accept_addr
    |   File "/home/goodboy/repos/tractor/tractor/_runtime.py", line 1175, in accept_addr
    |     return self._listeners[0].socket.getsockname()  # type: ignore
    | OSError: [Errno 9] Bad file descriptor
    +---------------- 2 ----------------
    | Traceback (most recent call last):
    |   File "/home/goodboy/repos/tractor/tractor/_clustering.py", line 63, in _start
    |     portals[name] = await an.start_actor(
    |   File "/home/goodboy/repos/tractor/tractor/_supervise.py", line 155, in start_actor
    |     parent_addr = self._actor.accept_addr
    |   File "/home/goodboy/repos/tractor/tractor/_runtime.py", line 1175, in accept_addr
    |     return self._listeners[0].socket.getsockname()  # type: ignore
    | OSError: [Errno 9] Bad file descriptor
    +---------------- 3 ----------------
    | Traceback (most recent call last):
    |   File "/home/goodboy/repos/tractor/tractor/_clustering.py", line 63, in _start
    |     portals[name] = await an.start_actor(
    |   File "/home/goodboy/repos/tractor/tractor/_supervise.py", line 155, in start_actor
    |     parent_addr = self._actor.accept_addr
    |   File "/home/goodboy/repos/tractor/tractor/_runtime.py", line 1175, in accept_addr
    |     return self._listeners[0].socket.getsockname()  # type: ignore
    | OSError: [Errno 9] Bad file descriptor
    +---------------- 4 ----------------
    | Traceback (most recent call last):
    |   File "/home/goodboy/repos/tractor/tractor/_clustering.py", line 63, in _start
    |     portals[name] = await an.start_actor(
    |   File "/home/goodboy/repos/tractor/tractor/_supervise.py", line 155, in start_actor
    |     parent_addr = self._actor.accept_addr
    |   File "/home/goodboy/repos/tractor/tractor/_runtime.py", line 1175, in accept_addr
    |     return self._listeners[0].socket.getsockname()  # type: ignore
    | OSError: [Errno 9] Bad file descriptor
    +------------------------------------

TODO: