You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Android: a cached envelope is deleted when its resend outlasts flushTimeoutMillis, so a slow or hung connection loses the crash report #6195
On Android, a cached envelope (for example, a crash stored on the previous launch) is deleted before its resend has finished, when that resend takes longer than flushTimeoutMillis. The envelope is then never sent.
EnvelopeSender.processFile captures the cached envelope and waits flushable.waitFlush(), which is flushTimeoutMillis: 4000 ms on Android, set in AndroidOptionsInitializer (see #2732). It then deletes the file unless the transport has already marked the envelope for retry (EnvelopeSender.java, around L91–98). The transport marks retry only when the send fails with an IOException. With the default connectionTimeoutMillis and readTimeoutMillis of 30 000 ms, a hung connection fails at about 30 s.
So any resend that takes more than about 4 s loses the race. The file is deleted at about 4 s, and when the IOException arrives the in-memory envelope is not stored again.
There is a related case with the same cause. A Java crash captured while an earlier send is hung on the transport's single thread is never written to disk, because the crash handler waits only flushTimeoutMillis for it to be stored.
Steps to reproduce
Use an Android app on sentry-android 8.31.0. We reproduced it with a plain @sentry/react-native 7.11.0 setup, where the native SDK is initialised once, from JS. The code path is the same on 8.58.0 / main.
Crash the app (adb shell am crash <package>), so the event is cached.
Before relaunching, make the ingest host unreachable without losing connectivity. On an emulator: adb root, then adb shell iptables -I OUTPUT -d <ingest-ip> -j DROP.
Launch and wait at least 5 s. About 4 s after init, the cached envelope disappears from cache/sentry/<hash>/.
Remove the rule and relaunch. The crash never arrives in Sentry.
With the network open, the same crash arrives. On a Pixel 6 emulator (API 35), every blocked run lost the report and every open run delivered it.
Expected result
A cached envelope whose send has not completed is kept for a later retry instead of being deleted when the flush wait expires. Alternatively, the flush wait for cached sends and the connection/read timeouts are reconciled, so a failed send is marked retryable before the file can be deleted.
Actual result
The crash report is lost.
Versions
sentry-android 8.31.0 (via @sentry/react-native 7.11.0); source checked on 8.58.0.
Activity
linear-code commentedon Sep 29, 2026
JAVA-759
markushi commentedon Oct 6, 2026
@KevinLeekley-Immerse thanks for the detailed report, we'll have a look into this shortly!