From c2dcc92b5a549b5b8bc2fb35989e5ff972ef6096 Mon Sep 17 00:00:00 2001 From: Alexander Dinauer Date: Thu, 26 Mar 2026 10:48:05 +0100 Subject: [PATCH 1/2] fix(otel): Avoid deadlock in SentryContextStorage.root() with virtual threads SentryContextStorage.root() called SentryContextWrapper.wrap() which triggers scope.clone() and acquires locks. Under virtual threads, ReentrantLock.unlock() can re-enter root() via OpenTelemetry executor instrumentation on ForkJoinPool.execute(), causing a deadlock. Return the default OTel root context without wrapping. Scopes are resolved later via attach() or Sentry.getCurrentScopes(). Fixes GH-5226 Co-Authored-By: Claude --- .../java/io/sentry/opentelemetry/SentryContextStorage.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/sentry-opentelemetry/sentry-opentelemetry-bootstrap/src/main/java/io/sentry/opentelemetry/SentryContextStorage.java b/sentry-opentelemetry/sentry-opentelemetry-bootstrap/src/main/java/io/sentry/opentelemetry/SentryContextStorage.java index 5a916a9ecab..c97e40ea62d 100644 --- a/sentry-opentelemetry/sentry-opentelemetry-bootstrap/src/main/java/io/sentry/opentelemetry/SentryContextStorage.java +++ b/sentry-opentelemetry/sentry-opentelemetry-bootstrap/src/main/java/io/sentry/opentelemetry/SentryContextStorage.java @@ -41,6 +41,9 @@ public Context current() { @Override public Context root() { - return SentryContextWrapper.wrap(ContextStorage.super.root()); + // Don't wrap() here — it triggers scope.clone() which acquires locks. Under virtual + // threads, lock.unlock() can re-enter here via OpenTelemetry executor instrumentation, causing + // a deadlock. + return ContextStorage.super.root(); } } From 70689319c766a80e10e0eef1f5ac21b2a6d093ff Mon Sep 17 00:00:00 2001 From: Alexander Dinauer Date: Thu, 26 Mar 2026 10:49:13 +0100 Subject: [PATCH 2/2] changelog --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index ff1597652b1..8ea323e0ad5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog +## Unreleased + +### Fixes + +- Fix deadlock in `SentryContextStorage.root()` with virtual threads and OpenTelemetry agent ([#5234](https://github.com/getsentry/sentry-java/pull/5234)) + ## 8.37.0 ### Fixes