Incident Library
Applied filters SymptomMemory pressureFactorHarmful manual actionClear allEvery case under the filters, with no sentence; newest first.
Suggested filters Search, and the values found in your words appear here.

Graph

  • Root cause
  • Component
  • Symptom
  • Contributing factor
  • Case

Cases2 cases

1 to 2 of 2

  1. Symptoms

    Between about 15:30 and 18:00 UTC on 25 November 2025 some AdGuard DNS users saw slow or failed DNS resolution, with timeouts and SERVFAIL responses. Alerts fired for increased DNS error rates and server load, and a significant part of the traffic in several European locations, primarily Amsterdam, Frankfurt and London, had intermittent DNS failures for up to 2.5 hours.

    Trigger

    A new version of AdGuard DNS, deployed on 25 November to improve how resolvers cache user data, had a bug that saved only the recently changed subset of user data into the local cache file. The first deployment failed partway on a network issue and left about half the servers on the new version; the second attempt made many resolvers start full synchronizations at once.

    Root cause
    Component
    Contributing factor
    Detection

    Alerts for increased DNS error rates and server load fired during the second deployment attempt, between 15:30 and 16:00 UTC.

    Remediation
    • Rolled back the buggy version on all servers
    • Partially rerouted Amsterdam's traffic to other European locations
    • Reduced connection concurrency and request pipeline depth in Frankfurt and London, from 5 to 1 in Frankfurt
    • Adjusted limits to the actual hardware capacity
    • Repaired corrupted cache files and user data snapshots to stop further full synchronizations
    • Normalised the traffic distribution once the rollback was complete
    Action items
    • Add automated tests that the full user dataset is correctly written to and restored from the local cache file, including detection of empty or truncated caches
    • Add integration tests that simulate resolver startup with an empty or corrupted cache under realistic load
    • Standardize server hardware profiles per location, or keep separate configurations per hardware class
    • Review and adjust connlimit, cache sizes and connection limits for each standard node type
    • Reevaluate and lower pipelining depth where needed
    • Reevaluate how connections and goroutines are limited so resource use stays bounded with decent throughput after a connection break
    • Monitor Go heap size, GC time, GC cycles per second and per-cluster request latency distributions
    • Alert on sustained increases in SERVFAIL rate and request duration while upstreams are healthy
    • Refine DNS resolver deployment and rollback procedures to avoid simultaneous cache invalidation across a large part of the fleet
    • Document and rehearse playbooks for adjusting pipeline depth, connection limits and connlimit during live incidents
    Lessons

    How nodes behaved depended on the interaction between available RAM, Go's garbage collector and the connlimit setting. On 64-GiB nodes a high limit let the heap grow large under heavy concurrency and pipelining, and the garbage collector then spent more and more CPU, a known worst case for high-memory applications in which memory is not exhausted but latency rises and throughput falls. On 32-GiB nodes the same configuration reached practical memory limits sooner because it had not been scaled down. Together with high pipelining and client retries, GC pressure, connection saturation and retries formed a feedback loop.

  2. Symptoms

    On 17 and 18 November 2017 nodes of Discord's 'sessions' cluster on Google Cloud Platform lost network connectivity for short periods, 16 times in all. Engineers saw a service impact, a node whose service had died and restarted, and pages for low memory on other sessions nodes; twice the failure cascaded and Discord was completely offline for about 30 minutes.

    Trigger

    A software change that Google rolled out to the Google Cloud Platform networking stack on Friday introduced a bug that made VMs in Discord's sessions cluster lose network connectivity for short periods.

    Root cause
    Component
    Contributing factor
    Detection

    At 11:52 PST on 17 November engineers noticed a service impact and escalated it in the incident chat. Later affected nodes showed up as pages to the on-call engineer for low memory on sessions nodes, and on 18 November as a page for a networking incident on sessions-1-11 together with issue reports that the customer experience team escalated from support channels.

    Remediation
    • Forcefully terminated sessions nodes whose Erlang distribution port had failed
    • Escalated the Google support ticket to P1 and notified the Technical Account Manager
    • Restarted several core Discord services on 17 November, making clients reconnect over about 20 minutes
    • Began terminating and rebooting the entire sessions cluster after seeing that rebooted machines did not fail again
    • Disabled message sending globally on 18 November to help the service recover
    • Restarted all members of the sessions cluster
    • Re-enabled message sending after the initial all clear
    • Google rolled back the software change made to its networking stack
    Action items
    • Continue the project to improve how Discord's Erlang clusters handle node failure
    • Expand how upgrades to these services are load tested so the rollout can be completed safely
    • Replace the HTTP library used by Discord's Elixir/Erlang services
    • Fix the instability seen in Erlang's net_kernel component
    • Replace the pieces of the service discovery component that degraded with more performant implementations
    • Work with Google on the issues Discord met while working with Google on this incident
    • Expand the internal procedure for communicating with Google so the progress of P1 issues is tracked
    Lessons

    Discord concluded that performance and stability issues in its own system, in Erlang's net_kernel, the service discovery component and the HTTP library, were what turned short network losses on part of the fleet from isolated issues for some users into two full system outages.

Check your cluster for this

These 2 cases involve Language runtime settings and Recursive DNS resolver service. kubegap audits a Kubernetes cluster for gaps like these, read-only, from Claude Code or Codex; its checks cite public reports like the ones in this library.

By root cause2