The bug with no spinner

A video kept stopping and starting with no buffering circle. That missing circle ruled out half the system before I'd opened a single graph, and I checked the graphs anyway.

Someone told me a video kept stopping. It would freeze for a while, then carry on by itself. Then they added the detail that solved it:

The spinning circle doesn't appear when it stops, like it normally does when the internet drops.

That sentence is the whole diagnosis, and it took me an embarrassingly long time to hear it.

What a spinner actually means

A buffering spinner means the player asked for data and is waiting. There's a request open. The network might be slow, the server might be slow, but the conversation is still going.

No spinner means the player isn't waiting for anything. It either got an answer it couldn't use, or it stopped asking. Those are different failures in different halves of the system.

Here are both, side by side. Hit play and watch which one spins.

Slow network
00:00

The next segment is late. The request is still open, so the player knows it is waiting.

Segment deleted → 404
00:00

The next segment is gone. The server answers immediately, so there is nothing to wait for.

Not running — this is a simulation, no video is loaded.
Same stall, same duration. Only one of them has anything pending, so only one of them can show you a spinner. That difference is the whole diagnosis.

I spent the first hour checking everything a spinner would have implicated: server load, disk I/O, network errors, bandwidth. All clean. Load average 0.14, zero packet loss, and a sustained pull of 1.3 GB at 63 MB/s without a single stall.

None of it mattered. The symptom had already ruled that half out.

The actual cause

The player was streaming HLS, which chops video into numbered segments. A cleanup job I'd scheduled was deleting those segments every four hours, including while someone was watching.

So the player asks for the next segment and gets a 404. Not slow data — no data, immediately, with an answer. Nothing to buffer, nothing to spin for. Playback just stops until the server notices and starts producing segments again from that position. That's the pause, and then the restart.

The fix was two settings that should have been on from day one:

With both on, the cleanup job has nothing left to clean up mid-stream.

The lesson I keep relearning

Every instinct I have points at throughput. The person reporting it had already told me it wasn't throughput. I checked anyway. Twice. Because throughput is what I know how to measure.

People using your software hand you the deciding detail without knowing it's the deciding detail. That one sentence contained a fact none of my monitoring had: the client wasn't waiting. No dashboard I own would ever have shown me that.