From 74c9ec2ff10925a2221d8d994c2ec5bc494c10ff Mon Sep 17 00:00:00 2001 From: Igor Loskutov Date: Fri, 30 Jan 2026 14:37:53 -0500 Subject: [PATCH] race condition debug wip --- server/reflector/video_platforms/daily.py | 4 ++ server/reflector/worker/process.py | 63 +++++++++++++++++++---- 2 files changed, 58 insertions(+), 9 deletions(-) diff --git a/server/reflector/video_platforms/daily.py b/server/reflector/video_platforms/daily.py index cef78b4c..bbf7413a 100644 --- a/server/reflector/video_platforms/daily.py +++ b/server/reflector/video_platforms/daily.py @@ -129,6 +129,10 @@ class DailyClient(VideoPlatformClient): """Get room presence/session data for a Daily.co room.""" return await self._api_client.get_room_presence(room_name) + async def delete_room(self, room_name: str) -> None: + """Delete a Daily.co room (idempotent - succeeds even if room doesn't exist).""" + return await self._api_client.delete_room(room_name) + async def get_meeting_participants( self, meeting_id: str ) -> MeetingParticipantsResponse: diff --git a/server/reflector/worker/process.py b/server/reflector/worker/process.py index 8d88de43..a67e95aa 100644 --- a/server/reflector/worker/process.py +++ b/server/reflector/worker/process.py @@ -845,15 +845,47 @@ async def process_meetings(): end_date = end_date.replace(tzinfo=timezone.utc) client = create_platform_client(meeting.platform) - room_sessions = await client.get_room_sessions(meeting.room_name) + has_active_sessions = False + has_had_sessions = False - has_active_sessions = bool( - room_sessions and any(s.ended_at is None for s in room_sessions) - ) - has_had_sessions = bool(room_sessions) - logger_.info( - f"has_active_sessions={has_active_sessions}, has_had_sessions={has_had_sessions}" - ) + if meeting.platform == "daily": + try: + presence = await client.get_room_presence(meeting.room_name) + has_active_sessions = presence.total_count > 0 + + room_sessions = await client.get_room_sessions( + meeting.room_name + ) + has_had_sessions = bool(room_sessions) + + logger_.info( + "Daily.co presence check", + has_active_sessions=has_active_sessions, + has_had_sessions=has_had_sessions, + presence_count=presence.total_count, + ) + except Exception: + logger_.warning( + "Daily.co presence API failed, falling back to DB sessions", + exc_info=True, + ) + room_sessions = await client.get_room_sessions( + meeting.room_name + ) + has_active_sessions = bool( + room_sessions + and any(s.ended_at is None for s in room_sessions) + ) + has_had_sessions = bool(room_sessions) + else: + room_sessions = await client.get_room_sessions(meeting.room_name) + has_active_sessions = bool( + room_sessions and any(s.ended_at is None for s in room_sessions) + ) + has_had_sessions = bool(room_sessions) + logger_.info( + f"has_active_sessions={has_active_sessions}, has_had_sessions={has_had_sessions}" + ) if has_active_sessions: logger_.debug("Meeting still has active sessions, keep it") @@ -872,7 +904,20 @@ async def process_meetings(): await meetings_controller.update_meeting( meeting.id, is_active=False ) - logger_.info("Meeting is deactivated") + logger_.info("Meeting deactivated in database") + + if meeting.platform == "daily": + try: + await client.delete_room(meeting.room_name) + logger_.info( + "Daily.co room deleted", room_name=meeting.room_name + ) + except Exception: + logger_.warning( + "Failed to delete Daily.co room", + room_name=meeting.room_name, + exc_info=True, + ) processed_count += 1