Fix ServiceSwitcher reacting to pass-through ErrorFrames from other pipeline stages

ErrorFrames propagating upstream from downstream processors (e.g. TTS) would
enter the ServiceSwitcher via process_frame, traverse the active service sub-pipeline,
and reach push_frame where they incorrectly triggered failover. Now only errors whose
processor is one of the managed services trigger handle_error. Also fix the log in
handle_error to attribute errors to the actual source processor rather than the
current active_service.

Closes #4139
This commit is contained in:
Mark Backman
2026-03-25 22:52:52 -04:00
parent 2441c4f801
commit fdbdbc8be3
2 changed files with 82 additions and 2 deletions

View File

@@ -193,7 +193,8 @@ class ServiceSwitcherStrategyFailover(ServiceSwitcherStrategyManual):
The newly active service if a switch occurred, or None if no
other service is available.
"""
logger.warning(f"Service {self._active_service.name} reported an error: {error.error}")
service_name = error.processor.name if error.processor else self._active_service.name
logger.warning(f"Service {service_name} reported an error: {error.error}")
if len(self._services) <= 1:
logger.error("No other service available to switch to")
@@ -313,8 +314,12 @@ class ServiceSwitcher(ParallelPipeline, Generic[StrategyType]):
return
# Let the strategy react to non-fatal errors from the active service.
# We check that the error originated from one of our managed services
# to avoid reacting to errors that are just propagating upstream
# through the pipeline from downstream processors.
if isinstance(frame, ErrorFrame) and not frame.fatal:
await self.strategy.handle_error(frame)
if frame.processor and frame.processor in self._services:
await self.strategy.handle_error(frame)
await super().push_frame(frame, direction)