From bd0c3b401a6b4b64647831328eb3f9d6893ff845 Mon Sep 17 00:00:00 2001 From: Alexander Dinauer Date: Tue, 18 Mar 2025 11:08:37 +0100 Subject: [PATCH 1/3] Check for mixed SDK versions --- .../src/main/java/io/sentry/SentryClient.java | 3 ++ .../SentryIntegrationPackageStorage.java | 33 +++++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/sentry/src/main/java/io/sentry/SentryClient.java b/sentry/src/main/java/io/sentry/SentryClient.java index 277be87aeef..cbd9ca9fc63 100644 --- a/sentry/src/main/java/io/sentry/SentryClient.java +++ b/sentry/src/main/java/io/sentry/SentryClient.java @@ -767,6 +767,9 @@ public void captureSession(final @NotNull Session session, final @Nullable Hint .log(SentryLevel.ERROR, "The BeforeEnvelope callback threw an exception.", e); } } + + SentryIntegrationPackageStorage.getInstance().checkForMixedVersions(options.getLogger()); + if (hint == null) { transport.send(envelope); } else { diff --git a/sentry/src/main/java/io/sentry/SentryIntegrationPackageStorage.java b/sentry/src/main/java/io/sentry/SentryIntegrationPackageStorage.java index 16534291448..d52ffc6c77b 100644 --- a/sentry/src/main/java/io/sentry/SentryIntegrationPackageStorage.java +++ b/sentry/src/main/java/io/sentry/SentryIntegrationPackageStorage.java @@ -5,6 +5,7 @@ import io.sentry.util.Objects; import java.util.Set; import java.util.concurrent.CopyOnWriteArraySet; + import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -15,6 +16,8 @@ public final class SentryIntegrationPackageStorage { private static volatile @Nullable SentryIntegrationPackageStorage INSTANCE; private static final @NotNull AutoClosableReentrantLock staticLock = new AutoClosableReentrantLock(); + private static volatile @Nullable Boolean mixedVersionsDetected = null; + private static final @NotNull AutoClosableReentrantLock mixedVersionsLock = new AutoClosableReentrantLock(); public static @NotNull SentryIntegrationPackageStorage getInstance() { if (INSTANCE == null) { @@ -64,12 +67,42 @@ public void addPackage(final @NotNull String name, final @NotNull String version SentryPackage newPackage = new SentryPackage(name, version); packages.add(newPackage); + try (final @NotNull ISentryLifecycleToken ignored = mixedVersionsLock.acquire()) { + mixedVersionsDetected = null; + } } public @NotNull Set getPackages() { return packages; } + public boolean checkForMixedVersions(final @NotNull ILogger logger) { + final @Nullable Boolean mixedVersionsDetectedBefore = mixedVersionsDetected; + if (mixedVersionsDetectedBefore != null) { + return mixedVersionsDetectedBefore; + } + try (final @NotNull ISentryLifecycleToken ignored = mixedVersionsLock.acquire()) { + final @NotNull String sdkVersion = BuildConfig.VERSION_NAME; + boolean mixedVersionsDetectedThisCheck = false; + + for (SentryPackage pkg : packages) { + if (pkg.getName().startsWith("maven:io.sentry:") && !sdkVersion.equalsIgnoreCase(pkg.getVersion())) { + logger.log(SentryLevel.ERROR, "The Sentry SDK has been configured with mixed versions. Expected %s to match core SDK version %s but was %s", pkg.getName(), sdkVersion, pkg.getVersion()); + mixedVersionsDetectedThisCheck = true; + } + } + + if (mixedVersionsDetectedThisCheck) { + logger.log(SentryLevel.ERROR, "^^^^^^^^^^^^^^^^^^^^^^^^^^^^"); + logger.log(SentryLevel.ERROR, "^^^^^^^^^^^^^^^^^^^^^^^^^^^^"); + logger.log(SentryLevel.ERROR, "^^^^^^^^^^^^^^^^^^^^^^^^^^^^"); + logger.log(SentryLevel.ERROR, "^^^^^^^^^^^^^^^^^^^^^^^^^^^^"); + } + mixedVersionsDetected = mixedVersionsDetectedThisCheck; + return mixedVersionsDetectedThisCheck; + } + } + @TestOnly public void clearStorage() { integrations.clear(); From f50173bf30c8a78dae542aa50c530fa2d93264bc Mon Sep 17 00:00:00 2001 From: Sentry Github Bot Date: Thu, 20 Mar 2025 05:55:19 +0000 Subject: [PATCH 2/3] Format code --- .../io/sentry/SentryIntegrationPackageStorage.java | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/sentry/src/main/java/io/sentry/SentryIntegrationPackageStorage.java b/sentry/src/main/java/io/sentry/SentryIntegrationPackageStorage.java index d52ffc6c77b..1ceba1dba3a 100644 --- a/sentry/src/main/java/io/sentry/SentryIntegrationPackageStorage.java +++ b/sentry/src/main/java/io/sentry/SentryIntegrationPackageStorage.java @@ -5,7 +5,6 @@ import io.sentry.util.Objects; import java.util.Set; import java.util.concurrent.CopyOnWriteArraySet; - import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -17,7 +16,8 @@ public final class SentryIntegrationPackageStorage { private static final @NotNull AutoClosableReentrantLock staticLock = new AutoClosableReentrantLock(); private static volatile @Nullable Boolean mixedVersionsDetected = null; - private static final @NotNull AutoClosableReentrantLock mixedVersionsLock = new AutoClosableReentrantLock(); + private static final @NotNull AutoClosableReentrantLock mixedVersionsLock = + new AutoClosableReentrantLock(); public static @NotNull SentryIntegrationPackageStorage getInstance() { if (INSTANCE == null) { @@ -86,8 +86,14 @@ public boolean checkForMixedVersions(final @NotNull ILogger logger) { boolean mixedVersionsDetectedThisCheck = false; for (SentryPackage pkg : packages) { - if (pkg.getName().startsWith("maven:io.sentry:") && !sdkVersion.equalsIgnoreCase(pkg.getVersion())) { - logger.log(SentryLevel.ERROR, "The Sentry SDK has been configured with mixed versions. Expected %s to match core SDK version %s but was %s", pkg.getName(), sdkVersion, pkg.getVersion()); + if (pkg.getName().startsWith("maven:io.sentry:") + && !sdkVersion.equalsIgnoreCase(pkg.getVersion())) { + logger.log( + SentryLevel.ERROR, + "The Sentry SDK has been configured with mixed versions. Expected %s to match core SDK version %s but was %s", + pkg.getName(), + sdkVersion, + pkg.getVersion()); mixedVersionsDetectedThisCheck = true; } } From a8875cf6dc410923fa81db6302ec80f0179d498c Mon Sep 17 00:00:00 2001 From: Alexander Dinauer Date: Thu, 20 Mar 2025 08:55:45 +0100 Subject: [PATCH 3/3] format + api --- sentry/api/sentry.api | 1 + 1 file changed, 1 insertion(+) diff --git a/sentry/api/sentry.api b/sentry/api/sentry.api index 96fc98eebd7..9637e4e7bc3 100644 --- a/sentry/api/sentry.api +++ b/sentry/api/sentry.api @@ -2706,6 +2706,7 @@ public final class io/sentry/SentryInstantDateProvider : io/sentry/SentryDatePro public final class io/sentry/SentryIntegrationPackageStorage { public fun addIntegration (Ljava/lang/String;)V public fun addPackage (Ljava/lang/String;Ljava/lang/String;)V + public fun checkForMixedVersions (Lio/sentry/ILogger;)Z public fun clearStorage ()V public static fun getInstance ()Lio/sentry/SentryIntegrationPackageStorage; public fun getIntegrations ()Ljava/util/Set;