| @@ -112,6 +112,7 @@ type RuntimeTransition struct { | |||||
| const ( | const ( | ||||
| lateBufferIndicatorWindow = 5 * time.Second | lateBufferIndicatorWindow = 5 * time.Second | ||||
| writeLateTolerance = 1 * time.Millisecond | |||||
| queueCriticalStreakThreshold = 3 | queueCriticalStreakThreshold = 3 | ||||
| queueMutedStreakThreshold = queueCriticalStreakThreshold * 2 | queueMutedStreakThreshold = queueCriticalStreakThreshold * 2 | ||||
| queueMutedRecoveryThreshold = queueCriticalStreakThreshold | queueMutedRecoveryThreshold = queueCriticalStreakThreshold | ||||
| @@ -588,12 +589,13 @@ func (e *Engine) writerLoop(ctx context.Context) { | |||||
| queueStats := e.frameQueue.Stats() | queueStats := e.frameQueue.Stats() | ||||
| e.evaluateRuntimeState(queueStats, e.hasRecentLateBuffers()) | e.evaluateRuntimeState(queueStats, e.hasRecentLateBuffers()) | ||||
| if writeDur > e.chunkDuration { | |||||
| lateOver := writeDur - e.chunkDuration | |||||
| if lateOver > writeLateTolerance { | |||||
| late := e.lateBuffers.Add(1) | late := e.lateBuffers.Add(1) | ||||
| e.lateBufferAlertAt.Store(uint64(time.Now().UnixNano())) | e.lateBufferAlertAt.Store(uint64(time.Now().UnixNano())) | ||||
| if late <= 5 || late%20 == 0 { | if late <= 5 || late%20 == 0 { | ||||
| log.Printf("TX LATE: write=%s budget=%s over=%s queueResidence=%s pipeline=%s", | |||||
| writeDur, e.chunkDuration, writeDur-e.chunkDuration, queueResidence, pipelineLatency) | |||||
| log.Printf("TX LATE: write=%s budget=%s over=%s tolerance=%s queueResidence=%s pipeline=%s", | |||||
| writeDur, e.chunkDuration, lateOver, writeLateTolerance, queueResidence, pipelineLatency) | |||||
| } | } | ||||
| } | } | ||||