Spaces:
Runtime error
Runtime error
da03
commited on
Commit
·
5850e24
1
Parent(s):
bad20e3
- dispatcher.py +43 -12
dispatcher.py
CHANGED
@@ -721,31 +721,62 @@ class SessionManager:
|
|
721 |
analytics.log_queue_status(len(self.session_queue), maximum_wait)
|
722 |
|
723 |
def _calculate_maximum_wait_time(self, position_in_queue: int) -> float:
|
724 |
-
"""Calculate
|
725 |
available_workers = len([w for w in self.workers.values() if w.is_available])
|
726 |
|
727 |
# If there are available workers, no wait time
|
728 |
if available_workers > 0:
|
729 |
return 0
|
730 |
|
731 |
-
# Calculate
|
732 |
num_workers = len(self.workers)
|
733 |
if num_workers == 0:
|
734 |
return 999 # No workers available
|
735 |
|
736 |
-
#
|
737 |
-
|
738 |
-
|
739 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
740 |
|
741 |
-
#
|
742 |
-
|
743 |
|
744 |
-
#
|
745 |
-
|
746 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
747 |
|
748 |
-
return
|
749 |
|
750 |
async def handle_user_activity(self, session_id: str):
|
751 |
"""Update user activity timestamp and reset warning flags"""
|
|
|
721 |
analytics.log_queue_status(len(self.session_queue), maximum_wait)
|
722 |
|
723 |
def _calculate_maximum_wait_time(self, position_in_queue: int) -> float:
|
724 |
+
"""Calculate realistic wait time based on actual session remaining times"""
|
725 |
available_workers = len([w for w in self.workers.values() if w.is_available])
|
726 |
|
727 |
# If there are available workers, no wait time
|
728 |
if available_workers > 0:
|
729 |
return 0
|
730 |
|
731 |
+
# Calculate wait time based on position and worker count
|
732 |
num_workers = len(self.workers)
|
733 |
if num_workers == 0:
|
734 |
return 999 # No workers available
|
735 |
|
736 |
+
# Get actual remaining times for active sessions
|
737 |
+
current_time = time.time()
|
738 |
+
active_session_remaining_times = []
|
739 |
+
|
740 |
+
for session_id in self.active_sessions:
|
741 |
+
session = self.sessions.get(session_id)
|
742 |
+
if session:
|
743 |
+
# Only consider session time limit (hard limit), not idle timeout
|
744 |
+
# Users can reset idle timeout by moving mouse, but session limit is fixed
|
745 |
+
if session.max_session_time and session.session_limit_start_time:
|
746 |
+
elapsed = current_time - session.session_limit_start_time
|
747 |
+
remaining_time = max(0, session.max_session_time - elapsed)
|
748 |
+
else:
|
749 |
+
# No session limit set (shouldn't happen when queue exists, but fallback)
|
750 |
+
remaining_time = self.MAX_SESSION_TIME_WITH_QUEUE
|
751 |
+
|
752 |
+
active_session_remaining_times.append(remaining_time)
|
753 |
|
754 |
+
# Sort remaining times (shortest first)
|
755 |
+
active_session_remaining_times.sort()
|
756 |
|
757 |
+
# Calculate when this user will get a worker
|
758 |
+
if position_in_queue <= len(active_session_remaining_times):
|
759 |
+
# User will get a worker when the Nth session ends
|
760 |
+
estimated_wait = active_session_remaining_times[position_in_queue - 1]
|
761 |
+
logger.info(f"Queue position {position_in_queue}: Will get worker when session #{position_in_queue} ends in {estimated_wait:.1f}s")
|
762 |
+
logger.info(f"Active session remaining times: {[f'{t:.1f}s' for t in active_session_remaining_times]}")
|
763 |
+
else:
|
764 |
+
# More people in queue than active sessions
|
765 |
+
# Need to wait for multiple "waves" to complete
|
766 |
+
full_waves = (position_in_queue - 1) // num_workers
|
767 |
+
position_in_final_wave = (position_in_queue - 1) % num_workers
|
768 |
+
|
769 |
+
# Wait for current sessions to end, then full waves, then partial wave
|
770 |
+
if active_session_remaining_times:
|
771 |
+
first_wave_time = max(active_session_remaining_times)
|
772 |
+
else:
|
773 |
+
first_wave_time = self.MAX_SESSION_TIME_WITH_QUEUE
|
774 |
+
|
775 |
+
additional_wave_time = full_waves * self.MAX_SESSION_TIME_WITH_QUEUE
|
776 |
+
estimated_wait = first_wave_time + additional_wave_time
|
777 |
+
logger.info(f"Queue position {position_in_queue}: Need {full_waves} full waves + current sessions. Wait: {estimated_wait:.1f}s")
|
778 |
|
779 |
+
return estimated_wait
|
780 |
|
781 |
async def handle_user_activity(self, session_id: str):
|
782 |
"""Update user activity timestamp and reset warning flags"""
|