google / google/openhtf

StationServer.stop() race conditions

Open
#974 0 comments 0 reactions 0 assignees View on GitHub
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

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.