Hacktoberfest 2026: los issues que los mantenedores marcaron para octubre, abiertos y aptos para principiantes. Explorar issues de Hacktoberfest

Disk-persisted data can race during SDK re-init

Abierto
#5,959 1 comentario 0 reacciones 0 asignados Ver en GitHub

Nadie ha tomado este issue todavía.

Evaluación

Dificultad
5/5
Tiempo estimado
Más de una semana
Aptitud para principiantes
35/100
Tipo de issue
Error
Claridad
Bastante claro
Estado de actividad
Tranquilo
Stack tecnológico
java, kotlin
Área
mobile, tooling

Línea de trabajo

Rastrea la reinicialización desde Sentry.init hasta Scopes.close(boolean) y, después, inspecciona PersistingScopeObserver, CacheUtils, PersistingOptionsObserver y EnvelopeCache. Concéntrate primero en el QueueFile compartido de breadcrumbs.json y en el comportamiento de apagado del executor antiguo; done debería demostrar que la reinicialización no puede solapar operaciones de disco ni perder datos persistidos de scope, options, session o envelope.

Escrito por el modelo de indexación a partir del texto del issue.

Descripción

Android Improvement Platform: Java Type: Bug

During SDK re-init (Sentry.init while already enabled), previous and new SDK lifecycles can concurrently read/write the same on-disk paths under cacheDirPath. On restart, Scopes.close(true) shuts the old executor down asynchronously rather than blocking, so old flush/session/envelope work can still touch files while the new init writes the same locations.

Impact: corrupted or lost scope/options/session state used for ANR/exit enrichment and crash recovery; possible lost breadcrumbs.

Why this races

Disk-backed surfaces that share paths across re-init

Scope cache (.scope-cache/, via PersistingScopeObserver + CacheUtils):

  • breadcrumbs.json — single QueueFile; old executor may still add/sync while new init resetCache() clears/syncs the same file
  • user.json, tags.json, extras.json, contexts.json, request.json, level.json, fingerprint.json, transaction.json, trace.json, replay.json — plain overwrite/delete of fixed names; no atomic replace
  • New init explicitly resetCache() after options observers run, which collides with any late old-lifecycle flushes

Options cache (.options-cache/, via PersistingOptionsObserver and Android PersistingOptionsCacheGenerationObserver):

  • release.json, proguard-uuid.json, sdk-version.json, environment.json, dist.json, tags.json, replay-error-sample-rate.json, app-last-update-time.json
  • Written on every init via options observers; same fixed paths, non-atomic FileOutputStream overwrite

Session / envelope cache (EnvelopeCache, Android AndroidEnvelopeCache):

  • session.json / previous_session.json — move + rewrite on session start; previous-session finalize also reads/deletes these
  • *.envelope offline cache — old client flush vs new client store/send against same dir
  • crash markers: last_crash, .sentry-native/last_crash, startup_crash (outbox)
  • Android ANR last-reported markers under cache dir

Other fixed-path / shared-dir writers (same cacheDirPath, lifecycle-overlapping on re-init):

  • App-start profiling config file rewritten on init (Sentry.handleAppStartProfilingConfig)
  • Profiling traces dir cleanup on init vs in-flight profile finalization
  • Session Replay dirs (replay_<id>/) under cache dir (ReplayCache); cleanup walks cache dir on integration start
  • ANR profile QueueFiles under cache dir (AnrProfileManager / rotation helper already documents concurrent QueueFile risk)

Highest-confidence race today

Scope persistence breadcrumbs: single shared breadcrumbs.json QueueFile, old executor still draining adds while new init clears it in resetCache(), with only executor ordering (not cross-lifecycle isolation) as the safety net.

Related

Unknowns

  • Whether this has been observed in production beyond code inspection / reasoning about re-init
  • How often customer/integration re-init hits the overlapping-executor window in practice

Raised by Markus Hintersteiner during SDK re-init / disk-persistence discussion.

Requested by markus.hintersteiner.

--

View Junior Session [Sentry]

Lenguaje dominante
Kotlin
Estrellas
1.4k
Forks
478
Merge medio
2 d 20 h
PR fusionados (30 d)
71

Guía de contribución

Abrir la guía de contribución

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de getsentry/sentry-java

Todos los issues de getsentry/sentry-java

Issues similares

Más issues de Kotlin

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.