Telecommunications

When Live Telecom Sessions Silently Stopped Getting Policy Updates: An RCA

Root-caused why live policy changes silently failed for long-lived telecom broadband sessions, isolated the cause with a cross-customer control, and fixed it with configuration only. The mechanism and proof are in the full write-up.

A subscriber-to-session reverse index carried a 10-day TTL on a timestamp stamped once at session create and never renewed. Any session online past 10 days lost its index entry while still live, so policy re-authorization keyed by subscriber identity returned "session not found" and the change-of-authorization never fired. A cross-customer control isolated the single variable; the fix was configuration-only, with no cost on the live request path.

Context and stakes

A national mobile operator runs a policy-and-charging control plane (PCRF-class) as the brain that enforces plan state in real time. When a subscriber's plan changes, whether an add-on is applied or a fair-use throttle or barring is triggered, the control plane must push a RADIUS Change-of-Authorization (CoA) to reprogram the live session on the access gateway so the new policy takes effect immediately. CoA is what makes "apply the barring add-on now" actually mean now.

Session state lived in an in-memory, partitioned SQL store (VoltDB-class) across two tables: a session table and a subscriber-to-session reverse index. The product promise of barring and throttling depends on that CoA firing. If it silently does not, the operator believes a subscriber is throttled when they are not. The failure was worst exactly where it was least visible, on long-lived, always-on broadband sessions that behave perfectly until the moment policy must change.

Problem

A barring or throttle add-on was applied to a live broadband subscriber and the dynamic CoA did not trigger. The engine logged a "session not found" during re-authorization even though the subscriber had a healthy, online session actively sending accounting interims. Enforcement only caught up minutes later, when the next accounting interim carried a session id the engine could resolve directly.

What made it hard: every surface signal said the session was healthy. The session row existed and its timestamp advanced with every interim. The CoA send path looked fine. And because a session has to be up for more than ten days before it breaks, it could not be reproduced on a fresh test session.