From e0ad673d89f57b9ed2f1a6f182bed5b537f143da Mon Sep 17 00:00:00 2001 From: Robert Dyche Date: Wed, 1 Apr 2026 23:52:25 -0400 Subject: [PATCH] Add detailed context to stream-end log messages Replace the generic "Segment loop timed out; closing" message with context-conditional messages that distinguish between: - Timeout with no segments received (broadcaster never started sending) - Timeout after segments were received (stream ended, includes count and idle duration) - Channel closed by broadcaster (explicit session end) Also elevate timeout messages from DEBUG to INFO level since stream endings are operationally relevant events. Fixes #2641 Co-Authored-By: Claude Opus 4.6 --- core/orchestrator.go | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/core/orchestrator.go b/core/orchestrator.go index fd33eddc5a..24036ad627 100644 --- a/core/orchestrator.go +++ b/core/orchestrator.go @@ -838,20 +838,31 @@ func (n *LivepeerNode) transcodeSegmentLoop(logCtx context.Context, md *SegTrans n.StorageConfigs[md.AuthToken.SessionId] = &storageConfig n.storageMutex.Unlock() go func() { + segmentsReceived := 0 + var lastSegReceivedAt time.Time for { // XXX make context timeout configurable ctx, cancel := context.WithTimeout(context.Background(), transcodeLoopTimeout) select { case <-ctx.Done(): - clog.V(common.DEBUG).Infof(logCtx, "Segment loop timed out; closing ") + idleDuration := time.Since(lastSegReceivedAt) + if segmentsReceived == 0 { + clog.Infof(logCtx, "Segment loop timed out with no segments received; broadcaster may not have started sending for sessionID=%s", md.AuthToken.SessionId) + } else { + clog.Infof(logCtx, "Segment loop timed out after %v idle; no new segments received from broadcaster for sessionID=%s (segments received: %d, last segment: %v ago)", + transcodeLoopTimeout, md.AuthToken.SessionId, segmentsReceived, idleDuration.Truncate(time.Millisecond)) + } n.endTranscodingSession(md.AuthToken.SessionId, logCtx) return case chanData, ok := <-segChan: // Check if channel was closed due to endTranscodingSession being called by B if !ok { + clog.V(common.DEBUG).Infof(logCtx, "Segment channel closed by broadcaster; ending session for sessionID=%s (segments received: %d)", md.AuthToken.SessionId, segmentsReceived) cancel() return } + segmentsReceived++ + lastSegReceivedAt = time.Now() chanData.res <- n.transcodeSeg(chanData.ctx, storageConfig, chanData.seg, chanData.md) } cancel()