Skip to content

Commit 0615a9d

Browse files
authored
fix: Background threads leaking across tests (#229)
1 parent 814e67e commit 0615a9d

4 files changed

Lines changed: 22 additions & 9 deletions

File tree

flagsmith/polling_manager.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
import logging
44
import threading
5-
import time
65
import typing
76

87
if typing.TYPE_CHECKING:
@@ -26,8 +25,11 @@ def __init__(
2625

2726
def run(self) -> None:
2827
while not self._stop_event.is_set():
29-
self.main.update_environment()
30-
time.sleep(self.refresh_interval_seconds)
28+
try:
29+
self.main.update_environment()
30+
except Exception:
31+
logger.exception("Error updating environment")
32+
self._stop_event.wait(self.refresh_interval_seconds)
3133

3234
def stop(self) -> None:
3335
self._stop_event.set()

flagsmith/streaming_manager.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,9 @@ def run(self) -> None:
4040
for event in sse_client.events():
4141
self.on_event(map_sse_event_to_stream_event(event))
4242

43-
except (requests.RequestException, ValueError, TypeError):
43+
except Exception:
4444
logger.exception("Error opening or reading from the event stream")
45+
self._stop_event.wait(1)
4546

4647
def stop(self) -> None:
4748
self._stop_event.set()

tests/conftest.py

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -41,10 +41,14 @@ def tracking_init(self: Flagsmith, *args: typing.Any, **kwargs: typing.Any) -> N
4141
monkeypatch.setattr(Flagsmith, "__init__", tracking_init)
4242
yield
4343
for flagsmith in instances:
44-
if getattr(flagsmith, "environment_data_polling_manager_thread", None):
45-
flagsmith.environment_data_polling_manager_thread.stop()
46-
if getattr(flagsmith, "event_stream_thread", None):
47-
flagsmith.event_stream_thread.stop()
44+
if polling := getattr(
45+
flagsmith, "environment_data_polling_manager_thread", None
46+
):
47+
polling.stop()
48+
polling.join(timeout=5)
49+
if stream := getattr(flagsmith, "event_stream_thread", None):
50+
stream.stop()
51+
stream.join(timeout=5)
4852
if flagsmith._event_processor:
4953
flagsmith._event_processor.stop()
5054

tests/test_flagsmith.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -795,8 +795,14 @@ def test_stream_not_used_by_default(
795795

796796

797797
def test_stream_used_when_enable_realtime_updates_is_true(
798-
requests_session_response_ok: None, server_api_key: str
798+
requests_session_response_ok: None, server_api_key: str, mocker: MockerFixture
799799
) -> None:
800+
# Given
801+
mocker.patch(
802+
"flagsmith.streaming_manager.requests.get",
803+
side_effect=requests.exceptions.ReadTimeout(),
804+
)
805+
800806
# When
801807
flagsmith = Flagsmith(
802808
environment_key=server_api_key,

0 commit comments

Comments
 (0)