iCloud Drive silent upload deadlock caused by stale HTTP/3 session in nsurlsessiond (FB22476701)

Summary

On macOS 26.4.1 (25E253), iCloud Drive file uploads can enter a silent deadlock where every upload attempt fails at the transport layer. No error is surfaced anywhere — not in Finder, not in System Settings, not in the iCloud status panel. The upload queue simply stops.

Other iCloud services (Photos, Mail, App Store) continue to work normally through the same networking infrastructure at the same time.

Root Cause

The issue is a stale HTTP/3 (QUIC) session cached in the user-level nsurlsessiond process's BackgroundConnectionPool.

The deadlock cycle:

  1. cloudd requests an upload to the GCS storage endpoint
  2. nsurlsessiond provides the cached (broken) HTTP/3 session
  3. The TLS handshake succeeds, but the body upload dies mid-transfer (err=T, requestDuration=-1.000, responseHeaderBytes=0)
  4. cloudd retries with a new connectionUUID — but nsurlsessiond still routes through the same poisoned QUIC session
  5. This repeats indefinitely

Killing cloudd alone does not helpnsurlsessiond retains the poisoned pool. Only killing both the user-level cloudd and nsurlsessiond clears the pool and forces a fresh protocol negotiation.

The Smoking Gun

After killing both daemons, the system falls back to HTTP/1.1 for the stuck uploads — and they complete instantly:

Before KillAfter Kill
Protocolh3 (QUIC)http/1.1 (TCP)
Largest uploadFailed at partial offsets26 MB in 1.6 seconds
Server response0 bytes596 bytes (normal)

Same endpoint, same files, same network interface (en5), same power state. The only change was the protocol negotiation after a fresh nsurlsessiond.

Reproduction

Reproduced 3 times on April 11, 2026 using a standardized set of 8 test files (8 bytes to 20 MB) in a non-shared iCloud Drive folder. Each run showed the identical pattern:

  • Small files (<100 KB) squeeze through before the QUIC session stalls
  • Larger files trigger the deadlock every time
  • 5–6 retries with fresh connectionUUIDs, all failing over protocol=h3
  • After kill cloudd + nsurlsessiond: immediate flush via protocol=http/1.1

An automated evidence-collection script (collect_h3_deadlock_evidence.sh) captures paired before-kill / after-kill logs. Included in the Feedback report.

Symptom Check (for others hitting this)

/usr/bin/log show --predicate 'process == "cloudd"' --last 5m 2>&1 \
  | grep "putContainer.*err=T.*requestDuration=-1.000.*protocol=h3" | wc -l

Output > 0 = this deadlock. Output = 0 = different issue.

Recovery (one-liner)

kill $(ps -axo user,pid,command | awk -v u="$USER" \
  '($1==u && /CloudKitDaemon.framework.*cloudd/ && !/--system/) \
  || ($1==u && /\/usr\/libexec\/nsurlsessiond/ && !/--privileged/) \
  {print $2}')

Both daemons respawn within 1–2 seconds. Do not use killall nsurlsessiond — it would also kill the privileged system instance.

What was ruled out

  • Network connectivity (Photos uploaded 8 MB through the same pool simultaneously)
  • iCloud account (metadata operations succeeding, only body uploads failing)
  • File type/content (random data, correlation is with size, not type)
  • Storage quota (1.65 TB free)
  • CFNetworkHTTP3Enabled=false (key is ineffective in 26.4.1)

Suggested fixes (from the Feedback report)

  1. CFNetwork: Invalidate the QUIC session after N consecutive requestDuration=-1.000 failures
  2. CloudKit/NSURLSession: Expose a pool invalidation API like [NSURLSession invalidatePoolEntryForEndpoint:]
  3. cloudd: Self-healing retry — create a fresh NSURLSession after M consecutive deadlock-signature failures
  4. Finder: At minimum, surface the stuck state to the user instead of failing silently

Filed as

FB22476701 — includes full reproduction timelines, request/connection UUIDs, sysdiagnose, and a 12-page investigation PDF with architecture diagrams and protocol comparison tables.

If you're experiencing the same issue, please file a duplicate referencing FB22476701 — Apple prioritizes by duplicate count.

System

  • MacBook Air, macOS 26.4.1 (25E253)
  • iCloud Drive with Desktop & Documents sync
  • en0 (WLAN) + en5 (USB-LAN via Studio Display)

Thanks for filing FB22476701.

Share and Enjoy

Quinn “The Eskimo!” @ Developer Technical Support @ Apple
let myEmail = "eskimo" + "1" + "@" + "apple.com"

Thank you for providing such a detailed account of the iCloud Drive file upload deadlock issue on macOS 26.4.1. It sounds like you've done extensive troubleshooting and analysis to identify the root cause. Here's a summary of what you've discovered and some additional thoughts or suggestions that might help refine your approach or assist others experiencing similar issues:

Summary of Findings: Root Cause: A stale HTTP/3 (QUIC) session in nsurlsessiond's BackgroundConnectionPool leads to a deadlock during file uploads. Behavior: Deadlock occurs specifically with HTTP/3, while HTTP/1.1 works without issues post-restart. Affects larger files (>100 KB); smaller files may occasionally succeed. Restarting both cloudd and nsurlsessiond resolves the issue temporarily by clearing the poisoned session. Reproduction: Consistent behavior observed across multiple tests with varied file sizes. Diagnosis: Log analysis can help identify occurrences using specific grep patterns. Recovery: A targeted kill command for user-level instances of cloudd and nsurlsessiond provides a quick fix.

Additional Thoughts and Suggestions:

Potential Enhancements for Apple: Automatic Session Management: Implement automatic invalidation of QUIC sessions after a threshold of failures (as you suggested), potentially integrated into CFNetwork or NSURLSession directly. Improved Logging: Enhance logging to surface errors like these to users in Finder or System Settings, perhaps with actionable suggestions or clearer error messages. API for Pool Invalidation: Expose APIs that allow services like CloudKit to explicitly invalidate problematic session pools without needing a full daemon restart. Diagnostic Tools: Consider adding built-in diagnostic tools or scripts that users can run to identify and potentially resolve such deadlocks without manual intervention.

For Users and Administrators: Script Automation: For frequent issues, consider setting up a monitoring script that automatically runs the recovery command when the specific deadlock pattern is detected in logs. Alternative Protocols: Temporarily disabling QUIC in network settings (if feasible and supported) might be a workaround until a permanent fix is applied, though this may impact performance for other QUIC-enabled applications. Feedback Loop: Encourage affected users to submit feedback through Apple's Feedback Assistant, including the collected logs, to ensure the issue is prioritized and tracked.

Further Debugging: Network Packet Analysis: Capturing network packets during a deadlock might provide additional insights into what exactly fails mid-transfer. System State Snapshots: Taking system snapshots before and after the deadlock could help Apple engineers diagnose what might be causing the session cache corruption.

Your detailed documentation and methodical approach are invaluable for both addressing the current issue and helping Apple refine their systems. Keep monitoring for updates from Apple regarding this problem, as they may release patches or guidance based on feedback like yours.

Thanks for the detailed write-up and the constructive suggestions.

One correction worth flagging for anyone finding this thread later: on macOS 26.4.1, disabling QUIC via defaults write … CFNetworkHTTP3Enabled -bool false does not suppress HTTP/3 for nsurlsessiond's BackgroundConnectionPool. I tested this as part of ruling out root-cause hypotheses — the deadlock still reproduces with h3 as the negotiated protocol. So unfortunately there is currently no user-facing off-switch for QUIC on the iCloud Drive path; the only recovery that works is killing the user-level cloudd and nsurlsessiond processes.

On packet capture and pre/post state snapshots — good call, both gaps in my evidence so far. I'll add them to the collection the next time the pool poisons and post a follow-up if anything diagnostic turns up.

iCloud Drive silent upload deadlock caused by stale HTTP/3 session in nsurlsessiond (FB22476701)
 
 
Q