StationServer.stop() race conditions
- Dominant language
- Python
- Stars
- 722
- Forks
- 237
- Avg merge
- 11h 31m
- Merged PRs (30d)
- 4
Description
Repeatedly starting and stopping StationServer (e.g. in unit tests) reveals some race conditions in OpenHTF and Tornado.
1. In [openhtf/output/servers/web_gui_server.py:160](https://github.com/google/openhtf/blob/94bebbcefa530675ad39ad90e5e303598d06ab0b/openhtf/output/servers/web_gui_server.py#L158): AttributeError: 'StationServer' object has no attribute 'server'
This happens if you call `stop()` on the server before the `run()` thread has finished setting up the server
2. In [tornado/tcpserver.py:260](https://github.com/tornadoweb/tornado/blob/v6.0.4/tornado/tcpserver.py#L258): KeyError: 11
I'm not sure why you'd hit this, but it also happens sometimes when you call `StationServer`'s `stop()` method.
One workaround is to wrap it in a new context manager like
```py
import contextlib
import time
import typing
import openhtf.output.servers.station_server
@contextlib.contextmanager
def safe_station_server() -> typing.Generator[openhtf.output.servers.station_server.StationServer, None, None]:
"""Workaround for race conditions in StationServer and Tornado libraries."""
server = openhtf.output.servers.station_server.StationServer()
server.start()
while not hasattr(server, "server"):
time.sleep(0)
yield server
try:
server.stop()
except KeyError:
pass
```
Contributor guide
Assessment
This issue has not been assessed yet.