From 00c25e9b1194e1792da848852d214639d9de59b7 Mon Sep 17 00:00:00 2001 From: cpovirk Date: Mon, 8 Mar 2021 17:58:45 -0800 Subject: [PATCH] Move Java-7-VM warning from `MoreObjects` to `Preconditions`. RELNOTES=Increased the aggressiveness of [Guava 30.1](https://github.com/google/guava/releases/tag/v30.1)'s warning log message for running `guava-android` under a Java 7 VM. (Android VMs are unaffected.) If the warning _itself_ causes you trouble, you can eliminate it by silencing the logger for `com.google.common.base.Preconditions` (which is used _only_ for this warning). This warning prepares for [removing support for Java 7 in 2021](https://github.com/google/guava/issues/5269). Please report any problems. We have tried to make the warning as safe as possible, but anytime a common library logs, especially as aggressively as we do in this new release, there is the potential for [`NullPointerException`](https://stackoverflow.com/a/41017717/28465) or even [deadlock](https://stackoverflow.com/a/48009613/28465). (To be clear, Guava will not log under Java 8 or Android, but it will under Java 7.) PiperOrigin-RevId: 361700569 --- .../com/google/common/base/MoreObjects.java | 36 ------------------- .../com/google/common/base/Preconditions.java | 19 ++++++++++ .../com/google/common/base/MoreObjects.java | 36 ------------------- .../com/google/common/base/Preconditions.java | 19 ++++++++++ 4 files changed, 38 insertions(+), 72 deletions(-) diff --git a/android/guava/src/com/google/common/base/MoreObjects.java b/android/guava/src/com/google/common/base/MoreObjects.java index a8ee412c67e0..a56b2a69def0 100644 --- a/android/guava/src/com/google/common/base/MoreObjects.java +++ b/android/guava/src/com/google/common/base/MoreObjects.java @@ -15,13 +15,10 @@ package com.google.common.base; import static com.google.common.base.Preconditions.checkNotNull; -import static java.util.logging.Level.WARNING; import com.google.common.annotations.GwtCompatible; import com.google.errorprone.annotations.CanIgnoreReturnValue; -import com.google.errorprone.annotations.concurrent.GuardedBy; import java.util.Arrays; -import java.util.logging.Logger; import org.checkerframework.checker.nullness.compatqual.NullableDecl; /** @@ -144,38 +141,6 @@ public static ToStringHelper toStringHelper(String className) { * @since 18.0 (since 2.0 as {@code Objects.ToStringHelper}). */ public static final class ToStringHelper { - @GuardedBy("ToStringHelper.class") - private static boolean performedJava8CompatibilityCheck; - - private static void java8CompatibilityCheck() { - @SuppressWarnings("GuardedBy") - boolean racyReadForDoubleCheckedLock = performedJava8CompatibilityCheck; - if (racyReadForDoubleCheckedLock) { - return; - } - synchronized (ToStringHelper.class) { - if (performedJava8CompatibilityCheck) { - return; - } - performedJava8CompatibilityCheck = true; - } - - try { - Java8Usage.performCheck(); - } catch (Throwable underlying) { - Exception toLog = - new Exception( - "Guava will drop support for Java 7 in 2021. Please let us know if this will cause" - + " you problems: https://github.com/google/guava/issues/5269", - underlying); - Logger.getLogger(ToStringHelper.class.getName()) - .log( - WARNING, - "Java 7 compatibility warning: See https://github.com/google/guava/issues/5269", - toLog); - } - } - private final String className; private final ValueHolder holderHead = new ValueHolder(); private ValueHolder holderTail = holderHead; @@ -183,7 +148,6 @@ private static void java8CompatibilityCheck() { /** Use {@link MoreObjects#toStringHelper(Object)} to create an instance. */ private ToStringHelper(String className) { - java8CompatibilityCheck(); this.className = checkNotNull(className); } diff --git a/android/guava/src/com/google/common/base/Preconditions.java b/android/guava/src/com/google/common/base/Preconditions.java index 995d3945e59b..38f665463f7a 100644 --- a/android/guava/src/com/google/common/base/Preconditions.java +++ b/android/guava/src/com/google/common/base/Preconditions.java @@ -15,9 +15,11 @@ package com.google.common.base; import static com.google.common.base.Strings.lenientFormat; +import static java.util.logging.Level.WARNING; import com.google.common.annotations.GwtCompatible; import com.google.errorprone.annotations.CanIgnoreReturnValue; +import java.util.logging.Logger; import org.checkerframework.checker.nullness.compatqual.NonNullDecl; import org.checkerframework.checker.nullness.compatqual.NullableDecl; @@ -1488,4 +1490,21 @@ private static String badPositionIndexes(int start, int end, int size) { // end < start return lenientFormat("end index (%s) must not be less than start index (%s)", end, start); } + + static { + try { + Java8Usage.performCheck(); + } catch (Throwable underlying) { + Exception toLog = + new Exception( + "Guava will drop support for Java 7 in 2021. Please let us know if this will cause" + + " you problems: https://github.com/google/guava/issues/5269", + underlying); + Logger.getLogger(Preconditions.class.getName()) + .log( + WARNING, + "Java 7 compatibility warning: See https://github.com/google/guava/issues/5269", + toLog); + } + } } diff --git a/guava/src/com/google/common/base/MoreObjects.java b/guava/src/com/google/common/base/MoreObjects.java index a182829660f2..cf901b5954e0 100644 --- a/guava/src/com/google/common/base/MoreObjects.java +++ b/guava/src/com/google/common/base/MoreObjects.java @@ -15,13 +15,10 @@ package com.google.common.base; import static com.google.common.base.Preconditions.checkNotNull; -import static java.util.logging.Level.WARNING; import com.google.common.annotations.GwtCompatible; import com.google.errorprone.annotations.CanIgnoreReturnValue; -import com.google.errorprone.annotations.concurrent.GuardedBy; import java.util.Arrays; -import java.util.logging.Logger; import org.checkerframework.checker.nullness.qual.Nullable; /** @@ -144,38 +141,6 @@ public static ToStringHelper toStringHelper(String className) { * @since 18.0 (since 2.0 as {@code Objects.ToStringHelper}). */ public static final class ToStringHelper { - @GuardedBy("ToStringHelper.class") - private static boolean performedJava8CompatibilityCheck; - - private static void java8CompatibilityCheck() { - @SuppressWarnings("GuardedBy") - boolean racyReadForDoubleCheckedLock = performedJava8CompatibilityCheck; - if (racyReadForDoubleCheckedLock) { - return; - } - synchronized (ToStringHelper.class) { - if (performedJava8CompatibilityCheck) { - return; - } - performedJava8CompatibilityCheck = true; - } - - try { - Java8Usage.performCheck(); - } catch (Throwable underlying) { - Exception toLog = - new Exception( - "Guava will drop support for Java 7 in 2021. Please let us know if this will cause" - + " you problems: https://github.com/google/guava/issues/5269", - underlying); - Logger.getLogger(ToStringHelper.class.getName()) - .log( - WARNING, - "Java 7 compatibility warning: See https://github.com/google/guava/issues/5269", - toLog); - } - } - private final String className; private final ValueHolder holderHead = new ValueHolder(); private ValueHolder holderTail = holderHead; @@ -183,7 +148,6 @@ private static void java8CompatibilityCheck() { /** Use {@link MoreObjects#toStringHelper(Object)} to create an instance. */ private ToStringHelper(String className) { - java8CompatibilityCheck(); this.className = checkNotNull(className); } diff --git a/guava/src/com/google/common/base/Preconditions.java b/guava/src/com/google/common/base/Preconditions.java index 30cc374d21d2..3dd679ddeacf 100644 --- a/guava/src/com/google/common/base/Preconditions.java +++ b/guava/src/com/google/common/base/Preconditions.java @@ -15,9 +15,11 @@ package com.google.common.base; import static com.google.common.base.Strings.lenientFormat; +import static java.util.logging.Level.WARNING; import com.google.common.annotations.GwtCompatible; import com.google.errorprone.annotations.CanIgnoreReturnValue; +import java.util.logging.Logger; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; @@ -1431,4 +1433,21 @@ private static String badPositionIndexes(int start, int end, int size) { // end < start return lenientFormat("end index (%s) must not be less than start index (%s)", end, start); } + + static { + try { + Java8Usage.performCheck(); + } catch (Throwable underlying) { + Exception toLog = + new Exception( + "Guava will drop support for Java 7 in 2021. Please let us know if this will cause" + + " you problems: https://github.com/google/guava/issues/5269", + underlying); + Logger.getLogger(Preconditions.class.getName()) + .log( + WARNING, + "Java 7 compatibility warning: See https://github.com/google/guava/issues/5269", + toLog); + } + } }