Skip to content

Commit 3af078e

Browse files
committed
simplify active_drivers
1 parent 13cca62 commit 3af078e

File tree

2 files changed

+36
-54
lines changed

2 files changed

+36
-54
lines changed

telemetry/pitcrew/active_drivers.py

+27-45
Original file line numberDiff line numberDiff line change
@@ -1,82 +1,64 @@
11
import logging
2-
from typing import Dict, Union
2+
from typing import Dict
33

44
import django.utils.timezone
55

66
from telemetry.models import Driver
77

8-
from .session import Session
9-
from .session_rbr import SessionRbr
10-
118

129
class ActiveDrivers:
13-
def __init__(self, debug=False):
10+
def __init__(self, debug=False, inactive_timeout_seconds=600):
1411
self.debug = debug
15-
self.sessions: Dict[str, Union[Session, SessionRbr]] = {}
16-
self.do_clear_sessions = False
12+
self.inactive_timeout_seconds = inactive_timeout_seconds
13+
self.topics: Dict[str, dict] = {} # Maps topic to metadata including driver and last_seen
1714

1815
def notify(self, topic, payload, now=None):
1916
now = now or django.utils.timezone.now()
20-
if topic not in self.sessions:
17+
18+
if topic not in self.topics:
2119
try:
2220
(
2321
prefix,
24-
driver,
22+
driver_name,
2523
session_id,
2624
game,
2725
track,
2826
car,
2927
session_type,
3028
) = topic.split("/")
3129
except ValueError:
32-
# ignore invalid session
30+
# ignore invalid topic
3331
return
3432

35-
if game == "Richard Burns Rally":
36-
session = SessionRbr(topic, start=now)
37-
else:
38-
session = Session(topic, start=now)
39-
4033
try:
41-
db_driver, created = Driver.objects.get_or_create(name=driver)
42-
session.driver = db_driver
43-
session.session_id = session_id
44-
logging.debug(f"New session: {topic}")
45-
session.game_name = game
46-
session.track = track
47-
session.car = car
48-
session.car_class = payload.get("CarClass", "")
49-
session.session_type = session_type
50-
self.sessions[topic] = session
34+
db_driver, created = Driver.objects.get_or_create(name=driver_name)
35+
self.topics[topic] = {"driver": db_driver, "last_seen": now, "session_id": session_id, "game": game, "track": track, "car": car, "car_class": payload.get("CarClass", ""), "session_type": session_type}
36+
logging.debug(f"New topic: {topic}")
5137
except Exception as e:
52-
logging.error(f"Error creating driver {driver} - {e}")
38+
logging.error(f"Error creating driver {driver_name} - {e}")
5339
return
54-
55-
session = self.sessions[topic]
56-
session.end = now
57-
if self.do_clear_sessions:
40+
# clear inactive topics every time a new topic is added
5841
self.clear_sessions(now)
42+
else:
43+
self.topics[topic]["last_seen"] = now
5944

60-
# TODO: clear sessions every now and then
6145
def clear_sessions(self, now):
62-
"""Clear inactive telemetry sessions.
46+
"""Clear inactive topics.
6347
64-
Loops through all sessions and deletes:
65-
- Any session inactive for more than 10 minutes
66-
- Any lap marked for deletion
48+
Removes any topic that hasn't received updates for longer than inactive_timeout_seconds
6749
6850
Args:
6951
now (datetime): The current datetime
70-
7152
"""
53+
delete_topics = []
54+
for topic, metadata in self.topics.items():
55+
if (now - metadata["last_seen"]).seconds > self.inactive_timeout_seconds:
56+
delete_topics.append(topic)
7257

73-
delete_sessions = []
74-
for topic, session in self.sessions.items():
75-
# Delete session without updates for 10 minutes
76-
if (now - session.end).seconds > 600:
77-
delete_sessions.append(topic)
58+
for topic in delete_topics:
59+
del self.topics[topic]
60+
logging.debug(f"{topic}\n\t deleting inactive topic")
7861

79-
# Delete all inactive sessions
80-
for topic in delete_sessions:
81-
del self.sessions[topic]
82-
logging.debug(f"{topic}\n\t deleting inactive session")
62+
def drivers(self):
63+
"""Return set of all active drivers"""
64+
return {metadata["driver"] for metadata in self.topics.values()}

telemetry/pitcrew/coach_watcher.py

+9-9
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,13 @@
22
import threading
33
import time
44

5-
from telemetry.models import Driver
6-
75
from .active_drivers import ActiveDrivers
86

97
# from .coach import Coach as PitCrewCoach
108
# from .coach_app import CoachApp
119
# from .coach_copilots import CoachCopilots
1210
from .coach_copilots_no_history import CoachCopilotsNoHistory
11+
1312
# from .history import History
1413
from .kube_crew import KubeCrew
1514
from .mqtt import Mqtt
@@ -32,12 +31,13 @@ def stopped(self):
3231
return self._stop_event.is_set()
3332

3433
def drivers(self):
35-
drivers = set()
36-
for session in self.firehose.sessions.values():
37-
# check if session.driver is a Driver object
38-
if isinstance(session.driver, Driver):
39-
drivers.add(session.driver)
40-
return drivers
34+
return self.firehose.drivers()
35+
# drivers = set()
36+
# for session in self.firehose.sessions.values():
37+
# # check if session.driver is a Driver object
38+
# if isinstance(session.driver, Driver):
39+
# drivers.add(session.driver)
40+
# return drivers
4141

4242
def watch_coaches(self):
4343
self.ready = True
@@ -49,7 +49,7 @@ def watch_coaches(self):
4949
for driver in drivers:
5050
self.kube_crew.drivers.add(driver.name)
5151
self.kube_crew.sync_deployments()
52-
self.firehose.do_clear_sessions = True
52+
# self.firehose.do_clear_sessions = True
5353

5454
# def start_coach(self, driver_name, coach_model, debug=False):
5555
# history = History()

0 commit comments

Comments
 (0)