Pi-hole was gravity-blocking Microsoft telemetry domains that Xbox calls synchronously during menu transitions, causing 5-10s hangs. Created per-client Xbox group with allowlist on both Pi-holes. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
5.6 KiB
| title | description | type | domain | tags | |||||
|---|---|---|---|---|---|---|---|---|---|
| Incident: MLB The Show Xbox Menu Delays Caused by Pi-hole Blocking | Root cause analysis for multi-second menu delays in MLB The Show on Xbox, caused by Pi-hole gravity-blocking Microsoft telemetry domains that the game calls synchronously. | troubleshooting | gaming |
|
Incident: MLB The Show Xbox Menu Delays — Pi-hole Blocking
Date: 2026-03-14
Platform: Xbox Series X (MAC: 3C:FA:06:C7:D0:09)
Game: MLB The Show 26
Impact: 5-10 second delays when toggling in-game menus
Symptoms
- Multi-second hangs (5-10s) when navigating between menus in MLB The Show online
- Game itself loaded and played fine; issue was specifically menu transitions
- No obvious network errors or disconnections
Root Cause
MLB The Show (and the Xbox OS) make synchronous HTTP calls to Microsoft telemetry and settings domains during menu transitions. When Pi-hole gravity-blocks these domains (returning 0.0.0.0), the game hangs waiting for the TCP connection to time out before proceeding.
Five blocked domains were identified hitting the Xbox:
| Domain | Blocklist | Purpose |
|---|---|---|
settings-win.data.microsoft.com |
VeleSila/yhosts | Xbox/Windows settings sync |
arc.msn.com |
blocklistproject/ads | Microsoft ads/telemetry |
v10.events.data.microsoft.com |
blocklistproject/ads, developerdan/ads-tracking | Microsoft telemetry |
v20.events.data.microsoft.com |
SNAFU, developerdan/ads-tracking | Microsoft telemetry |
activity.windows.com |
developerdan/ads-tracking | Windows activity history |
Key evidence from Pi-hole logs
The Xbox was retrying settings-win.data.microsoft.com every 1-2 seconds — classic timeout-retry behavior:
Mar 14 08:16:50 query[A] settings-win.data.microsoft.com from 10.0.0.249
Mar 14 08:16:52 query[A] settings-win.data.microsoft.com from 10.0.0.249
Mar 14 08:16:54 query[A] settings-win.data.microsoft.com from 10.0.0.249
Mar 14 08:16:55 query[A] settings-win.data.microsoft.com from 10.0.0.249
The log showed only query entries with no corresponding forwarded/reply — Pi-hole was responding immediately from gravity with 0.0.0.0, so the Xbox got a valid DNS response but then the HTTP connection to 0.0.0.0 would hang until TCP timeout.
Resolution
Created a per-client Xbox group in Pi-hole (both primary and secondary) with allowlist entries for the five domains. This scopes the whitelist to only the Xbox — other devices on the network still have these domains blocked.
Pi-hole Configuration Applied
Both Pi-holes (10.10.0.16 primary, 10.10.0.226 secondary):
- Group:
Xbox(enabled) - Client:
3C:FA:06:C7:D0:09(Xbox Series X) — member of Default + Xbox groups - Allowlist (Xbox group only):
settings-win.data.microsoft.comarc.msn.comv10.events.data.microsoft.comv20.events.data.microsoft.comactivity.windows.com
How to reproduce the fix
# On each Pi-hole (ssh pihole / ssh manticore):
docker exec pihole pihole-FTL sqlite3 -ni /etc/pihole/gravity.db "
INSERT INTO [group] (name, description, enabled) VALUES ('Xbox', 'Xbox console - relaxed blocking for gaming', 1);
INSERT INTO client (ip, comment) VALUES ('3C:FA:06:C7:D0:09', 'Xbox Series X');
INSERT INTO client_by_group (client_id, group_id) SELECT c.id, g.id FROM client c, [group] g WHERE c.ip = '3C:FA:06:C7:D0:09' AND g.name = 'Xbox';
"
# For each domain:
for domain in settings-win.data.microsoft.com arc.msn.com v10.events.data.microsoft.com v20.events.data.microsoft.com activity.windows.com; do
docker exec pihole pihole-FTL sqlite3 -ni /etc/pihole/gravity.db "
INSERT INTO domainlist (type, domain, comment, enabled) VALUES (0, '$domain', 'Xbox gaming - unblock for menu responsiveness', 1);
DELETE FROM domainlist_by_group WHERE domainlist_id = (SELECT id FROM domainlist WHERE domain = '$domain' AND type = 0) AND group_id = 0;
INSERT INTO domainlist_by_group (domainlist_id, group_id) SELECT d.id, g.id FROM domainlist d, [group] g WHERE d.domain = '$domain' AND d.type = 0 AND g.name = 'Xbox';
"
done
docker exec pihole pihole reloadlists
Diagnostic Commands
# Find blocked domains for the Xbox
ssh pihole "docker exec pihole grep '10.0.1.47' /var/log/pihole/pihole.log | grep blocked"
# Check if a domain is on a blocklist
ssh pihole "docker exec pihole pihole -q <domain>"
# List all unique domains queried by Xbox
ssh pihole "docker exec pihole grep 'query\[A\] ' /var/log/pihole/pihole.log" | grep '<XBOX_IP>' | awk '{print $6}' | sort -u
# Verify Xbox whitelist
ssh pihole "docker exec pihole pihole-FTL sqlite3 -ni -header -column /etc/pihole/gravity.db \"
SELECT d.domain, g.name FROM domainlist d
JOIN domainlist_by_group dbg ON d.id = dbg.domainlist_id
JOIN [group] g ON dbg.group_id = g.id WHERE d.type = 0 AND g.name = 'Xbox';
\""
Lessons Learned
- Xbox/console games make synchronous network calls to telemetry domains during UI operations — blocking these causes visible hangs, not silent failures
- Pi-hole blocking returns
0.0.0.0which is a valid IP — the client gets a DNS response but then TCP-connects to nothing and waits for timeout. This is worse than NXDOMAIN for latency. - Use MAC addresses for Pi-hole client entries instead of IPs — consoles frequently change IPs via DHCP
- Always check both Pi-holes — with HA DNS, the Xbox may hit either one depending on which responds first
- Look for rapid retry patterns in the logs (same domain queried every 1-3 seconds) as a signal that something is being blocked and causing timeout loops