This is an automated email from the ASF dual-hosted git repository.

jonwei pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-druid.git


The following commit(s) were added to refs/heads/master by this push:
     new 0c4bd2b  Prohibit some Random usage patterns (#6226)
0c4bd2b is described below

commit 0c4bd2b57b19bcbd9a275fad412960aa0a39ca5f
Author: Roman Leventov <leventov...@gmail.com>
AuthorDate: Fri Sep 14 23:35:51 2018 +0300

    Prohibit some Random usage patterns (#6226)
    
    * Prohibit Random usage patterns
    
    * Fix FlattenJSONBenchmarkUtil
---
 .idea/inspectionProfiles/Druid.xml                 | 18 ++++++++++++++++
 .../benchmark/BasicAuthUserMapSerdeBenchmark.java  | 12 +++--------
 .../benchmark/CompressedColumnarIntsBenchmark.java |  3 ++-
 .../CompressedVSizeColumnarMultiIntsBenchmark.java |  3 ++-
 .../druid/benchmark/FlattenJSONBenchmarkUtil.java  |  6 +++---
 .../druid/benchmark/FloatCompressionBenchmark.java |  6 ++----
 .../IncrementalIndexRowTypeBenchmark.java          |  7 +++---
 .../druid/benchmark/LongCompressionBenchmark.java  |  6 ++----
 .../druid/benchmark/MergeSequenceBenchmark.java    |  3 ++-
 .../CachingCostBalancerStrategyBenchmark.java      |  3 +--
 .../coordinator/CostBalancerStrategyBenchmark.java |  3 ++-
 codestyle/druid-forbidden-apis.txt                 |  2 +-
 .../org/apache/druid/common/utils/SocketUtil.java  |  6 ++----
 .../druid/common/utils/IntArrayUtilsTest.java      |  3 ++-
 .../examples/rabbitmq/RabbitMQProducerMain.java    |  3 ++-
 .../datasketches/quantiles/GenerateTestData.java   | 12 +++++------
 .../datasketches/tuple/GenerateTestData.java       | 16 +++++++-------
 .../security/kerberos/KerberosAuthenticator.java   |  4 ++--
 .../druid/indexing/kafka/KafkaIndexTask.java       | 13 ++++-------
 .../indexing/kafka/supervisor/KafkaSupervisor.java | 18 ++++------------
 .../druid/indexing/kafka/test/TestBroker.java      |  7 +++---
 .../variance/VarianceAggregatorCollectorTest.java  |  3 ++-
 .../aggregation/variance/VarianceSerdeTest.java    |  3 ++-
 .../apache/druid/hll/HyperLogLogCollectorTest.java |  3 ++-
 .../common/actions/RemoteTaskActionClient.java     |  7 +++---
 .../task/AppenderatorDriverRealtimeIndexTask.java  |  8 +------
 .../indexing/common/task/RealtimeIndexTask.java    | 25 +++++++++++++++-------
 .../overlord/helpers/TaskLogAutoCleanerConfig.java |  8 +++++--
 .../common/task/RealtimeIndexTaskTest.java         |  2 +-
 .../SequenceInputStreamResponseHandlerTest.java    |  8 +++----
 .../collections/spatial/ImmutableRTreeTest.java    | 25 +++++++++++-----------
 .../druid/collections/spatial/RTreeTest.java       |  5 +++--
 .../split/LinearGutmanSplitStrategyTest.java       |  5 +++--
 .../org/apache/druid/segment/IndexBuilder.java     |  8 +++----
 .../segment/IndexMergerV9WithSpatialIndexTest.java |  5 +++--
 .../segment/data/BenchmarkIndexibleWrites.java     |  3 ++-
 .../segment/filter/SpatialFilterBonusTest.java     |  5 +++--
 .../druid/segment/filter/SpatialFilterTest.java    |  5 +++--
 .../incremental/OnheapIncrementalIndexTest.java    |  3 ++-
 .../druid/server/coordinator/BalancerStrategy.java |  3 +++
 .../server/coordinator/CostBalancerStrategy.java   |  3 +--
 .../server/coordinator/RandomBalancerStrategy.java | 17 ++++++++-------
 .../coordinator/ReservoirSegmentSampler.java       | 13 ++++++-----
 .../coordinator/ReservoirSegmentSamplerTest.java   |  3 +--
 .../druid/server/initialization/BaseJettyTest.java |  6 ++----
 .../druid/sql/avatica/DruidAvaticaHandlerTest.java |  6 +++---
 46 files changed, 176 insertions(+), 160 deletions(-)

diff --git a/.idea/inspectionProfiles/Druid.xml 
b/.idea/inspectionProfiles/Druid.xml
index c735b26..38d6033 100644
--- a/.idea/inspectionProfiles/Druid.xml
+++ b/.idea/inspectionProfiles/Druid.xml
@@ -13,6 +13,9 @@
     <inspection_tool class="AssertWithSideEffects" enabled="true" 
level="ERROR" enabled_by_default="true" />
     <inspection_tool class="CastConflictsWithInstanceof" enabled="true" 
level="ERROR" enabled_by_default="true" />
     <inspection_tool class="CastToIncompatibleInterface" enabled="true" 
level="ERROR" enabled_by_default="true" />
+    <inspection_tool class="CatchMayIgnoreException" enabled="true" 
level="WARNING" enabled_by_default="true">
+      <option name="m_ignoreCatchBlocksWithComments" value="false" />
+    </inspection_tool>
     <inspection_tool class="CheckValidXmlInScriptTagBody" enabled="true" 
level="WARNING" enabled_by_default="true" />
     <inspection_tool class="ClassNewInstance" enabled="true" level="WARNING" 
enabled_by_default="true" />
     <inspection_tool class="CollectionAddedToSelf" enabled="true" 
level="ERROR" enabled_by_default="true" />
@@ -116,6 +119,21 @@
         <constraint name="x" 
nameOfExprType="java\.lang\.Iterable|java\.util\.Iterator|Object\[\]" 
expressionTypes="java.lang.Iterable|java.util.Iterator|Object[]" 
exprTypeWithinHierarchy="true" negateName="true" negateExprType="true" 
within="" contains="" />
         <constraint name="__context__" target="true" within="" contains="" />
       </searchConfiguration>
+      <searchConfiguration name="Math.abs(rnd.nextInt()) doensn't guarantee 
positive result. Use nextInt() &amp; Integer.MAX_VALUE or 
nextInt(Integer.MAX_VALUE)" created="1535067616084" 
text="$Math$.abs($x$.nextInt())" recursive="false" caseInsensitive="true" 
type="JAVA">
+        <constraint name="__context__" target="true" within="" contains="" />
+        <constraint name="x" nameOfFormalType="java\.util\.Random" 
exceptedTypes="java.util.Random" exprTypeWithinHierarchy="true" 
formalTypeWithinHierarchy="true" within="" contains="" />
+        <constraint name="Math" within="" contains="" />
+      </searchConfiguration>
+      <searchConfiguration name="Math.abs(rnd.nextLong()) doesn't guarantee 
positive result. Use nextLong() &amp; Long.MAX_VALUE" created="1535067616084" 
text="$Math$.abs($x$.nextLong())" recursive="false" caseInsensitive="true" 
type="JAVA">
+        <constraint name="__context__" target="true" within="" contains="" />
+        <constraint name="x" nameOfFormalType="java\.util\.Random" 
exceptedTypes="java.util.Random" exprTypeWithinHierarchy="true" 
formalTypeWithinHierarchy="true" within="" contains="" />
+        <constraint name="Math" within="" contains="" />
+      </searchConfiguration>
+      <searchConfiguration name="Use nextInt(bound) instead" 
created="1535068047572" text="$x$.nextInt() % $a$" recursive="false" 
caseInsensitive="true" type="JAVA">
+        <constraint name="__context__" target="true" within="" contains="" />
+        <constraint name="x" nameOfFormalType="java\.util\.Random" 
exceptedTypes="java.util.Random" exprTypeWithinHierarchy="true" 
formalTypeWithinHierarchy="true" within="" contains="" />
+        <constraint name="a" within="" contains="" />
+      </searchConfiguration>
     </inspection_tool>
     <inspection_tool class="SpellCheckingInspection" enabled="false" 
level="TYPO" enabled_by_default="false">
       <option name="processCode" value="true" />
diff --git 
a/benchmarks/src/main/java/org/apache/druid/benchmark/BasicAuthUserMapSerdeBenchmark.java
 
b/benchmarks/src/main/java/org/apache/druid/benchmark/BasicAuthUserMapSerdeBenchmark.java
index eef9029..0c2878d 100644
--- 
a/benchmarks/src/main/java/org/apache/druid/benchmark/BasicAuthUserMapSerdeBenchmark.java
+++ 
b/benchmarks/src/main/java/org/apache/druid/benchmark/BasicAuthUserMapSerdeBenchmark.java
@@ -43,6 +43,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.Random;
 import java.util.UUID;
+import java.util.concurrent.ThreadLocalRandom;
 import java.util.concurrent.TimeUnit;
 
 @State(Scope.Benchmark)
@@ -102,17 +103,10 @@ public class BasicAuthUserMapSerdeBenchmark
     byte[] salt = new byte[32];
     byte[] hash = new byte[64];
 
-    Random random = new Random();
+    Random random = ThreadLocalRandom.current();
     random.nextBytes(salt);
     random.nextBytes(hash);
-    return new BenchmarkUser(
-        UUID.randomUUID().toString(),
-        new BenchmarkCredentials(
-            salt,
-            hash,
-            10000
-        )
-    );
+    return new BenchmarkUser(UUID.randomUUID().toString(), new 
BenchmarkCredentials(salt, hash, 10000));
   }
 
   private static class BenchmarkUser
diff --git 
a/benchmarks/src/main/java/org/apache/druid/benchmark/CompressedColumnarIntsBenchmark.java
 
b/benchmarks/src/main/java/org/apache/druid/benchmark/CompressedColumnarIntsBenchmark.java
index d4b9276..a9f3b72 100644
--- 
a/benchmarks/src/main/java/org/apache/druid/benchmark/CompressedColumnarIntsBenchmark.java
+++ 
b/benchmarks/src/main/java/org/apache/druid/benchmark/CompressedColumnarIntsBenchmark.java
@@ -43,6 +43,7 @@ import java.nio.ByteOrder;
 import java.nio.channels.WritableByteChannel;
 import java.util.BitSet;
 import java.util.Random;
+import java.util.concurrent.ThreadLocalRandom;
 import java.util.concurrent.TimeUnit;
 
 @State(Scope.Benchmark)
@@ -63,7 +64,7 @@ public class CompressedColumnarIntsBenchmark
   @Setup
   public void setup() throws IOException
   {
-    Random rand = new Random(0);
+    Random rand = ThreadLocalRandom.current();
     int[] vals = new int[0x100000];
     final int bound = 1 << bytes;
     for (int i = 0; i < vals.length; ++i) {
diff --git 
a/benchmarks/src/main/java/org/apache/druid/benchmark/CompressedVSizeColumnarMultiIntsBenchmark.java
 
b/benchmarks/src/main/java/org/apache/druid/benchmark/CompressedVSizeColumnarMultiIntsBenchmark.java
index 4f29bb9..fe2e42d 100644
--- 
a/benchmarks/src/main/java/org/apache/druid/benchmark/CompressedVSizeColumnarMultiIntsBenchmark.java
+++ 
b/benchmarks/src/main/java/org/apache/druid/benchmark/CompressedVSizeColumnarMultiIntsBenchmark.java
@@ -48,6 +48,7 @@ import java.nio.channels.WritableByteChannel;
 import java.util.BitSet;
 import java.util.List;
 import java.util.Random;
+import java.util.concurrent.ThreadLocalRandom;
 import java.util.concurrent.TimeUnit;
 
 @State(Scope.Benchmark)
@@ -71,7 +72,7 @@ public class CompressedVSizeColumnarMultiIntsBenchmark
   @Setup
   public void setup() throws IOException
   {
-    Random rand = new Random(0);
+    Random rand = ThreadLocalRandom.current();
     List<int[]> rows = Lists.newArrayList();
     final int bound = 1 << bytes;
     for (int i = 0; i < 0x100000; i++) {
diff --git 
a/benchmarks/src/main/java/org/apache/druid/benchmark/FlattenJSONBenchmarkUtil.java
 
b/benchmarks/src/main/java/org/apache/druid/benchmark/FlattenJSONBenchmarkUtil.java
index 040e9c5..6c0ec31 100644
--- 
a/benchmarks/src/main/java/org/apache/druid/benchmark/FlattenJSONBenchmarkUtil.java
+++ 
b/benchmarks/src/main/java/org/apache/druid/benchmark/FlattenJSONBenchmarkUtil.java
@@ -40,13 +40,13 @@ import java.util.Random;
 
 public class FlattenJSONBenchmarkUtil
 {
-  private Random rng;
-  private final ObjectMapper mapper = new DefaultObjectMapper();
   private static final String DEFAULT_TIMESTAMP = "2015-09-12T12:10:53.155Z";
 
+  private final Random rng = new Random(9999);
+  private final ObjectMapper mapper = new DefaultObjectMapper();
+
   public FlattenJSONBenchmarkUtil()
   {
-    this.rng = new Random(9999);
     mapper.setVisibility(PropertyAccessor.FIELD, 
JsonAutoDetect.Visibility.PUBLIC_ONLY);
     mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
   }
diff --git 
a/benchmarks/src/main/java/org/apache/druid/benchmark/FloatCompressionBenchmark.java
 
b/benchmarks/src/main/java/org/apache/druid/benchmark/FloatCompressionBenchmark.java
index 7349bf4..602cf30 100644
--- 
a/benchmarks/src/main/java/org/apache/druid/benchmark/FloatCompressionBenchmark.java
+++ 
b/benchmarks/src/main/java/org/apache/druid/benchmark/FloatCompressionBenchmark.java
@@ -39,7 +39,7 @@ import org.openjdk.jmh.infra.Blackhole;
 import java.io.File;
 import java.nio.ByteBuffer;
 import java.nio.ByteOrder;
-import java.util.Random;
+import java.util.concurrent.ThreadLocalRandom;
 import java.util.concurrent.TimeUnit;
 
 /**
@@ -62,7 +62,6 @@ public class FloatCompressionBenchmark
   @Param({"lz4", "none"})
   private static String strategy;
 
-  private Random rand;
   private Supplier<ColumnarFloats> supplier;
 
   @Setup
@@ -70,7 +69,6 @@ public class FloatCompressionBenchmark
   {
     File dir = new File(dirPath);
     File compFile = new File(dir, file + "-" + strategy);
-    rand = new Random();
     ByteBuffer buffer = Files.map(compFile);
     supplier = CompressedColumnarFloatsSupplier.fromByteBuffer(buffer, 
ByteOrder.nativeOrder());
   }
@@ -91,7 +89,7 @@ public class FloatCompressionBenchmark
   {
     ColumnarFloats columnarFloats = supplier.get();
     int count = columnarFloats.size();
-    for (int i = 0; i < count; i += rand.nextInt(2000)) {
+    for (int i = 0; i < count; i += ThreadLocalRandom.current().nextInt(2000)) 
{
       bh.consume(columnarFloats.get(i));
     }
     columnarFloats.close();
diff --git 
a/benchmarks/src/main/java/org/apache/druid/benchmark/IncrementalIndexRowTypeBenchmark.java
 
b/benchmarks/src/main/java/org/apache/druid/benchmark/IncrementalIndexRowTypeBenchmark.java
index 79c2615..e691ea2 100644
--- 
a/benchmarks/src/main/java/org/apache/druid/benchmark/IncrementalIndexRowTypeBenchmark.java
+++ 
b/benchmarks/src/main/java/org/apache/druid/benchmark/IncrementalIndexRowTypeBenchmark.java
@@ -42,6 +42,7 @@ import org.openjdk.jmh.infra.Blackhole;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Random;
+import java.util.concurrent.ThreadLocalRandom;
 import java.util.concurrent.TimeUnit;
 
 @State(Scope.Benchmark)
@@ -52,7 +53,6 @@ public class IncrementalIndexRowTypeBenchmark
   private IncrementalIndex incStrIndex;
   private static AggregatorFactory[] aggs;
   static final int dimensionCount = 8;
-  private Random rng;
   static final int maxRows = 250000;
 
   private ArrayList<InputRow> longRows = new ArrayList<InputRow>();
@@ -82,6 +82,7 @@ public class IncrementalIndexRowTypeBenchmark
 
   private MapBasedInputRow getLongRow(long timestamp, int dimensionCount)
   {
+    Random rng = ThreadLocalRandom.current();
     List<String> dimensionList = new ArrayList<String>(dimensionCount);
     ImmutableMap.Builder<String, Object> builder = ImmutableMap.builder();
     for (int i = 0; i < dimensionCount; i++) {
@@ -94,6 +95,7 @@ public class IncrementalIndexRowTypeBenchmark
 
   private MapBasedInputRow getFloatRow(long timestamp, int dimensionCount)
   {
+    Random rng = ThreadLocalRandom.current();
     List<String> dimensionList = new ArrayList<String>(dimensionCount);
     ImmutableMap.Builder<String, Object> builder = ImmutableMap.builder();
     for (int i = 0; i < dimensionCount; i++) {
@@ -106,6 +108,7 @@ public class IncrementalIndexRowTypeBenchmark
 
   private MapBasedInputRow getStringRow(long timestamp, int dimensionCount)
   {
+    Random rng = ThreadLocalRandom.current();
     List<String> dimensionList = new ArrayList<String>(dimensionCount);
     ImmutableMap.Builder<String, Object> builder = ImmutableMap.builder();
     for (int i = 0; i < dimensionCount; i++) {
@@ -129,8 +132,6 @@ public class IncrementalIndexRowTypeBenchmark
   @Setup
   public void setup()
   {
-    rng = new Random(9999);
-
     for (int i = 0; i < maxRows; i++) {
       longRows.add(getLongRow(0, dimensionCount));
     }
diff --git 
a/benchmarks/src/main/java/org/apache/druid/benchmark/LongCompressionBenchmark.java
 
b/benchmarks/src/main/java/org/apache/druid/benchmark/LongCompressionBenchmark.java
index 9e7d155..a85a722 100644
--- 
a/benchmarks/src/main/java/org/apache/druid/benchmark/LongCompressionBenchmark.java
+++ 
b/benchmarks/src/main/java/org/apache/druid/benchmark/LongCompressionBenchmark.java
@@ -39,7 +39,7 @@ import org.openjdk.jmh.infra.Blackhole;
 import java.io.File;
 import java.nio.ByteBuffer;
 import java.nio.ByteOrder;
-import java.util.Random;
+import java.util.concurrent.ThreadLocalRandom;
 import java.util.concurrent.TimeUnit;
 
 /**
@@ -65,7 +65,6 @@ public class LongCompressionBenchmark
   @Param({"lz4", "none"})
   private static String strategy;
 
-  private Random rand;
   private Supplier<ColumnarLongs> supplier;
 
   @Setup
@@ -73,7 +72,6 @@ public class LongCompressionBenchmark
   {
     File dir = new File(dirPath);
     File compFile = new File(dir, file + "-" + strategy + "-" + format);
-    rand = new Random();
     ByteBuffer buffer = Files.map(compFile);
     supplier = CompressedColumnarLongsSupplier.fromByteBuffer(buffer, 
ByteOrder.nativeOrder());
   }
@@ -94,7 +92,7 @@ public class LongCompressionBenchmark
   {
     ColumnarLongs columnarLongs = supplier.get();
     int count = columnarLongs.size();
-    for (int i = 0; i < count; i += rand.nextInt(2000)) {
+    for (int i = 0; i < count; i += ThreadLocalRandom.current().nextInt(2000)) 
{
       bh.consume(columnarLongs.get(i));
     }
     columnarLongs.close();
diff --git 
a/benchmarks/src/main/java/org/apache/druid/benchmark/MergeSequenceBenchmark.java
 
b/benchmarks/src/main/java/org/apache/druid/benchmark/MergeSequenceBenchmark.java
index 0ca3fba..8a96b85 100644
--- 
a/benchmarks/src/main/java/org/apache/druid/benchmark/MergeSequenceBenchmark.java
+++ 
b/benchmarks/src/main/java/org/apache/druid/benchmark/MergeSequenceBenchmark.java
@@ -42,6 +42,7 @@ import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Random;
+import java.util.concurrent.ThreadLocalRandom;
 import java.util.concurrent.TimeUnit;
 
 @State(Scope.Benchmark)
@@ -65,7 +66,7 @@ public class MergeSequenceBenchmark
   @Setup
   public void setup()
   {
-    Random rand = new Random(0);
+    Random rand = ThreadLocalRandom.current();
     sequences = Lists.newArrayList();
     for (int i = 0; i < count; i++) {
       int[] sequence = new int[sequenceLength];
diff --git 
a/benchmarks/src/main/java/org/apache/druid/server/coordinator/CachingCostBalancerStrategyBenchmark.java
 
b/benchmarks/src/main/java/org/apache/druid/server/coordinator/CachingCostBalancerStrategyBenchmark.java
index 9b44a27..73f8ba8 100644
--- 
a/benchmarks/src/main/java/org/apache/druid/server/coordinator/CachingCostBalancerStrategyBenchmark.java
+++ 
b/benchmarks/src/main/java/org/apache/druid/server/coordinator/CachingCostBalancerStrategyBenchmark.java
@@ -61,14 +61,13 @@ public class CachingCostBalancerStrategyBenchmark
   private final DateTime referenceTime = DateTimes.of("2014-01-01T00:00:00");
   private final Set<DataSegment> segments = new HashSet<>();
   private final Set<DataSegment> segmentQueries = new HashSet<>();
-  private final int seed = ThreadLocalRandom.current().nextInt();
 
   private SegmentsCostCache segmentsCostCache;
 
   @Setup
   public void createSegments()
   {
-    Random random = new Random(seed);
+    Random random = ThreadLocalRandom.current();
     SegmentsCostCache.Builder prototype = SegmentsCostCache.builder();
     for (int i = 0; i < NUMBER_OF_SEGMENTS; ++i) {
       DataSegment segment = createSegment(random.nextInt((int) 
TimeUnit.DAYS.toHours(DAYS_IN_MONTH)));
diff --git 
a/benchmarks/src/main/java/org/apache/druid/server/coordinator/CostBalancerStrategyBenchmark.java
 
b/benchmarks/src/main/java/org/apache/druid/server/coordinator/CostBalancerStrategyBenchmark.java
index 73f7003..f66367b 100644
--- 
a/benchmarks/src/main/java/org/apache/druid/server/coordinator/CostBalancerStrategyBenchmark.java
+++ 
b/benchmarks/src/main/java/org/apache/druid/server/coordinator/CostBalancerStrategyBenchmark.java
@@ -35,6 +35,7 @@ import org.openjdk.jmh.annotations.State;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Random;
+import java.util.concurrent.ThreadLocalRandom;
 import java.util.concurrent.TimeUnit;
 
 @State(Scope.Benchmark)
@@ -56,7 +57,7 @@ public class CostBalancerStrategyBenchmark
   {
     segment = createSegment(t0);
 
-    Random r = new Random(1234);
+    Random r = ThreadLocalRandom.current();
     segments = new ArrayList<>(n);
     for (int i = 0; i < n; ++i) {
       final DateTime t = t0.minusHours(r.nextInt(365 * 24) - 365 * 12);
diff --git a/codestyle/druid-forbidden-apis.txt 
b/codestyle/druid-forbidden-apis.txt
index aaeac46..5a459f4 100644
--- a/codestyle/druid-forbidden-apis.txt
+++ b/codestyle/druid-forbidden-apis.txt
@@ -5,7 +5,7 @@ com.google.common.collect.Iterators#emptyIterator() @ Use 
java.util.Collections#
 com.google.common.base.Charsets @ Use java.nio.charset.StandardCharsets instead
 java.io.File#toURL() @ Use java.io.File#toURI() and java.net.URI#toURL() 
instead
 org.apache.commons.io.FileUtils#getTempDirectory() @ Use 
org.junit.rules.TemporaryFolder for tests instead
-
 java.util.LinkedList @ Use ArrayList or ArrayDeque instead
 com.google.common.collect.Lists#newLinkedList() @ Use ArrayList or ArrayDeque 
instead
 com.google.common.collect.Lists#newLinkedList(java.lang.Iterable) @ Use 
ArrayList or ArrayDeque instead
+java.util.Random#<init>() @ Use ThreadLocalRandom.current() or the constructor 
with a seed (the latter in tests only!)
\ No newline at end of file
diff --git a/common/src/main/java/org/apache/druid/common/utils/SocketUtil.java 
b/common/src/main/java/org/apache/druid/common/utils/SocketUtil.java
index a54091d..c02351d 100644
--- a/common/src/main/java/org/apache/druid/common/utils/SocketUtil.java
+++ b/common/src/main/java/org/apache/druid/common/utils/SocketUtil.java
@@ -23,18 +23,16 @@ import org.apache.druid.java.util.common.ISE;
 
 import java.io.IOException;
 import java.net.ServerSocket;
-import java.util.Random;
+import java.util.concurrent.ThreadLocalRandom;
 
 /**
  */
 public class SocketUtil
 {
 
-  private static final Random rnd = new Random(System.currentTimeMillis());
-
   public static int findOpenPort(int basePort)
   {
-    final int startPort = basePort < 0 ? -1 : rnd.nextInt(0x7fff) + basePort;
+    final int startPort = basePort < 0 ? -1 : 
ThreadLocalRandom.current().nextInt(0x7fff) + basePort;
     return findOpenPortFrom(startPort);
   }
 
diff --git 
a/common/src/test/java/org/apache/druid/common/utils/IntArrayUtilsTest.java 
b/common/src/test/java/org/apache/druid/common/utils/IntArrayUtilsTest.java
index cbc5c84..082e4f4 100644
--- a/common/src/test/java/org/apache/druid/common/utils/IntArrayUtilsTest.java
+++ b/common/src/test/java/org/apache/druid/common/utils/IntArrayUtilsTest.java
@@ -25,6 +25,7 @@ import org.junit.Test;
 import java.util.Collections;
 import java.util.List;
 import java.util.Random;
+import java.util.concurrent.ThreadLocalRandom;
 import java.util.stream.Collectors;
 import java.util.stream.IntStream;
 
@@ -34,7 +35,7 @@ public class IntArrayUtilsTest
   public void testInverse()
   {
     final int numVals = 10000;
-    final Random random = new Random(System.currentTimeMillis());
+    final Random random = ThreadLocalRandom.current();
     final int[] inverted = new int[numVals];
     final int[] original = new int[numVals];
 
diff --git 
a/extensions-contrib/rabbitmq/src/test/java/org/apache/druid/examples/rabbitmq/RabbitMQProducerMain.java
 
b/extensions-contrib/rabbitmq/src/test/java/org/apache/druid/examples/rabbitmq/RabbitMQProducerMain.java
index 96d175e..8a8026b 100644
--- 
a/extensions-contrib/rabbitmq/src/test/java/org/apache/druid/examples/rabbitmq/RabbitMQProducerMain.java
+++ 
b/extensions-contrib/rabbitmq/src/test/java/org/apache/druid/examples/rabbitmq/RabbitMQProducerMain.java
@@ -39,6 +39,7 @@ import java.util.List;
 import java.util.Locale;
 import java.util.Random;
 import java.util.TimeZone;
+import java.util.concurrent.ThreadLocalRandom;
 
 /**
  *
@@ -178,7 +179,7 @@ public class RabbitMQProducerMain
     SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss", 
Locale.ENGLISH);
     Date stop = sdf.parse(cmd.getOptionValue("stop", sdf.format(new Date())));
 
-    Random r = new Random();
+    Random r = ThreadLocalRandom.current();
     Calendar timer = Calendar.getInstance(TimeZone.getTimeZone("UTC"), 
Locale.ENGLISH);
     timer.setTime(sdf.parse(cmd.getOptionValue("start", 
"2010-01-01T00:00:00")));
 
diff --git 
a/extensions-core/datasketches/src/test/java/org/apache/druid/query/aggregation/datasketches/quantiles/GenerateTestData.java
 
b/extensions-core/datasketches/src/test/java/org/apache/druid/query/aggregation/datasketches/quantiles/GenerateTestData.java
index a645526..48d8205 100644
--- 
a/extensions-core/datasketches/src/test/java/org/apache/druid/query/aggregation/datasketches/quantiles/GenerateTestData.java
+++ 
b/extensions-core/datasketches/src/test/java/org/apache/druid/query/aggregation/datasketches/quantiles/GenerateTestData.java
@@ -19,18 +19,18 @@
 
 package org.apache.druid.query.aggregation.datasketches.quantiles;
 
+import com.yahoo.sketches.quantiles.UpdateDoublesSketch;
+import org.apache.commons.codec.binary.Base64;
+
 import java.io.BufferedWriter;
 import java.nio.charset.StandardCharsets;
 import java.nio.file.FileSystems;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.util.Random;
+import java.util.concurrent.ThreadLocalRandom;
 
-import org.apache.commons.codec.binary.Base64;
-
-import com.yahoo.sketches.quantiles.UpdateDoublesSketch;
-
-// This is used for generating test data for DoublesSketchAggregatorTest
+/** This is used for generating test data for {@link 
DoublesSketchAggregatorTest} */
 public class GenerateTestData
 {
 
@@ -40,7 +40,7 @@ public class GenerateTestData
     Path sketchPath = 
FileSystems.getDefault().getPath("doubles_sketch_data.tsv");
     BufferedWriter buildData = Files.newBufferedWriter(buildPath, 
StandardCharsets.UTF_8);
     BufferedWriter sketchData = Files.newBufferedWriter(sketchPath, 
StandardCharsets.UTF_8);
-    Random rand = new Random();
+    Random rand = ThreadLocalRandom.current();
     int sequenceNumber = 0;
     for (int i = 0; i < 20; i++) {
       int product = rand.nextInt(10);
diff --git 
a/extensions-core/datasketches/src/test/java/org/apache/druid/query/aggregation/datasketches/tuple/GenerateTestData.java
 
b/extensions-core/datasketches/src/test/java/org/apache/druid/query/aggregation/datasketches/tuple/GenerateTestData.java
index dc8a9ef..da68be7 100644
--- 
a/extensions-core/datasketches/src/test/java/org/apache/druid/query/aggregation/datasketches/tuple/GenerateTestData.java
+++ 
b/extensions-core/datasketches/src/test/java/org/apache/druid/query/aggregation/datasketches/tuple/GenerateTestData.java
@@ -19,19 +19,19 @@
 
 package org.apache.druid.query.aggregation.datasketches.tuple;
 
+import com.yahoo.sketches.tuple.ArrayOfDoublesUpdatableSketch;
+import com.yahoo.sketches.tuple.ArrayOfDoublesUpdatableSketchBuilder;
+import org.apache.commons.codec.binary.Base64;
+
 import java.io.BufferedWriter;
 import java.nio.charset.StandardCharsets;
 import java.nio.file.FileSystems;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.util.Random;
+import java.util.concurrent.ThreadLocalRandom;
 
-import org.apache.commons.codec.binary.Base64;
-
-import com.yahoo.sketches.tuple.ArrayOfDoublesUpdatableSketch;
-import com.yahoo.sketches.tuple.ArrayOfDoublesUpdatableSketchBuilder;
-
-//This is used for generating test data for ArrayOfDoublesSketchAggregationTest
+/** This is used for generating test data for {@link 
ArrayOfDoublesSketchAggregationTest} */
 class GenerateTestData
 {
 
@@ -45,7 +45,7 @@ class GenerateTestData
   {
     Path path = 
FileSystems.getDefault().getPath("array_of_doubles_sketch_data.tsv");
     try (BufferedWriter out = Files.newBufferedWriter(path, 
StandardCharsets.UTF_8)) {
-      Random rand = new Random();
+      Random rand = ThreadLocalRandom.current();
       int key = 0;
       for (int i = 0; i < 20; i++) {
         ArrayOfDoublesUpdatableSketch sketch = new 
ArrayOfDoublesUpdatableSketchBuilder().setNominalEntries(1024)
@@ -72,7 +72,7 @@ class GenerateTestData
     double meanControl = 10.2;
     Path path = FileSystems.getDefault().getPath("bucket_test_data.tsv");
     try (BufferedWriter out = Files.newBufferedWriter(path, 
StandardCharsets.UTF_8)) {
-      Random rand = new Random();
+      Random rand = ThreadLocalRandom.current();
       for (int i = 0; i < 1000; i++) {
         writeBucketTestRecord(out, "test", i, rand.nextGaussian() + meanTest);
         writeBucketTestRecord(out, "control", i, rand.nextGaussian() + 
meanControl);
diff --git 
a/extensions-core/druid-kerberos/src/main/java/org/apache/druid/security/kerberos/KerberosAuthenticator.java
 
b/extensions-core/druid-kerberos/src/main/java/org/apache/druid/security/kerberos/KerberosAuthenticator.java
index 6d562a6..fd5a8a2 100644
--- 
a/extensions-core/druid-kerberos/src/main/java/org/apache/druid/security/kerberos/KerberosAuthenticator.java
+++ 
b/extensions-core/druid-kerberos/src/main/java/org/apache/druid/security/kerberos/KerberosAuthenticator.java
@@ -88,9 +88,9 @@ import java.util.List;
 import java.util.Locale;
 import java.util.Map;
 import java.util.Properties;
-import java.util.Random;
 import java.util.Set;
 import java.util.TimeZone;
+import java.util.concurrent.ThreadLocalRandom;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 import java.util.stream.Collectors;
@@ -164,7 +164,7 @@ public class KerberosAuthenticator implements Authenticator
           Properties config = getConfiguration(configPrefix, filterConfig);
           String signatureSecret = config.getProperty(configPrefix + 
SIGNATURE_SECRET);
           if (signatureSecret == null) {
-            signatureSecret = Long.toString(new Random().nextLong());
+            signatureSecret = 
Long.toString(ThreadLocalRandom.current().nextLong());
             log.warn("'signature.secret' configuration not set, using a random 
value as secret");
           }
           final byte[] secretBytes = StringUtils.toUtf8(signatureSecret);
diff --git 
a/extensions-core/kafka-indexing-service/src/main/java/org/apache/druid/indexing/kafka/KafkaIndexTask.java
 
b/extensions-core/kafka-indexing-service/src/main/java/org/apache/druid/indexing/kafka/KafkaIndexTask.java
index 94dab9e..0e362e2 100644
--- 
a/extensions-core/kafka-indexing-service/src/main/java/org/apache/druid/indexing/kafka/KafkaIndexTask.java
+++ 
b/extensions-core/kafka-indexing-service/src/main/java/org/apache/druid/indexing/kafka/KafkaIndexTask.java
@@ -37,6 +37,7 @@ import 
org.apache.druid.indexing.common.actions.SegmentAllocateAction;
 import org.apache.druid.indexing.common.actions.TaskActionClient;
 import org.apache.druid.indexing.common.stats.RowIngestionMetersFactory;
 import org.apache.druid.indexing.common.task.AbstractTask;
+import org.apache.druid.indexing.common.task.RealtimeIndexTask;
 import org.apache.druid.indexing.common.task.TaskResource;
 import org.apache.druid.indexing.common.task.Tasks;
 import org.apache.druid.indexing.kafka.supervisor.KafkaSupervisor;
@@ -63,7 +64,6 @@ import 
org.apache.kafka.common.serialization.ByteArrayDeserializer;
 import java.nio.ByteBuffer;
 import java.util.Map;
 import java.util.Properties;
-import java.util.Random;
 import java.util.Set;
 import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
@@ -83,7 +83,6 @@ public class KafkaIndexTask extends AbstractTask implements 
ChatHandler
 
   private static final EmittingLogger log = new 
EmittingLogger(KafkaIndexTask.class);
   private static final String TYPE = "index_kafka";
-  private static final Random RANDOM = new Random();
   static final long POLL_TIMEOUT_MILLIS = TimeUnit.MILLISECONDS.toMillis(100);
   static final long LOCK_ACQUIRE_TIMEOUT_SECONDS = 15;
 
@@ -111,7 +110,7 @@ public class KafkaIndexTask extends AbstractTask implements 
ChatHandler
   )
   {
     super(
-        id == null ? makeTaskId(dataSchema.getDataSource(), RANDOM.nextInt()) 
: id,
+        id == null ? makeTaskId(dataSchema.getDataSource()) : id,
         StringUtils.format("%s_%s", TYPE, dataSchema.getDataSource()),
         taskResource,
         dataSchema.getDataSource(),
@@ -157,13 +156,9 @@ public class KafkaIndexTask extends AbstractTask 
implements ChatHandler
     return pollRetryMs;
   }
 
-  private static String makeTaskId(String dataSource, int randomBits)
+  private static String makeTaskId(String dataSource)
   {
-    final StringBuilder suffix = new StringBuilder(8);
-    for (int i = 0; i < Integer.BYTES * 2; ++i) {
-      suffix.append((char) ('a' + ((randomBits >>> (i * 4)) & 0x0F)));
-    }
-    return Joiner.on("_").join(TYPE, dataSource, suffix);
+    return Joiner.on("_").join(TYPE, dataSource, 
RealtimeIndexTask.makeRandomId());
   }
 
   @Override
diff --git 
a/extensions-core/kafka-indexing-service/src/main/java/org/apache/druid/indexing/kafka/supervisor/KafkaSupervisor.java
 
b/extensions-core/kafka-indexing-service/src/main/java/org/apache/druid/indexing/kafka/supervisor/KafkaSupervisor.java
index 5087eef..3bcb6e3 100644
--- 
a/extensions-core/kafka-indexing-service/src/main/java/org/apache/druid/indexing/kafka/supervisor/KafkaSupervisor.java
+++ 
b/extensions-core/kafka-indexing-service/src/main/java/org/apache/druid/indexing/kafka/supervisor/KafkaSupervisor.java
@@ -42,10 +42,12 @@ import com.google.common.util.concurrent.Futures;
 import com.google.common.util.concurrent.ListenableFuture;
 import com.google.common.util.concurrent.ListeningExecutorService;
 import com.google.common.util.concurrent.MoreExecutors;
+import org.apache.commons.codec.digest.DigestUtils;
 import org.apache.druid.indexer.TaskLocation;
 import org.apache.druid.indexer.TaskStatus;
 import org.apache.druid.indexing.common.TaskInfoProvider;
 import org.apache.druid.indexing.common.stats.RowIngestionMetersFactory;
+import org.apache.druid.indexing.common.task.RealtimeIndexTask;
 import org.apache.druid.indexing.common.task.Task;
 import org.apache.druid.indexing.common.task.TaskResource;
 import org.apache.druid.indexing.kafka.KafkaDataSourceMetadata;
@@ -76,7 +78,6 @@ import 
org.apache.druid.java.util.emitter.service.ServiceEmitter;
 import org.apache.druid.java.util.emitter.service.ServiceMetricEvent;
 import org.apache.druid.metadata.EntryExistsException;
 import org.apache.druid.server.metrics.DruidMonitorSchedulerConfig;
-import org.apache.commons.codec.digest.DigestUtils;
 import org.apache.kafka.clients.consumer.KafkaConsumer;
 import org.apache.kafka.common.PartitionInfo;
 import org.apache.kafka.common.TopicPartition;
@@ -94,7 +95,6 @@ import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Properties;
-import java.util.Random;
 import java.util.Set;
 import java.util.SortedMap;
 import java.util.TreeMap;
@@ -122,7 +122,6 @@ import java.util.stream.Stream;
 public class KafkaSupervisor implements Supervisor
 {
   private static final EmittingLogger log = new 
EmittingLogger(KafkaSupervisor.class);
-  private static final Random RANDOM = new Random();
   private static final long MAX_RUN_FREQUENCY_MILLIS = 1000; // prevent us 
from running too often in response to events
   private static final long NOT_SET = -1;
   private static final long MINIMUM_FUTURE_TIMEOUT_IN_SECONDS = 120;
@@ -940,21 +939,12 @@ public class KafkaSupervisor implements Supervisor
     return Joiner.on("_").join("index_kafka", dataSource, hashCode);
   }
 
-  private static String getRandomId()
-  {
-    final StringBuilder suffix = new StringBuilder(8);
-    for (int i = 0; i < Integer.BYTES * 2; ++i) {
-      suffix.append((char) ('a' + ((RANDOM.nextInt() >>> (i * 4)) & 0x0F)));
-    }
-    return suffix.toString();
-  }
-
   private KafkaConsumer<byte[], byte[]> getKafkaConsumer()
   {
     final Properties props = new Properties();
 
     props.setProperty("metadata.max.age.ms", "10000");
-    props.setProperty("group.id", StringUtils.format("kafka-supervisor-%s", 
getRandomId()));
+    props.setProperty("group.id", StringUtils.format("kafka-supervisor-%s", 
RealtimeIndexTask.makeRandomId()));
 
     props.putAll(ioConfig.getConsumerProperties());
 
@@ -1866,7 +1856,7 @@ public class KafkaSupervisor implements Supervisor
                                             .putAll(spec.getContext())
                                             .build();
     for (int i = 0; i < replicas; i++) {
-      String taskId = Joiner.on("_").join(group.baseSequenceName, 
getRandomId());
+      String taskId = Joiner.on("_").join(group.baseSequenceName, 
RealtimeIndexTask.makeRandomId());
       KafkaIndexTask indexTask = new KafkaIndexTask(
           taskId,
           new TaskResource(group.baseSequenceName, 1),
diff --git 
a/extensions-core/kafka-indexing-service/src/test/java/org/apache/druid/indexing/kafka/test/TestBroker.java
 
b/extensions-core/kafka-indexing-service/src/test/java/org/apache/druid/indexing/kafka/test/TestBroker.java
index a6ef74f..701d69c 100644
--- 
a/extensions-core/kafka-indexing-service/src/test/java/org/apache/druid/indexing/kafka/test/TestBroker.java
+++ 
b/extensions-core/kafka-indexing-service/src/test/java/org/apache/druid/indexing/kafka/test/TestBroker.java
@@ -40,11 +40,10 @@ import java.io.File;
 import java.io.IOException;
 import java.util.Map;
 import java.util.Properties;
-import java.util.Random;
+import java.util.concurrent.ThreadLocalRandom;
 
 public class TestBroker implements Closeable
 {
-  private static final Random RANDOM = new Random();
 
   private final String zookeeperConnect;
   private final File directory;
@@ -76,7 +75,7 @@ public class TestBroker implements Closeable
     props.setProperty("zookeeper.connection.timeout.ms", "30000");
     props.setProperty("log.dirs", directory.toString());
     props.setProperty("broker.id", String.valueOf(id));
-    props.setProperty("port", String.valueOf(new Random().nextInt(9999) + 
10000));
+    props.setProperty("port", 
String.valueOf(ThreadLocalRandom.current().nextInt(9999) + 10000));
     props.setProperty("advertised.host.name", "localhost");
     props.putAll(brokerProps);
 
@@ -117,7 +116,7 @@ public class TestBroker implements Closeable
     props.put("bootstrap.servers", StringUtils.format("localhost:%d", 
getPort()));
     props.put("key.deserializer", ByteArrayDeserializer.class.getName());
     props.put("value.deserializer", ByteArrayDeserializer.class.getName());
-    props.put("group.id", String.valueOf(RANDOM.nextInt()));
+    props.put("group.id", 
String.valueOf(ThreadLocalRandom.current().nextInt()));
     props.put("auto.offset.reset", "earliest");
     return props;
   }
diff --git 
a/extensions-core/stats/src/test/java/org/apache/druid/query/aggregation/variance/VarianceAggregatorCollectorTest.java
 
b/extensions-core/stats/src/test/java/org/apache/druid/query/aggregation/variance/VarianceAggregatorCollectorTest.java
index 642ad85..d0ad824 100644
--- 
a/extensions-core/stats/src/test/java/org/apache/druid/query/aggregation/variance/VarianceAggregatorCollectorTest.java
+++ 
b/extensions-core/stats/src/test/java/org/apache/druid/query/aggregation/variance/VarianceAggregatorCollectorTest.java
@@ -30,6 +30,7 @@ import java.nio.ByteBuffer;
 import java.util.Arrays;
 import java.util.List;
 import java.util.Random;
+import java.util.concurrent.ThreadLocalRandom;
 
 public class VarianceAggregatorCollectorTest
 {
@@ -83,7 +84,7 @@ public class VarianceAggregatorCollectorTest
   @Test
   public void testVariance()
   {
-    Random random = new Random();
+    Random random = ThreadLocalRandom.current();
     for (float[] values : Arrays.asList(market_upfront, market_total_market)) {
       double sum = 0;
       for (float f : values) {
diff --git 
a/extensions-core/stats/src/test/java/org/apache/druid/query/aggregation/variance/VarianceSerdeTest.java
 
b/extensions-core/stats/src/test/java/org/apache/druid/query/aggregation/variance/VarianceSerdeTest.java
index b900fe7..4527c86 100644
--- 
a/extensions-core/stats/src/test/java/org/apache/druid/query/aggregation/variance/VarianceSerdeTest.java
+++ 
b/extensions-core/stats/src/test/java/org/apache/druid/query/aggregation/variance/VarianceSerdeTest.java
@@ -25,13 +25,14 @@ import org.junit.Test;
 
 import java.nio.ByteBuffer;
 import java.util.Random;
+import java.util.concurrent.ThreadLocalRandom;
 
 public class VarianceSerdeTest
 {
   @Test
   public void testSerde()
   {
-    Random r = new Random();
+    Random r = ThreadLocalRandom.current();
     VarianceAggregatorCollector holder = new VarianceAggregatorCollector();
     ObjectStrategy strategy = new VarianceSerde().getObjectStrategy();
     Assert.assertEquals(VarianceAggregatorCollector.class, 
strategy.getClazz());
diff --git 
a/hll/src/test/java/org/apache/druid/hll/HyperLogLogCollectorTest.java 
b/hll/src/test/java/org/apache/druid/hll/HyperLogLogCollectorTest.java
index d338222..cb6c1ee 100644
--- a/hll/src/test/java/org/apache/druid/hll/HyperLogLogCollectorTest.java
+++ b/hll/src/test/java/org/apache/druid/hll/HyperLogLogCollectorTest.java
@@ -38,6 +38,7 @@ import java.util.Arrays;
 import java.util.Collection;
 import java.util.List;
 import java.util.Random;
+import java.util.concurrent.ThreadLocalRandom;
 
 /**
  */
@@ -797,7 +798,7 @@ public class HyperLogLogCollectorTest
   public void showErrorRate()
   {
     HashFunction fn = Hashing.murmur3_128();
-    Random random = new Random();
+    Random random = ThreadLocalRandom.current();
 
     double error = 0.0d;
     int count = 0;
diff --git 
a/indexing-service/src/main/java/org/apache/druid/indexing/common/actions/RemoteTaskActionClient.java
 
b/indexing-service/src/main/java/org/apache/druid/indexing/common/actions/RemoteTaskActionClient.java
index e8b1d03..a1f2ebb 100644
--- 
a/indexing-service/src/main/java/org/apache/druid/indexing/common/actions/RemoteTaskActionClient.java
+++ 
b/indexing-service/src/main/java/org/apache/druid/indexing/common/actions/RemoteTaskActionClient.java
@@ -21,7 +21,6 @@ package org.apache.druid.indexing.common.actions;
 
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.google.common.base.Throwables;
-import org.apache.druid.java.util.http.client.response.FullResponseHolder;
 import org.apache.druid.discovery.DruidLeaderClient;
 import org.apache.druid.indexing.common.RetryPolicy;
 import org.apache.druid.indexing.common.RetryPolicyFactory;
@@ -29,6 +28,7 @@ import org.apache.druid.indexing.common.task.Task;
 import org.apache.druid.java.util.common.IOE;
 import org.apache.druid.java.util.common.jackson.JacksonUtils;
 import org.apache.druid.java.util.common.logger.Logger;
+import org.apache.druid.java.util.http.client.response.FullResponseHolder;
 import org.jboss.netty.channel.ChannelException;
 import org.jboss.netty.handler.codec.http.HttpMethod;
 import org.joda.time.Duration;
@@ -36,7 +36,7 @@ import org.joda.time.Duration;
 import javax.ws.rs.core.MediaType;
 import java.io.IOException;
 import java.util.Map;
-import java.util.Random;
+import java.util.concurrent.ThreadLocalRandom;
 
 public class RemoteTaskActionClient implements TaskActionClient
 {
@@ -44,7 +44,6 @@ public class RemoteTaskActionClient implements 
TaskActionClient
   private final RetryPolicyFactory retryPolicyFactory;
   private final ObjectMapper jsonMapper;
   private final DruidLeaderClient druidLeaderClient;
-  private final Random random = new Random();
 
   private static final Logger log = new Logger(RemoteTaskActionClient.class);
 
@@ -121,7 +120,7 @@ public class RemoteTaskActionClient implements 
TaskActionClient
 
   private long jitter(long input)
   {
-    final double jitter = random.nextGaussian() * input / 4.0;
+    final double jitter = ThreadLocalRandom.current().nextGaussian() * input / 
4.0;
     long retval = input + (long) jitter;
     return retval < 0 ? 0 : retval;
   }
diff --git 
a/indexing-service/src/main/java/org/apache/druid/indexing/common/task/AppenderatorDriverRealtimeIndexTask.java
 
b/indexing-service/src/main/java/org/apache/druid/indexing/common/task/AppenderatorDriverRealtimeIndexTask.java
index 11d14bb..d06cdb5 100644
--- 
a/indexing-service/src/main/java/org/apache/druid/indexing/common/task/AppenderatorDriverRealtimeIndexTask.java
+++ 
b/indexing-service/src/main/java/org/apache/druid/indexing/common/task/AppenderatorDriverRealtimeIndexTask.java
@@ -98,7 +98,6 @@ import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 import java.util.Queue;
-import java.util.Random;
 import java.util.Timer;
 import java.util.TimerTask;
 import java.util.concurrent.ConcurrentLinkedQueue;
@@ -112,20 +111,15 @@ public class AppenderatorDriverRealtimeIndexTask extends 
AbstractTask implements
   private static final String CTX_KEY_LOOKUP_TIER = "lookupTier";
 
   private static final EmittingLogger log = new 
EmittingLogger(RealtimeIndexTask.class);
-  private static final Random random = new Random();
 
   private static String makeTaskId(RealtimeAppenderatorIngestionSpec spec)
   {
-    final StringBuilder suffix = new StringBuilder(8);
-    for (int i = 0; i < Integer.BYTES * 2; ++i) {
-      suffix.append((char) ('a' + ((random.nextInt() >>> (i * 4)) & 0x0F)));
-    }
     return StringUtils.format(
         "index_realtime_%s_%d_%s_%s",
         spec.getDataSchema().getDataSource(),
         spec.getTuningConfig().getShardSpec().getPartitionNum(),
         DateTimes.nowUtc(),
-        suffix
+        RealtimeIndexTask.makeRandomId()
     );
   }
 
diff --git 
a/indexing-service/src/main/java/org/apache/druid/indexing/common/task/RealtimeIndexTask.java
 
b/indexing-service/src/main/java/org/apache/druid/indexing/common/task/RealtimeIndexTask.java
index 05770b4..1b331f0 100644
--- 
a/indexing-service/src/main/java/org/apache/druid/indexing/common/task/RealtimeIndexTask.java
+++ 
b/indexing-service/src/main/java/org/apache/druid/indexing/common/task/RealtimeIndexTask.java
@@ -76,17 +76,30 @@ import org.joda.time.Interval;
 import java.io.File;
 import java.io.IOException;
 import java.util.Map;
-import java.util.Random;
 import java.util.Timer;
 import java.util.TimerTask;
 import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.ThreadLocalRandom;
 
 public class RealtimeIndexTask extends AbstractTask
 {
   public static final String CTX_KEY_LOOKUP_TIER = "lookupTier";
 
   private static final EmittingLogger log = new 
EmittingLogger(RealtimeIndexTask.class);
-  private static final Random random = new Random();
+
+  private static final int TASK_ID_BITS_PER_SYMBOL = 4;
+  private static final int TASK_ID_SYMBOL_MASK = (1 << 
TASK_ID_BITS_PER_SYMBOL) - 1;
+  private static final int TASK_ID_LENGTH = Integer.BYTES / 
TASK_ID_BITS_PER_SYMBOL;
+
+  public static String makeRandomId()
+  {
+    final StringBuilder suffix = new StringBuilder(TASK_ID_LENGTH);
+    int randomBits = ThreadLocalRandom.current().nextInt();
+    for (int i = 0; i < TASK_ID_LENGTH; i++) {
+      suffix.append((char) ('a' + ((randomBits >>> (i * 
TASK_ID_BITS_PER_SYMBOL)) & TASK_ID_SYMBOL_MASK)));
+    }
+    return suffix.toString();
+  }
 
   private static String makeTaskId(FireDepartment fireDepartment)
   {
@@ -94,16 +107,12 @@ public class RealtimeIndexTask extends AbstractTask
         fireDepartment.getDataSchema().getDataSource(),
         fireDepartment.getTuningConfig().getShardSpec().getPartitionNum(),
         DateTimes.nowUtc(),
-        random.nextInt()
+        makeRandomId()
     );
   }
 
-  static String makeTaskId(String dataSource, int partitionNumber, DateTime 
timestamp, int randomBits)
+  static String makeTaskId(String dataSource, int partitionNumber, DateTime 
timestamp, String suffix)
   {
-    final StringBuilder suffix = new StringBuilder(8);
-    for (int i = 0; i < Integer.BYTES * 2; ++i) {
-      suffix.append((char) ('a' + ((randomBits >>> (i * 4)) & 0x0F)));
-    }
     return StringUtils.format(
         "index_realtime_%s_%d_%s_%s",
         dataSource,
diff --git 
a/indexing-service/src/main/java/org/apache/druid/indexing/overlord/helpers/TaskLogAutoCleanerConfig.java
 
b/indexing-service/src/main/java/org/apache/druid/indexing/overlord/helpers/TaskLogAutoCleanerConfig.java
index a9a990d..e8cda74 100644
--- 
a/indexing-service/src/main/java/org/apache/druid/indexing/overlord/helpers/TaskLogAutoCleanerConfig.java
+++ 
b/indexing-service/src/main/java/org/apache/druid/indexing/overlord/helpers/TaskLogAutoCleanerConfig.java
@@ -23,7 +23,7 @@ import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.google.common.base.Preconditions;
 
-import java.util.Random;
+import java.util.concurrent.ThreadLocalRandom;
 
 /**
  */
@@ -54,7 +54,11 @@ public class TaskLogAutoCleanerConfig
     }
 
     this.enabled = enabled;
-    this.initialDelay = initialDelay == null ? 60000 + new Random().nextInt(4 
* 60000) : initialDelay.longValue();
+    if (initialDelay == null) {
+      this.initialDelay = 60000 + ThreadLocalRandom.current().nextInt(4 * 
60000);
+    } else {
+      this.initialDelay = initialDelay.longValue();
+    }
     this.delay = delay == null ? 6 * 60 * 60 * 1000 : delay.longValue();
     this.durationToRetain = durationToRetain == null ? Long.MAX_VALUE : 
durationToRetain.longValue();
 
diff --git 
a/indexing-service/src/test/java/org/apache/druid/indexing/common/task/RealtimeIndexTaskTest.java
 
b/indexing-service/src/test/java/org/apache/druid/indexing/common/task/RealtimeIndexTaskTest.java
index a4283e1..1663576 100644
--- 
a/indexing-service/src/test/java/org/apache/druid/indexing/common/task/RealtimeIndexTaskTest.java
+++ 
b/indexing-service/src/test/java/org/apache/druid/indexing/common/task/RealtimeIndexTaskTest.java
@@ -268,7 +268,7 @@ public class RealtimeIndexTaskTest
   {
     Assert.assertEquals(
         "index_realtime_test_0_2015-01-02T00:00:00.000Z_abcdefgh",
-        RealtimeIndexTask.makeTaskId("test", 0, DateTimes.of("2015-01-02"), 
0x76543210)
+        RealtimeIndexTask.makeTaskId("test", 0, DateTimes.of("2015-01-02"), 
"abcdefgh")
     );
   }
 
diff --git 
a/java-util/src/test/java/org/apache/druid/java/util/http/client/response/SequenceInputStreamResponseHandlerTest.java
 
b/java-util/src/test/java/org/apache/druid/java/util/http/client/response/SequenceInputStreamResponseHandlerTest.java
index 0fedaac..2552a2f 100644
--- 
a/java-util/src/test/java/org/apache/druid/java/util/http/client/response/SequenceInputStreamResponseHandlerTest.java
+++ 
b/java-util/src/test/java/org/apache/druid/java/util/http/client/response/SequenceInputStreamResponseHandlerTest.java
@@ -50,7 +50,7 @@ public class SequenceInputStreamResponseHandlerTest
   {
     final ByteBuffer buffer = ByteBuffer.wrap(allBytes);
     while (buffer.hasRemaining()) {
-      final byte[] bytes = new byte[Math.min(Math.abs(RANDOM.nextInt()) % 128, 
buffer.remaining())];
+      final byte[] bytes = new byte[Math.min(RANDOM.nextInt(128), 
buffer.remaining())];
       RANDOM.nextBytes(bytes);
       buffer.put(bytes);
       BYTE_LIST.add(bytes);
@@ -85,7 +85,7 @@ public class SequenceInputStreamResponseHandlerTest
     final HttpResponse response = new 
DefaultHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.OK);
     response.setChunked(true);
     ClientResponse<InputStream> clientResponse = 
responseHandler.handleResponse(response, null);
-    final int failAt = Math.abs(RANDOM.nextInt()) % allBytes.length;
+    final int failAt = RANDOM.nextInt(allBytes.length);
     long chunkNum = 0;
     while (it.hasNext()) {
       final DefaultHttpChunk chunk = new DefaultHttpChunk(
@@ -161,7 +161,7 @@ public class SequenceInputStreamResponseHandlerTest
     final InputStream expectedStream = new ByteArrayInputStream(allBytes);
     int read = 0;
     while (read < allBytes.length) {
-      final byte[] expectedBytes = new 
byte[Math.min(Math.abs(RANDOM.nextInt()) % 128, allBytes.length - read)];
+      final byte[] expectedBytes = new byte[Math.min(RANDOM.nextInt(128), 
allBytes.length - read)];
       final byte[] actualBytes = new byte[expectedBytes.length];
       fillBuff(stream, actualBytes);
       fillBuff(expectedStream, expectedBytes);
@@ -216,7 +216,7 @@ public class SequenceInputStreamResponseHandlerTest
     final InputStream expectedStream = new ByteArrayInputStream(allBytes);
     int read = 0;
     while (read < allBytes.length) {
-      final byte[] expectedBytes = new 
byte[Math.min(Math.abs(RANDOM.nextInt()) % 128, allBytes.length - read)];
+      final byte[] expectedBytes = new byte[Math.min(RANDOM.nextInt(128), 
allBytes.length - read)];
       final byte[] actualBytes = new byte[expectedBytes.length];
       fillBuff(stream, actualBytes);
       fillBuff(expectedStream, expectedBytes);
diff --git 
a/processing/src/test/java/org/apache/druid/collections/spatial/ImmutableRTreeTest.java
 
b/processing/src/test/java/org/apache/druid/collections/spatial/ImmutableRTreeTest.java
index 1d12d37..2cc5099 100644
--- 
a/processing/src/test/java/org/apache/druid/collections/spatial/ImmutableRTreeTest.java
+++ 
b/processing/src/test/java/org/apache/druid/collections/spatial/ImmutableRTreeTest.java
@@ -43,6 +43,7 @@ import java.util.Arrays;
 import java.util.Locale;
 import java.util.Random;
 import java.util.Set;
+import java.util.concurrent.ThreadLocalRandom;
 import java.util.concurrent.TimeUnit;
 
 /**
@@ -172,7 +173,7 @@ public class ImmutableRTreeTest
     tree.insert(new float[]{5, 0}, 4);
     tree.insert(new float[]{-4, -3}, 5);
 
-    Random rand = new Random();
+    Random rand = ThreadLocalRandom.current();
     for (int i = 0; i < 95; i++) {
       tree.insert(
           new float[]{(float) (rand.nextDouble() * 10 + 10.0), (float) 
(rand.nextDouble() * 10 + 10.0)},
@@ -203,7 +204,7 @@ public class ImmutableRTreeTest
     tree.insert(new float[]{5, 0}, 4);
     tree.insert(new float[]{-4, -3}, 5);
 
-    Random rand = new Random();
+    Random rand = ThreadLocalRandom.current();
     for (int i = 0; i < 95; i++) {
       tree.insert(
           new float[]{(float) (rand.nextDouble() * 10 + 10.0), (float) 
(rand.nextDouble() * 10 + 10.0)},
@@ -235,7 +236,7 @@ public class ImmutableRTreeTest
     tree.insert(new float[]{7.0f, 3.0f}, 3);
     tree.insert(new float[]{8.0f, 6.0f}, 4);
 
-    Random rand = new Random();
+    Random rand = ThreadLocalRandom.current();
     for (int i = 5; i < 5000; i++) {
       tree.insert(
           new float[]{(float) (rand.nextDouble() * 10 + 10.0), (float) 
(rand.nextDouble() * 10 + 10.0)},
@@ -271,7 +272,7 @@ public class ImmutableRTreeTest
     tree.insert(new float[]{7.0f, 3.0f}, 3);
     tree.insert(new float[]{8.0f, 6.0f}, 4);
 
-    Random rand = new Random();
+    Random rand = ThreadLocalRandom.current();
     for (int i = 5; i < 5000; i++) {
       tree.insert(
           new float[]{(float) (rand.nextDouble() * 10 + 10.0), (float) 
(rand.nextDouble() * 10 + 10.0)},
@@ -307,7 +308,7 @@ public class ImmutableRTreeTest
     tree.insert(new float[]{7.0f, 3.0f}, 3);
     tree.insert(new float[]{8.0f, 6.0f}, 4);
 
-    Random rand = new Random();
+    Random rand = ThreadLocalRandom.current();
     for (int i = 5; i < 5000; i++) {
       tree.insert(
           new float[]{(float) (rand.nextFloat() * 10 + 10.0), (float) 
(rand.nextFloat() * 10 + 10.0)},
@@ -340,7 +341,7 @@ public class ImmutableRTreeTest
     tree.insert(new float[]{7.0f, 3.0f}, 3);
     tree.insert(new float[]{8.0f, 6.0f}, 4);
 
-    Random rand = new Random();
+    Random rand = ThreadLocalRandom.current();
     for (int i = 5; i < 5000; i++) {
       tree.insert(
           new float[]{(float) (rand.nextFloat() * 10 + 10.0), (float) 
(rand.nextFloat() * 10 + 10.0)},
@@ -367,7 +368,7 @@ public class ImmutableRTreeTest
   {
     BitmapFactory bf = new ConciseBitmapFactory();
     RTree tree = new RTree(2, new LinearGutmanSplitStrategy(0, 50, bf), bf);
-    Random rand = new Random();
+    Random rand = ThreadLocalRandom.current();
 
     int outPolygon = 0, inPolygon = 0;
     for (; inPolygon < 500; ) {
@@ -413,7 +414,7 @@ public class ImmutableRTreeTest
   {
     BitmapFactory bf = new RoaringBitmapFactory();
     RTree tree = new RTree(2, new LinearGutmanSplitStrategy(0, 50, bf), bf);
-    Random rand = new Random();
+    Random rand = ThreadLocalRandom.current();
 
     int outPolygon = 0, inPolygon = 0;
     for (; inPolygon < 500; ) {
@@ -496,7 +497,7 @@ public class ImmutableRTreeTest
     tree.insert(new float[]{5, 0}, 4);
     tree.insert(new float[]{-4, -3}, 5);
 
-    Random rand = new Random();
+    Random rand = ThreadLocalRandom.current();
     for (int i = 0; i < 4995; i++) {
       tree.insert(
           new float[]{(float) (rand.nextDouble() * 10 + 10.0), (float) 
(rand.nextDouble() * 10 + 10.0)},
@@ -528,7 +529,7 @@ public class ImmutableRTreeTest
     tree.insert(new float[]{5, 0}, 4);
     tree.insert(new float[]{-4, -3}, 5);
 
-    Random rand = new Random();
+    Random rand = ThreadLocalRandom.current();
     for (int i = 0; i < 4995; i++) {
       tree.insert(
           new float[]{(float) (rand.nextDouble() * 10 + 10.0), (float) 
(rand.nextDouble() * 10 + 10.0)},
@@ -562,7 +563,7 @@ public class ImmutableRTreeTest
         RTree tree = new RTree(2, new LinearGutmanSplitStrategy(0, 50, bf), 
bf);
 
         Stopwatch stopwatch = Stopwatch.createStarted();
-        Random rand = new Random();
+        Random rand = ThreadLocalRandom.current();
         for (int i = 0; i < numPoints; i++) {
           tree.insert(new float[]{(float) (rand.nextDouble() * 100), (float) 
(rand.nextDouble() * 100)}, i);
         }
@@ -612,7 +613,7 @@ public class ImmutableRTreeTest
         RTree tree = new RTree(2, new LinearGutmanSplitStrategy(0, 50, bf), 
bf);
 
         Stopwatch stopwatch = Stopwatch.createStarted();
-        Random rand = new Random();
+        Random rand = ThreadLocalRandom.current();
         for (int i = 0; i < numPoints; i++) {
           tree.insert(new float[]{(float) (rand.nextDouble() * 100), (float) 
(rand.nextDouble() * 100)}, i);
         }
diff --git 
a/processing/src/test/java/org/apache/druid/collections/spatial/RTreeTest.java 
b/processing/src/test/java/org/apache/druid/collections/spatial/RTreeTest.java
index 79d0daa..24e47ed 100644
--- 
a/processing/src/test/java/org/apache/druid/collections/spatial/RTreeTest.java
+++ 
b/processing/src/test/java/org/apache/druid/collections/spatial/RTreeTest.java
@@ -29,6 +29,7 @@ import org.junit.Test;
 
 import java.util.Arrays;
 import java.util.Random;
+import java.util.concurrent.ThreadLocalRandom;
 
 /**
  */
@@ -94,7 +95,7 @@ public class RTreeTest
   @Test
   public void testSplitOccurs()
   {
-    Random rand = new Random();
+    Random rand = ThreadLocalRandom.current();
     for (int i = 0; i < 100; i++) {
       tree.insert(new float[]{rand.nextFloat(), rand.nextFloat()}, i);
     }
@@ -105,7 +106,7 @@ public class RTreeTest
   @Test
   public void testSplitOccursRoaring()
   {
-    Random rand = new Random();
+    Random rand = ThreadLocalRandom.current();
     for (int i = 0; i < 100; i++) {
       roaringtree.insert(new float[]{rand.nextFloat(), rand.nextFloat()}, i);
     }
diff --git 
a/processing/src/test/java/org/apache/druid/collections/spatial/split/LinearGutmanSplitStrategyTest.java
 
b/processing/src/test/java/org/apache/druid/collections/spatial/split/LinearGutmanSplitStrategyTest.java
index df6b633..232ba8a 100644
--- 
a/processing/src/test/java/org/apache/druid/collections/spatial/split/LinearGutmanSplitStrategyTest.java
+++ 
b/processing/src/test/java/org/apache/druid/collections/spatial/split/LinearGutmanSplitStrategyTest.java
@@ -29,6 +29,7 @@ import junit.framework.Assert;
 import org.junit.Test;
 
 import java.util.Random;
+import java.util.concurrent.ThreadLocalRandom;
 
 /**
  */
@@ -82,7 +83,7 @@ public class LinearGutmanSplitStrategyTest
   {
     BitmapFactory bf = new ConciseBitmapFactory();
     RTree tree = new RTree(2, new LinearGutmanSplitStrategy(0, 50, bf), bf);
-    Random rand = new Random();
+    Random rand = ThreadLocalRandom.current();
     for (int i = 0; i < 100; i++) {
       tree.insert(new float[]{rand.nextFloat(), rand.nextFloat()}, i);
     }
@@ -95,7 +96,7 @@ public class LinearGutmanSplitStrategyTest
   {
     BitmapFactory bf = new RoaringBitmapFactory();
     RTree tree = new RTree(2, new LinearGutmanSplitStrategy(0, 50, bf), bf);
-    Random rand = new Random();
+    Random rand = ThreadLocalRandom.current();
     for (int i = 0; i < 100; i++) {
       tree.insert(new float[]{rand.nextFloat(), rand.nextFloat()}, i);
     }
diff --git 
a/processing/src/test/java/org/apache/druid/segment/IndexBuilder.java 
b/processing/src/test/java/org/apache/druid/segment/IndexBuilder.java
index 31b314b..26b89a6 100644
--- a/processing/src/test/java/org/apache/druid/segment/IndexBuilder.java
+++ b/processing/src/test/java/org/apache/druid/segment/IndexBuilder.java
@@ -26,20 +26,20 @@ import com.google.common.collect.Iterables;
 import com.google.common.collect.Lists;
 import org.apache.druid.data.input.InputRow;
 import org.apache.druid.java.util.common.StringUtils;
-import 
org.apache.druid.segment.writeout.OffHeapMemorySegmentWriteOutMediumFactory;
-import org.apache.druid.segment.writeout.SegmentWriteOutMediumFactory;
 import org.apache.druid.query.aggregation.AggregatorFactory;
 import org.apache.druid.query.aggregation.CountAggregatorFactory;
 import org.apache.druid.segment.incremental.IncrementalIndex;
 import org.apache.druid.segment.incremental.IncrementalIndexSchema;
 import org.apache.druid.segment.incremental.IndexSizeExceededException;
+import 
org.apache.druid.segment.writeout.OffHeapMemorySegmentWriteOutMediumFactory;
+import org.apache.druid.segment.writeout.SegmentWriteOutMediumFactory;
 
 import java.io.File;
 import java.io.IOException;
 import java.util.Arrays;
 import java.util.List;
-import java.util.Random;
 import java.util.UUID;
+import java.util.concurrent.ThreadLocalRandom;
 
 /**
  * Helps tests make segments.
@@ -115,7 +115,7 @@ public class IndexBuilder
       return TestHelper.getTestIndexIO(segmentWriteOutMediumFactory).loadIndex(
           indexMerger.persist(
               incrementalIndex,
-              new File(tmpDir, StringUtils.format("testIndex-%s", new 
Random().nextInt(Integer.MAX_VALUE))),
+              new File(tmpDir, StringUtils.format("testIndex-%s", 
ThreadLocalRandom.current().nextInt(Integer.MAX_VALUE))),
               indexSpec,
               null
           )
diff --git 
a/processing/src/test/java/org/apache/druid/segment/IndexMergerV9WithSpatialIndexTest.java
 
b/processing/src/test/java/org/apache/druid/segment/IndexMergerV9WithSpatialIndexTest.java
index 3509eec..bd5d144 100644
--- 
a/processing/src/test/java/org/apache/druid/segment/IndexMergerV9WithSpatialIndexTest.java
+++ 
b/processing/src/test/java/org/apache/druid/segment/IndexMergerV9WithSpatialIndexTest.java
@@ -63,6 +63,7 @@ import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
 import java.util.Random;
+import java.util.concurrent.ThreadLocalRandom;
 
 /**
  */
@@ -233,7 +234,7 @@ public class IndexMergerV9WithSpatialIndexTest
     );
 
     // Add a bunch of random points
-    Random rand = new Random();
+    Random rand = ThreadLocalRandom.current();
     for (int i = 8; i < NUM_POINTS; i++) {
       theIndex.add(
           new MapBasedInputRow(
@@ -465,7 +466,7 @@ public class IndexMergerV9WithSpatialIndexTest
       );
 
       // Add a bunch of random points
-      Random rand = new Random();
+      Random rand = ThreadLocalRandom.current();
       for (int i = 8; i < NUM_POINTS; i++) {
         third.add(
             new MapBasedInputRow(
diff --git 
a/processing/src/test/java/org/apache/druid/segment/data/BenchmarkIndexibleWrites.java
 
b/processing/src/test/java/org/apache/druid/segment/data/BenchmarkIndexibleWrites.java
index 1c5d866..df81b8e 100644
--- 
a/processing/src/test/java/org/apache/druid/segment/data/BenchmarkIndexibleWrites.java
+++ 
b/processing/src/test/java/org/apache/druid/segment/data/BenchmarkIndexibleWrites.java
@@ -45,6 +45,7 @@ import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.Executors;
+import java.util.concurrent.ThreadLocalRandom;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.atomic.AtomicLong;
@@ -271,7 +272,7 @@ public class BenchmarkIndexibleWrites extends 
AbstractBenchmark
                   catch (InterruptedException e) {
                     throw Throwables.propagate(e);
                   }
-                  final Random rndGen = new Random();
+                  final Random rndGen = ThreadLocalRandom.current();
                   while (!done.get()) {
                     Integer idx = rndGen.nextInt(queryableIndex.get() + 1);
                     Assert.assertEquals(idx, concurrentIndexible.get(idx));
diff --git 
a/processing/src/test/java/org/apache/druid/segment/filter/SpatialFilterBonusTest.java
 
b/processing/src/test/java/org/apache/druid/segment/filter/SpatialFilterBonusTest.java
index 50791c5..88840a4 100644
--- 
a/processing/src/test/java/org/apache/druid/segment/filter/SpatialFilterBonusTest.java
+++ 
b/processing/src/test/java/org/apache/druid/segment/filter/SpatialFilterBonusTest.java
@@ -74,6 +74,7 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Random;
 import java.util.Set;
+import java.util.concurrent.ThreadLocalRandom;
 
 /**
  */
@@ -213,7 +214,7 @@ public class SpatialFilterBonusTest
 
     // Add a bunch of random points, without replacement
     Set<String> alreadyChosen = Sets.newHashSet();
-    Random rand = new Random();
+    Random rand = ThreadLocalRandom.current();
     for (int i = 6; i < NUM_POINTS; i++) {
       String coord = null;
       while (coord == null) {
@@ -408,7 +409,7 @@ public class SpatialFilterBonusTest
       );
 
       // Add a bunch of random points
-      Random rand = new Random();
+      Random rand = ThreadLocalRandom.current();
       for (int i = 6; i < NUM_POINTS; i++) {
         third.add(
             new MapBasedInputRow(
diff --git 
a/processing/src/test/java/org/apache/druid/segment/filter/SpatialFilterTest.java
 
b/processing/src/test/java/org/apache/druid/segment/filter/SpatialFilterTest.java
index c2c4d2f..14bbe89 100644
--- 
a/processing/src/test/java/org/apache/druid/segment/filter/SpatialFilterTest.java
+++ 
b/processing/src/test/java/org/apache/druid/segment/filter/SpatialFilterTest.java
@@ -69,6 +69,7 @@ import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
 import java.util.Random;
+import java.util.concurrent.ThreadLocalRandom;
 
 /**
  */
@@ -244,7 +245,7 @@ public class SpatialFilterTest
     );
 
     // Add a bunch of random points
-    Random rand = new Random();
+    Random rand = ThreadLocalRandom.current();
     for (int i = 8; i < NUM_POINTS; i++) {
       theIndex.add(
           new MapBasedInputRow(
@@ -464,7 +465,7 @@ public class SpatialFilterTest
       );
 
       // Add a bunch of random points
-      Random rand = new Random();
+      Random rand = ThreadLocalRandom.current();
       for (int i = 8; i < NUM_POINTS; i++) {
         third.add(
             new MapBasedInputRow(
diff --git 
a/processing/src/test/java/org/apache/druid/segment/incremental/OnheapIncrementalIndexTest.java
 
b/processing/src/test/java/org/apache/druid/segment/incremental/OnheapIncrementalIndexTest.java
index a8c565e..76ce9d7 100644
--- 
a/processing/src/test/java/org/apache/druid/segment/incremental/OnheapIncrementalIndexTest.java
+++ 
b/processing/src/test/java/org/apache/druid/segment/incremental/OnheapIncrementalIndexTest.java
@@ -31,6 +31,7 @@ import org.junit.Test;
 
 import java.util.Collections;
 import java.util.Random;
+import java.util.concurrent.ThreadLocalRandom;
 import java.util.concurrent.atomic.AtomicInteger;
 
 public class OnheapIncrementalIndexTest
@@ -51,7 +52,6 @@ public class OnheapIncrementalIndexTest
         .setMaxRowCount(MAX_ROWS)
         .buildOnheap();
 
-    final Random random = new Random();
     final int addThreadCount = 2;
     Thread[] addThreads = new Thread[addThreadCount];
     for (int i = 0; i < addThreadCount; ++i) {
@@ -60,6 +60,7 @@ public class OnheapIncrementalIndexTest
         @Override
         public void run()
         {
+          final Random random = ThreadLocalRandom.current();
           try {
             for (int j = 0; j < MAX_ROWS / addThreadCount; ++j) {
               index.add(new MapBasedInputRow(
diff --git 
a/server/src/main/java/org/apache/druid/server/coordinator/BalancerStrategy.java
 
b/server/src/main/java/org/apache/druid/server/coordinator/BalancerStrategy.java
index 059f2aa..a75642f 100644
--- 
a/server/src/main/java/org/apache/druid/server/coordinator/BalancerStrategy.java
+++ 
b/server/src/main/java/org/apache/druid/server/coordinator/BalancerStrategy.java
@@ -21,6 +21,7 @@ package org.apache.druid.server.coordinator;
 
 import org.apache.druid.timeline.DataSegment;
 
+import javax.annotation.Nullable;
 import java.util.Iterator;
 import java.util.List;
 import java.util.NavigableSet;
@@ -39,6 +40,7 @@ public interface BalancerStrategy
    * @param serverHolders servers to consider as move destinations
    * @return The server to move to, or null if no move should be made or no 
server is suitable
    */
+  @Nullable
   ServerHolder findNewSegmentHomeBalancer(DataSegment proposalSegment, 
List<ServerHolder> serverHolders);
 
   /**
@@ -47,6 +49,7 @@ public interface BalancerStrategy
    * @param serverHolders servers to consider as replica holders
    * @return The server to replicate to, or null if no suitable server is found
    */
+  @Nullable
   ServerHolder findNewSegmentHomeReplicator(DataSegment proposalSegment, 
List<ServerHolder> serverHolders);
 
   /**
diff --git 
a/server/src/main/java/org/apache/druid/server/coordinator/CostBalancerStrategy.java
 
b/server/src/main/java/org/apache/druid/server/coordinator/CostBalancerStrategy.java
index 254e0d5..f7f7420 100644
--- 
a/server/src/main/java/org/apache/druid/server/coordinator/CostBalancerStrategy.java
+++ 
b/server/src/main/java/org/apache/druid/server/coordinator/CostBalancerStrategy.java
@@ -219,8 +219,7 @@ public class CostBalancerStrategy implements 
BalancerStrategy
   @Override
   public BalancerSegmentHolder pickSegmentToMove(final List<ServerHolder> 
serverHolders)
   {
-    ReservoirSegmentSampler sampler = new ReservoirSegmentSampler();
-    return sampler.getRandomBalancerSegmentHolder(serverHolders);
+    return 
ReservoirSegmentSampler.getRandomBalancerSegmentHolder(serverHolders);
   }
 
   @Override
diff --git 
a/server/src/main/java/org/apache/druid/server/coordinator/RandomBalancerStrategy.java
 
b/server/src/main/java/org/apache/druid/server/coordinator/RandomBalancerStrategy.java
index 1c123c4..8b0b306 100644
--- 
a/server/src/main/java/org/apache/druid/server/coordinator/RandomBalancerStrategy.java
+++ 
b/server/src/main/java/org/apache/druid/server/coordinator/RandomBalancerStrategy.java
@@ -21,25 +21,24 @@ package org.apache.druid.server.coordinator;
 
 import org.apache.druid.timeline.DataSegment;
 
-import java.util.Comparator;
+import java.util.ArrayList;
+import java.util.Collections;
 import java.util.Iterator;
 import java.util.List;
 import java.util.NavigableSet;
-import java.util.Random;
+import java.util.concurrent.ThreadLocalRandom;
 
 public class RandomBalancerStrategy implements BalancerStrategy
 {
-  private final ReservoirSegmentSampler sampler = new 
ReservoirSegmentSampler();
-
   @Override
   public ServerHolder findNewSegmentHomeReplicator(DataSegment 
proposalSegment, List<ServerHolder> serverHolders)
   {
     if (serverHolders.size() == 1) {
       return null;
     } else {
-      ServerHolder holder = serverHolders.get(new 
Random().nextInt(serverHolders.size()));
+      ServerHolder holder = 
serverHolders.get(ThreadLocalRandom.current().nextInt(serverHolders.size()));
       while (holder.isServingSegment(proposalSegment)) {
-        holder = serverHolders.get(new Random().nextInt(serverHolders.size()));
+        holder = 
serverHolders.get(ThreadLocalRandom.current().nextInt(serverHolders.size()));
       }
       return holder;
     }
@@ -54,13 +53,15 @@ public class RandomBalancerStrategy implements 
BalancerStrategy
   @Override
   public BalancerSegmentHolder pickSegmentToMove(List<ServerHolder> 
serverHolders)
   {
-    return sampler.getRandomBalancerSegmentHolder(serverHolders);
+    return 
ReservoirSegmentSampler.getRandomBalancerSegmentHolder(serverHolders);
   }
 
   @Override
   public Iterator<ServerHolder> pickServersToDrop(DataSegment toDropSegment, 
NavigableSet<ServerHolder> serverHolders)
   {
-    return serverHolders.stream().sorted(Comparator.comparingDouble(o -> new 
Random().nextDouble())).iterator();
+    List<ServerHolder> serverList = new ArrayList<>(serverHolders);
+    Collections.shuffle(serverList);
+    return serverList.iterator();
   }
 
   @Override
diff --git 
a/server/src/main/java/org/apache/druid/server/coordinator/ReservoirSegmentSampler.java
 
b/server/src/main/java/org/apache/druid/server/coordinator/ReservoirSegmentSampler.java
index 7d2b19a..d4b222f 100644
--- 
a/server/src/main/java/org/apache/druid/server/coordinator/ReservoirSegmentSampler.java
+++ 
b/server/src/main/java/org/apache/druid/server/coordinator/ReservoirSegmentSampler.java
@@ -22,21 +22,20 @@ package org.apache.druid.server.coordinator;
 import org.apache.druid.timeline.DataSegment;
 
 import java.util.List;
-import java.util.Random;
+import java.util.concurrent.ThreadLocalRandom;
 
-public class ReservoirSegmentSampler
+final class ReservoirSegmentSampler
 {
 
-  public BalancerSegmentHolder getRandomBalancerSegmentHolder(final 
List<ServerHolder> serverHolders)
+  static BalancerSegmentHolder getRandomBalancerSegmentHolder(final 
List<ServerHolder> serverHolders)
   {
-    final Random rand = new Random();
     ServerHolder fromServerHolder = null;
     DataSegment proposalSegment = null;
     int numSoFar = 0;
 
     for (ServerHolder server : serverHolders) {
       for (DataSegment segment : server.getServer().getSegments().values()) {
-        int randNum = rand.nextInt(numSoFar + 1);
+        int randNum = ThreadLocalRandom.current().nextInt(numSoFar + 1);
         // w.p. 1 / (numSoFar+1), swap out the server and segment
         if (randNum == numSoFar) {
           fromServerHolder = server;
@@ -51,4 +50,8 @@ public class ReservoirSegmentSampler
       return null;
     }
   }
+
+  private ReservoirSegmentSampler()
+  {
+  }
 }
diff --git 
a/server/src/test/java/org/apache/druid/server/coordinator/ReservoirSegmentSamplerTest.java
 
b/server/src/test/java/org/apache/druid/server/coordinator/ReservoirSegmentSamplerTest.java
index 1d7a831..323104bd 100644
--- 
a/server/src/test/java/org/apache/druid/server/coordinator/ReservoirSegmentSamplerTest.java
+++ 
b/server/src/test/java/org/apache/druid/server/coordinator/ReservoirSegmentSamplerTest.java
@@ -195,9 +195,8 @@ public class ReservoirSegmentSamplerTest
     holderList.add(holder4);
 
     Map<DataSegment, Integer> segmentCountMap = Maps.newHashMap();
-    ReservoirSegmentSampler sampler = new ReservoirSegmentSampler();
     for (int i = 0; i < 5000; i++) {
-      
segmentCountMap.put(sampler.getRandomBalancerSegmentHolder(holderList).getSegment(),
 1);
+      
segmentCountMap.put(ReservoirSegmentSampler.getRandomBalancerSegmentHolder(holderList).getSegment(),
 1);
     }
 
     for (DataSegment segment : segments) {
diff --git 
a/server/src/test/java/org/apache/druid/server/initialization/BaseJettyTest.java
 
b/server/src/test/java/org/apache/druid/server/initialization/BaseJettyTest.java
index 571e449..75ef856 100644
--- 
a/server/src/test/java/org/apache/druid/server/initialization/BaseJettyTest.java
+++ 
b/server/src/test/java/org/apache/druid/server/initialization/BaseJettyTest.java
@@ -62,7 +62,7 @@ import javax.ws.rs.core.Context;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
 import java.io.IOException;
-import java.util.Random;
+import java.util.concurrent.ThreadLocalRandom;
 import java.util.concurrent.TimeUnit;
 
 public abstract class BaseJettyTest
@@ -155,15 +155,13 @@ public abstract class BaseJettyTest
   public static class SlowResource
   {
 
-    public static Random random = new Random();
-
     @GET
     @Path("/hello")
     @Produces(MediaType.APPLICATION_JSON)
     public Response hello()
     {
       try {
-        TimeUnit.MILLISECONDS.sleep(500 + random.nextInt(1600));
+        TimeUnit.MILLISECONDS.sleep(500 + 
ThreadLocalRandom.current().nextInt(1600));
       }
       catch (InterruptedException e) {
         //
diff --git 
a/sql/src/test/java/org/apache/druid/sql/avatica/DruidAvaticaHandlerTest.java 
b/sql/src/test/java/org/apache/druid/sql/avatica/DruidAvaticaHandlerTest.java
index 8fa788c..be67342 100644
--- 
a/sql/src/test/java/org/apache/druid/sql/avatica/DruidAvaticaHandlerTest.java
+++ 
b/sql/src/test/java/org/apache/druid/sql/avatica/DruidAvaticaHandlerTest.java
@@ -89,9 +89,9 @@ import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 import java.util.Properties;
-import java.util.Random;
 import java.util.Set;
 import java.util.concurrent.Executors;
+import java.util.concurrent.ThreadLocalRandom;
 
 public class DruidAvaticaHandlerTest extends CalciteTestBase
 {
@@ -192,7 +192,7 @@ public class DruidAvaticaHandlerTest extends CalciteTestBase
         new DruidNode("dummy", "dummy", 1, null, true, false),
         new AvaticaMonitor()
     );
-    final int port = new Random().nextInt(9999) + 10000;
+    final int port = ThreadLocalRandom.current().nextInt(9999) + 10000;
     server = new Server(new InetSocketAddress("127.0.0.1", port));
     server.setHandler(handler);
     server.start();
@@ -788,7 +788,7 @@ public class DruidAvaticaHandlerTest extends CalciteTestBase
         new DruidNode("dummy", "dummy", 1, null, true, false),
         new AvaticaMonitor()
     );
-    final int port = new Random().nextInt(9999) + 20000;
+    final int port = ThreadLocalRandom.current().nextInt(9999) + 20000;
     Server smallFrameServer = new Server(new InetSocketAddress("127.0.0.1", 
port));
     smallFrameServer.setHandler(handler);
     smallFrameServer.start();


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@druid.apache.org
For additional commands, e-mail: commits-h...@druid.apache.org

Reply via email to