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() & 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() & 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