From 2196b3c7dd7d4da660df672f7f6568fcd3d4eb93 Mon Sep 17 00:00:00 2001 From: Lucas Amorim Date: Mon, 4 Jul 2016 15:47:39 -0700 Subject: [PATCH 1/3] [BEAM-408] - Fixes ProxyInvocationHandler uses inefficient Math.random() for random int For more information: https://issues.apache.org/jira/browse/BEAM-408 --- .../build-tools/src/main/resources/beam/findbugs-filter.xml | 6 ------ .../org/apache/beam/sdk/options/ProxyInvocationHandler.java | 4 +++- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/sdks/java/build-tools/src/main/resources/beam/findbugs-filter.xml b/sdks/java/build-tools/src/main/resources/beam/findbugs-filter.xml index 3f1583563fcb..24903db15e38 100644 --- a/sdks/java/build-tools/src/main/resources/beam/findbugs-filter.xml +++ b/sdks/java/build-tools/src/main/resources/beam/findbugs-filter.xml @@ -205,12 +205,6 @@ - - - - - - diff --git a/sdks/java/core/src/main/java/org/apache/beam/sdk/options/ProxyInvocationHandler.java b/sdks/java/core/src/main/java/org/apache/beam/sdk/options/ProxyInvocationHandler.java index e3d763b2d58c..0c10c2f456b5 100644 --- a/sdks/java/core/src/main/java/org/apache/beam/sdk/options/ProxyInvocationHandler.java +++ b/sdks/java/core/src/main/java/org/apache/beam/sdk/options/ProxyInvocationHandler.java @@ -66,6 +66,7 @@ import java.util.Iterator; import java.util.List; import java.util.Map; +import java.util.Random; import java.util.Set; import java.util.SortedMap; import java.util.TreeMap; @@ -93,7 +94,8 @@ class ProxyInvocationHandler implements InvocationHandler, HasDisplayData { * No two instances of this class are considered equivalent hence we generate a random hash code * between 0 and {@link Integer#MAX_VALUE}. */ - private final int hashCode = (int) (Math.random() * Integer.MAX_VALUE); + private final int hashCode = (RANDOM.nextInt() * Integer.MAX_VALUE); + private static final Random RANDOM = new Random(); private final Set> knownInterfaces; private final ClassToInstanceMap interfaceToProxyCache; private final Map options; From aeb38d935134c156ccd4e82141798642b689e0e8 Mon Sep 17 00:00:00 2001 From: Lucas Amorim Date: Wed, 6 Jul 2016 23:01:55 -0700 Subject: [PATCH 2/3] Uses ThreadLocalRandom.current to generate a random hashCode --- .../org/apache/beam/sdk/options/ProxyInvocationHandler.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/sdks/java/core/src/main/java/org/apache/beam/sdk/options/ProxyInvocationHandler.java b/sdks/java/core/src/main/java/org/apache/beam/sdk/options/ProxyInvocationHandler.java index 0c10c2f456b5..cb69979d849b 100644 --- a/sdks/java/core/src/main/java/org/apache/beam/sdk/options/ProxyInvocationHandler.java +++ b/sdks/java/core/src/main/java/org/apache/beam/sdk/options/ProxyInvocationHandler.java @@ -66,10 +66,10 @@ import java.util.Iterator; import java.util.List; import java.util.Map; -import java.util.Random; import java.util.Set; import java.util.SortedMap; import java.util.TreeMap; +import java.util.concurrent.ThreadLocalRandom; import javax.annotation.Nullable; import javax.annotation.concurrent.ThreadSafe; @@ -94,8 +94,8 @@ class ProxyInvocationHandler implements InvocationHandler, HasDisplayData { * No two instances of this class are considered equivalent hence we generate a random hash code * between 0 and {@link Integer#MAX_VALUE}. */ - private final int hashCode = (RANDOM.nextInt() * Integer.MAX_VALUE); - private static final Random RANDOM = new Random(); + private final int hashCode = ThreadLocalRandom.current().nextInt( + Integer.MIN_VALUE, Integer.MAX_VALUE); private final Set> knownInterfaces; private final ClassToInstanceMap interfaceToProxyCache; private final Map options; From 86aa4a132c054e9c11f23bae96333825a2beb69a Mon Sep 17 00:00:00 2001 From: Lucas Amorim Date: Wed, 6 Jul 2016 23:11:55 -0700 Subject: [PATCH 3/3] Removes extra blank space --- .../org/apache/beam/sdk/options/ProxyInvocationHandler.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdks/java/core/src/main/java/org/apache/beam/sdk/options/ProxyInvocationHandler.java b/sdks/java/core/src/main/java/org/apache/beam/sdk/options/ProxyInvocationHandler.java index cb69979d849b..6bcb36b7df02 100644 --- a/sdks/java/core/src/main/java/org/apache/beam/sdk/options/ProxyInvocationHandler.java +++ b/sdks/java/core/src/main/java/org/apache/beam/sdk/options/ProxyInvocationHandler.java @@ -94,7 +94,7 @@ class ProxyInvocationHandler implements InvocationHandler, HasDisplayData { * No two instances of this class are considered equivalent hence we generate a random hash code * between 0 and {@link Integer#MAX_VALUE}. */ - private final int hashCode = ThreadLocalRandom.current().nextInt( + private final int hashCode = ThreadLocalRandom.current().nextInt( Integer.MIN_VALUE, Integer.MAX_VALUE); private final Set> knownInterfaces; private final ClassToInstanceMap interfaceToProxyCache;