From ff4a11aa32b43a1109a364b5d4fed4f8310d0f6c Mon Sep 17 00:00:00 2001 From: Simon Willnauer Date: Mon, 14 Sep 2015 22:45:12 +0200 Subject: [PATCH] Replace and ban next batch of Guava classes This commit replaces and bans: * com.google.common.util.concurrent.UncheckedExecutionException * com.google.common.util.concurrent.AtomicLongMap * com.google.common.primitives.Longs * com.google.common.io.ByteStreams * com.google.common.collect.UnmodifiableIterator * com.google.common.collect.ObjectArrays * com.google.common.collect.Multimap * com.google.common.collect.MultimapBuilder Relates to #13224 --- .../lucene/queries/BlendedTermQuery.java | 4 +- .../get/GetRepositoriesRequestBuilder.java | 4 +- .../get/GetSnapshotsRequestBuilder.java | 4 +- .../status/SnapshotsStatusRequestBuilder.java | 5 +- .../alias/get/BaseAliasesRequestBuilder.java | 7 +-- .../admin/indices/get/GetIndexRequest.java | 5 +- .../get/GetFieldMappingsRequestBuilder.java | 8 +-- .../get/GetSettingsRequestBuilder.java | 4 +- .../warmer/get/GetWarmersRequestBuilder.java | 4 +- .../info/ClusterInfoRequestBuilder.java | 8 +-- .../action/termvectors/TermVectorsFilter.java | 7 ++- .../cluster/metadata/AliasOrIndex.java | 8 ++- .../cluster/metadata/MetaData.java | 16 +---- .../cluster/node/DiscoveryNodes.java | 9 +-- .../cluster/routing/IndexRoutingTable.java | 10 +-- .../cluster/routing/RoutingTable.java | 3 +- .../common/cli/CliToolConfig.java | 13 ++-- .../common/collect/CopyOnWriteHashMap.java | 9 ++- .../common/collect/ImmutableOpenIntMap.java | 19 ++++-- .../common/collect/ImmutableOpenMap.java | 27 ++++---- .../common/lucene/ShardCoreKeyMap.java | 63 ++++++++++++------- .../elasticsearch/common/util/ArrayUtils.java | 19 ++++++ .../common/util/LongObjectPagedHashMap.java | 8 ++- .../org/elasticsearch/http/HttpServer.java | 8 ++- .../internal/FieldNamesFieldMapper.java | 8 ++- .../random/RandomScoreFunctionParser.java | 10 +-- .../blobstore/BlobStoreRepository.java | 8 ++- .../blobstore/ChecksumBlobStoreFormat.java | 6 +- .../blobstore/LegacyBlobStoreFormat.java | 8 ++- .../bucket/terms/InternalTerms.java | 15 ++--- .../hdr/InternalHDRPercentileRanks.java | 9 ++- .../hdr/InternalHDRPercentiles.java | 9 ++- .../InternalTDigestPercentileRanks.java | 9 ++- .../tdigest/InternalTDigestPercentiles.java | 9 ++- .../percentile/InternalPercentilesBucket.java | 8 ++- .../search/internal/SearchContext.java | 25 ++++---- .../common/util/ArrayUtilsTests.java | 21 +++++++ .../plugins/PluginManagerUnitTests.java | 8 +-- .../resources/forbidden/all-signatures.txt | 8 +++ 39 files changed, 263 insertions(+), 170 deletions(-) diff --git a/core/src/main/java/org/apache/lucene/queries/BlendedTermQuery.java b/core/src/main/java/org/apache/lucene/queries/BlendedTermQuery.java index 7d3c47f9615..e411139bab0 100644 --- a/core/src/main/java/org/apache/lucene/queries/BlendedTermQuery.java +++ b/core/src/main/java/org/apache/lucene/queries/BlendedTermQuery.java @@ -18,8 +18,6 @@ */ package org.apache.lucene.queries; -import com.google.common.primitives.Ints; - import org.apache.lucene.index.IndexReader; import org.apache.lucene.index.IndexReaderContext; import org.apache.lucene.index.LeafReaderContext; @@ -141,7 +139,7 @@ public abstract class BlendedTermQuery extends Query { } @Override protected int compare(int i, int j) { - return Ints.compare(contexts[tieBreak[j]].docFreq(), contexts[tieBreak[i]].docFreq()); + return Integer.compare(contexts[tieBreak[j]].docFreq(), contexts[tieBreak[i]].docFreq()); } }.sort(0, tieBreak.length); int prev = contexts[tieBreak[0]].docFreq(); diff --git a/core/src/main/java/org/elasticsearch/action/admin/cluster/repositories/get/GetRepositoriesRequestBuilder.java b/core/src/main/java/org/elasticsearch/action/admin/cluster/repositories/get/GetRepositoriesRequestBuilder.java index 320794c5660..e21aa19f7f8 100644 --- a/core/src/main/java/org/elasticsearch/action/admin/cluster/repositories/get/GetRepositoriesRequestBuilder.java +++ b/core/src/main/java/org/elasticsearch/action/admin/cluster/repositories/get/GetRepositoriesRequestBuilder.java @@ -19,9 +19,9 @@ package org.elasticsearch.action.admin.cluster.repositories.get; -import com.google.common.collect.ObjectArrays; import org.elasticsearch.action.support.master.MasterNodeReadOperationRequestBuilder; import org.elasticsearch.client.ElasticsearchClient; +import org.elasticsearch.common.util.ArrayUtils; /** * Get repository request builder @@ -60,7 +60,7 @@ public class GetRepositoriesRequestBuilder extends MasterNodeReadOperationReques * @return builder */ public GetRepositoriesRequestBuilder addRepositories(String... repositories) { - request.repositories(ObjectArrays.concat(request.repositories(), repositories, String.class)); + request.repositories(ArrayUtils.concat(request.repositories(), repositories)); return this; } } diff --git a/core/src/main/java/org/elasticsearch/action/admin/cluster/snapshots/get/GetSnapshotsRequestBuilder.java b/core/src/main/java/org/elasticsearch/action/admin/cluster/snapshots/get/GetSnapshotsRequestBuilder.java index 79472d4313a..d989ac3d95c 100644 --- a/core/src/main/java/org/elasticsearch/action/admin/cluster/snapshots/get/GetSnapshotsRequestBuilder.java +++ b/core/src/main/java/org/elasticsearch/action/admin/cluster/snapshots/get/GetSnapshotsRequestBuilder.java @@ -19,9 +19,9 @@ package org.elasticsearch.action.admin.cluster.snapshots.get; -import com.google.common.collect.ObjectArrays; import org.elasticsearch.action.support.master.MasterNodeOperationRequestBuilder; import org.elasticsearch.client.ElasticsearchClient; +import org.elasticsearch.common.util.ArrayUtils; /** * Get snapshots request builder @@ -81,7 +81,7 @@ public class GetSnapshotsRequestBuilder extends MasterNodeOperationRequestBuilde * @return this builder */ public GetSnapshotsRequestBuilder addSnapshots(String... snapshots) { - request.snapshots(ObjectArrays.concat(request.snapshots(), snapshots, String.class)); + request.snapshots(ArrayUtils.concat(request.snapshots(), snapshots)); return this; } } diff --git a/core/src/main/java/org/elasticsearch/action/admin/cluster/snapshots/status/SnapshotsStatusRequestBuilder.java b/core/src/main/java/org/elasticsearch/action/admin/cluster/snapshots/status/SnapshotsStatusRequestBuilder.java index c8a7829c483..3ec1733ceab 100644 --- a/core/src/main/java/org/elasticsearch/action/admin/cluster/snapshots/status/SnapshotsStatusRequestBuilder.java +++ b/core/src/main/java/org/elasticsearch/action/admin/cluster/snapshots/status/SnapshotsStatusRequestBuilder.java @@ -19,10 +19,9 @@ package org.elasticsearch.action.admin.cluster.snapshots.status; -import com.google.common.collect.ObjectArrays; -import org.elasticsearch.action.ActionListener; import org.elasticsearch.action.support.master.MasterNodeOperationRequestBuilder; import org.elasticsearch.client.ElasticsearchClient; +import org.elasticsearch.common.util.ArrayUtils; /** * Snapshots status request builder @@ -72,7 +71,7 @@ public class SnapshotsStatusRequestBuilder extends MasterNodeOperationRequestBui * @return this builder */ public SnapshotsStatusRequestBuilder addSnapshots(String... snapshots) { - request.snapshots(ObjectArrays.concat(request.snapshots(), snapshots, String.class)); + request.snapshots(ArrayUtils.concat(request.snapshots(), snapshots)); return this; } } diff --git a/core/src/main/java/org/elasticsearch/action/admin/indices/alias/get/BaseAliasesRequestBuilder.java b/core/src/main/java/org/elasticsearch/action/admin/indices/alias/get/BaseAliasesRequestBuilder.java index da7c505771c..bcfdb0e10d8 100644 --- a/core/src/main/java/org/elasticsearch/action/admin/indices/alias/get/BaseAliasesRequestBuilder.java +++ b/core/src/main/java/org/elasticsearch/action/admin/indices/alias/get/BaseAliasesRequestBuilder.java @@ -19,13 +19,12 @@ package org.elasticsearch.action.admin.indices.alias.get; -import com.google.common.collect.ObjectArrays; import org.elasticsearch.action.Action; import org.elasticsearch.action.ActionResponse; import org.elasticsearch.action.support.IndicesOptions; import org.elasticsearch.action.support.master.MasterNodeReadOperationRequestBuilder; import org.elasticsearch.client.ElasticsearchClient; -import org.elasticsearch.client.IndicesAdminClient; +import org.elasticsearch.common.util.ArrayUtils; /** */ @@ -43,7 +42,7 @@ public abstract class BaseAliasesRequestBuilder { if (this.features == DEFAULT_FEATURES) { return features(features); } else { - return features(ObjectArrays.concat(featuresAsEnums(), features, Feature.class)); + return features(ArrayUtils.concat(features(), features, Feature.class)); } } diff --git a/core/src/main/java/org/elasticsearch/action/admin/indices/mapping/get/GetFieldMappingsRequestBuilder.java b/core/src/main/java/org/elasticsearch/action/admin/indices/mapping/get/GetFieldMappingsRequestBuilder.java index 158e2db4eed..84b16ac2039 100644 --- a/core/src/main/java/org/elasticsearch/action/admin/indices/mapping/get/GetFieldMappingsRequestBuilder.java +++ b/core/src/main/java/org/elasticsearch/action/admin/indices/mapping/get/GetFieldMappingsRequestBuilder.java @@ -19,12 +19,10 @@ package org.elasticsearch.action.admin.indices.mapping.get; -import com.google.common.collect.ObjectArrays; -import org.elasticsearch.action.ActionListener; import org.elasticsearch.action.ActionRequestBuilder; import org.elasticsearch.action.support.IndicesOptions; import org.elasticsearch.client.ElasticsearchClient; -import org.elasticsearch.client.IndicesAdminClient; +import org.elasticsearch.common.util.ArrayUtils; /** A helper class to build {@link GetFieldMappingsRequest} objects */ public class GetFieldMappingsRequestBuilder extends ActionRequestBuilder { @@ -39,7 +37,7 @@ public class GetFieldMappingsRequestBuilder extends ActionRequestBuilder selectedFields; private AggregatedDfs dfs; private Map scoreTerms; - private AtomicLongMap sizes; + private Map sizes = new HashMap<>(); private TFIDFSimilarity similarity; public TermVectorsFilter(Fields termVectorsByField, Fields topLevelFields, Set selectedFields, @Nullable AggregatedDfs dfs) { @@ -64,7 +64,6 @@ public class TermVectorsFilter { this.dfs = dfs; this.scoreTerms = new HashMap<>(); - this.sizes = AtomicLongMap.create(); this.similarity = new DefaultSimilarity(); } @@ -228,10 +227,12 @@ public class TermVectorsFilter { // retain the best terms for quick lookups ScoreTerm scoreTerm; + int count = 0; while ((scoreTerm = queue.pop()) != null) { scoreTerms.put(new Term(scoreTerm.field, scoreTerm.word), scoreTerm); - sizes.incrementAndGet(scoreTerm.field); + count++; } + sizes.put(fieldName, count); } } diff --git a/core/src/main/java/org/elasticsearch/cluster/metadata/AliasOrIndex.java b/core/src/main/java/org/elasticsearch/cluster/metadata/AliasOrIndex.java index e98a046238d..b8de2ea5256 100644 --- a/core/src/main/java/org/elasticsearch/cluster/metadata/AliasOrIndex.java +++ b/core/src/main/java/org/elasticsearch/cluster/metadata/AliasOrIndex.java @@ -19,7 +19,6 @@ package org.elasticsearch.cluster.metadata; -import com.google.common.collect.UnmodifiableIterator; import org.elasticsearch.common.collect.Tuple; import java.util.ArrayList; @@ -106,7 +105,7 @@ public interface AliasOrIndex { return new Iterable>() { @Override public Iterator> iterator() { - return new UnmodifiableIterator>() { + return new Iterator>() { int index = 0; @@ -121,6 +120,11 @@ public interface AliasOrIndex { return new Tuple<>(indexMetaData.getIndex(), indexMetaData.getAliases().get(aliasName)); } + @Override + public final void remove() { + throw new UnsupportedOperationException(); + } + }; } }; diff --git a/core/src/main/java/org/elasticsearch/cluster/metadata/MetaData.java b/core/src/main/java/org/elasticsearch/cluster/metadata/MetaData.java index 8ce7f82f323..3ca3ec39bbd 100644 --- a/core/src/main/java/org/elasticsearch/cluster/metadata/MetaData.java +++ b/core/src/main/java/org/elasticsearch/cluster/metadata/MetaData.java @@ -23,7 +23,6 @@ import com.carrotsearch.hppc.ObjectHashSet; import com.carrotsearch.hppc.cursors.ObjectCursor; import com.carrotsearch.hppc.cursors.ObjectObjectCursor; import com.google.common.collect.ImmutableSet; -import com.google.common.collect.UnmodifiableIterator; import org.apache.lucene.util.CollectionUtil; import org.elasticsearch.cluster.Diff; import org.elasticsearch.cluster.Diffable; @@ -60,18 +59,7 @@ import org.elasticsearch.rest.RestStatus; import org.elasticsearch.search.warmer.IndexWarmersMetaData; import java.io.IOException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.Comparator; -import java.util.EnumSet; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.SortedMap; -import java.util.TreeMap; +import java.util.*; import java.util.stream.Collectors; import static org.elasticsearch.common.settings.Settings.readSettingsFromStream; @@ -569,7 +557,7 @@ public class MetaData implements Iterable, Diffable, Fr } @Override - public UnmodifiableIterator iterator() { + public Iterator iterator() { return indices.valuesIt(); } diff --git a/core/src/main/java/org/elasticsearch/cluster/node/DiscoveryNodes.java b/core/src/main/java/org/elasticsearch/cluster/node/DiscoveryNodes.java index 847173ec1a7..13b64716336 100644 --- a/core/src/main/java/org/elasticsearch/cluster/node/DiscoveryNodes.java +++ b/core/src/main/java/org/elasticsearch/cluster/node/DiscoveryNodes.java @@ -22,7 +22,6 @@ package org.elasticsearch.cluster.node; import com.carrotsearch.hppc.ObjectHashSet; import com.carrotsearch.hppc.cursors.ObjectCursor; import com.carrotsearch.hppc.cursors.ObjectObjectCursor; -import com.google.common.collect.UnmodifiableIterator; import org.elasticsearch.Version; import org.elasticsearch.cluster.AbstractDiffable; import org.elasticsearch.common.Booleans; @@ -34,11 +33,7 @@ import org.elasticsearch.common.regex.Regex; import org.elasticsearch.common.transport.TransportAddress; import java.io.IOException; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Map; -import java.util.Set; +import java.util.*; /** * This class holds all {@link DiscoveryNode} in the cluster and provides convenience methods to @@ -69,7 +64,7 @@ public class DiscoveryNodes extends AbstractDiffable implements } @Override - public UnmodifiableIterator iterator() { + public Iterator iterator() { return nodes.valuesIt(); } diff --git a/core/src/main/java/org/elasticsearch/cluster/routing/IndexRoutingTable.java b/core/src/main/java/org/elasticsearch/cluster/routing/IndexRoutingTable.java index a909b5550fe..062c7b4035d 100644 --- a/core/src/main/java/org/elasticsearch/cluster/routing/IndexRoutingTable.java +++ b/core/src/main/java/org/elasticsearch/cluster/routing/IndexRoutingTable.java @@ -22,7 +22,6 @@ package org.elasticsearch.cluster.routing; import com.carrotsearch.hppc.IntSet; import com.carrotsearch.hppc.cursors.IntCursor; import com.carrotsearch.hppc.cursors.IntObjectCursor; -import com.google.common.collect.UnmodifiableIterator; import org.apache.lucene.util.CollectionUtil; import org.elasticsearch.cluster.AbstractDiffable; import org.elasticsearch.cluster.metadata.IndexMetaData; @@ -33,12 +32,7 @@ import org.elasticsearch.common.io.stream.StreamOutput; import org.elasticsearch.index.shard.ShardId; import java.io.IOException; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Comparator; -import java.util.HashSet; -import java.util.List; -import java.util.Set; +import java.util.*; import java.util.concurrent.ThreadLocalRandom; /** @@ -163,7 +157,7 @@ public class IndexRoutingTable extends AbstractDiffable imple } @Override - public UnmodifiableIterator iterator() { + public Iterator iterator() { return shards.valuesIt(); } diff --git a/core/src/main/java/org/elasticsearch/cluster/routing/RoutingTable.java b/core/src/main/java/org/elasticsearch/cluster/routing/RoutingTable.java index 07fe33acad9..32c50b3fd1f 100644 --- a/core/src/main/java/org/elasticsearch/cluster/routing/RoutingTable.java +++ b/core/src/main/java/org/elasticsearch/cluster/routing/RoutingTable.java @@ -21,7 +21,6 @@ package org.elasticsearch.cluster.routing; import com.carrotsearch.hppc.IntSet; import com.google.common.collect.ImmutableMap; -import com.google.common.collect.UnmodifiableIterator; import org.elasticsearch.cluster.Diff; import org.elasticsearch.cluster.Diffable; import org.elasticsearch.cluster.DiffableUtils; @@ -68,7 +67,7 @@ public class RoutingTable implements Iterable, Diffable iterator() { + public Iterator iterator() { return indicesRouting.values().iterator(); } diff --git a/core/src/main/java/org/elasticsearch/common/cli/CliToolConfig.java b/core/src/main/java/org/elasticsearch/common/cli/CliToolConfig.java index 2e3d755793e..d0ba897b33d 100644 --- a/core/src/main/java/org/elasticsearch/common/cli/CliToolConfig.java +++ b/core/src/main/java/org/elasticsearch/common/cli/CliToolConfig.java @@ -19,13 +19,14 @@ package org.elasticsearch.common.cli; -import com.google.common.collect.ImmutableMap; -import org.apache.commons.cli.CommandLine; import org.apache.commons.cli.Option; import org.apache.commons.cli.OptionGroup; import org.apache.commons.cli.Options; import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; /** * @@ -38,18 +39,18 @@ public class CliToolConfig { private final Class toolType; private final String name; - private final ImmutableMap cmds; + private final Map cmds; private static final HelpPrinter helpPrinter = new HelpPrinter(); private CliToolConfig(String name, Class toolType, Cmd[] cmds) { this.name = name; this.toolType = toolType; - ImmutableMap.Builder cmdsBuilder = ImmutableMap.builder(); + final Map cmdsMapping = new HashMap<>(); for (int i = 0; i < cmds.length; i++) { - cmdsBuilder.put(cmds[i].name, cmds[i]); + cmdsMapping.put(cmds[i].name, cmds[i]); } - this.cmds = cmdsBuilder.build(); + this.cmds = Collections.unmodifiableMap(cmdsMapping); } public boolean isSingle() { diff --git a/core/src/main/java/org/elasticsearch/common/collect/CopyOnWriteHashMap.java b/core/src/main/java/org/elasticsearch/common/collect/CopyOnWriteHashMap.java index eab20aaa23b..c0114480498 100644 --- a/core/src/main/java/org/elasticsearch/common/collect/CopyOnWriteHashMap.java +++ b/core/src/main/java/org/elasticsearch/common/collect/CopyOnWriteHashMap.java @@ -18,8 +18,6 @@ */ package org.elasticsearch.common.collect; - -import com.google.common.collect.UnmodifiableIterator; import org.apache.lucene.util.mutable.MutableValueInt; import java.lang.reflect.Array; @@ -420,7 +418,7 @@ public final class CopyOnWriteHashMap extends AbstractMap { } - private static class EntryIterator extends UnmodifiableIterator> { + private static class EntryIterator implements Iterator> { private final Deque> entries; private final Deque> nodes; @@ -448,6 +446,11 @@ public final class CopyOnWriteHashMap extends AbstractMap { return entries.pop(); } + @Override + public final void remove() { + throw new UnsupportedOperationException(); + } + } private final InnerNode root; diff --git a/core/src/main/java/org/elasticsearch/common/collect/ImmutableOpenIntMap.java b/core/src/main/java/org/elasticsearch/common/collect/ImmutableOpenIntMap.java index eda83a1505b..ccadbcf0a4a 100644 --- a/core/src/main/java/org/elasticsearch/common/collect/ImmutableOpenIntMap.java +++ b/core/src/main/java/org/elasticsearch/common/collect/ImmutableOpenIntMap.java @@ -26,7 +26,6 @@ import com.carrotsearch.hppc.cursors.ObjectCursor; import com.carrotsearch.hppc.predicates.IntObjectPredicate; import com.carrotsearch.hppc.predicates.IntPredicate; import com.carrotsearch.hppc.procedures.IntObjectProcedure; -import com.google.common.collect.UnmodifiableIterator; import java.util.Iterator; import java.util.Map; @@ -113,9 +112,9 @@ public final class ImmutableOpenIntMap implements Iterable keysIt() { + public Iterator keysIt() { final Iterator iterator = map.keys().iterator(); - return new UnmodifiableIterator() { + return new Iterator() { @Override public boolean hasNext() { return iterator.hasNext(); @@ -125,6 +124,11 @@ public final class ImmutableOpenIntMap implements Iterable implements Iterable valuesIt() { + public Iterator valuesIt() { final Iterator> iterator = map.values().iterator(); - return new UnmodifiableIterator() { + return new Iterator() { @Override public boolean hasNext() { return iterator.hasNext(); @@ -150,6 +154,11 @@ public final class ImmutableOpenIntMap implements Iterable implements Iterable keysIt() { + public Iterator keysIt() { final Iterator> iterator = map.keys().iterator(); - return new UnmodifiableIterator() { + return new Iterator() { @Override - public boolean hasNext() { - return iterator.hasNext(); - } + public boolean hasNext() { return iterator.hasNext(); } @Override public KType next() { return iterator.next().value; } + + @Override + public final void remove() { + throw new UnsupportedOperationException(); + } }; } @@ -145,18 +147,21 @@ public final class ImmutableOpenMap implements Iterable valuesIt() { + public Iterator valuesIt() { final Iterator> iterator = map.values().iterator(); - return new UnmodifiableIterator() { + return new Iterator() { @Override - public boolean hasNext() { - return iterator.hasNext(); - } + public boolean hasNext() { return iterator.hasNext(); } @Override public VType next() { return iterator.next().value; } + + @Override + public final void remove() { + throw new UnsupportedOperationException(); + } }; } diff --git a/core/src/main/java/org/elasticsearch/common/lucene/ShardCoreKeyMap.java b/core/src/main/java/org/elasticsearch/common/lucene/ShardCoreKeyMap.java index 0d9270edaff..c405de129a5 100644 --- a/core/src/main/java/org/elasticsearch/common/lucene/ShardCoreKeyMap.java +++ b/core/src/main/java/org/elasticsearch/common/lucene/ShardCoreKeyMap.java @@ -19,19 +19,11 @@ package org.elasticsearch.common.lucene; -import com.google.common.collect.HashMultimap; -import com.google.common.collect.ImmutableSet; -import com.google.common.collect.Multimap; - import org.apache.lucene.index.LeafReader; -import org.apache.lucene.index.LeafReader.CoreClosedListener; import org.elasticsearch.index.shard.ShardId; import org.elasticsearch.index.shard.ShardUtils; -import java.io.IOException; -import java.util.IdentityHashMap; -import java.util.Map; -import java.util.Set; +import java.util.*; /** * A map between segment core cache keys and the shard that these segments @@ -47,16 +39,16 @@ import java.util.Set; public final class ShardCoreKeyMap { private final Map coreKeyToShard; - private final Multimap indexToCoreKey; + private final Map> indexToCoreKey; public ShardCoreKeyMap() { coreKeyToShard = new IdentityHashMap<>(); - indexToCoreKey = HashMultimap.create(); + indexToCoreKey = new HashMap<>(); } /** * Register a {@link LeafReader}. This is necessary so that the core cache - * key of this reader can be found later using {@link #getCoreCacheKeys(ShardId)}. + * key of this reader can be found later using {@link #getCoreKeysForIndex(String)}. */ public void add(LeafReader reader) { final ShardId shardId = ShardUtils.extractShardId(reader); @@ -67,15 +59,22 @@ public final class ShardCoreKeyMap { final String index = shardId.getIndex(); synchronized (this) { if (coreKeyToShard.put(coreKey, shardId) == null) { - final boolean added = indexToCoreKey.put(index, coreKey); + Set objects = indexToCoreKey.get(index); + if (objects == null) { + objects = new HashSet<>(); + indexToCoreKey.put(index, objects); + } + final boolean added = objects.add(coreKey); assert added; - reader.addCoreClosedListener(new CoreClosedListener() { - @Override - public void onClose(Object ownerCoreCacheKey) throws IOException { - assert coreKey == ownerCoreCacheKey; - synchronized (ShardCoreKeyMap.this) { - coreKeyToShard.remove(ownerCoreCacheKey); - indexToCoreKey.remove(index, coreKey); + reader.addCoreClosedListener(ownerCoreCacheKey -> { + assert coreKey == ownerCoreCacheKey; + synchronized (ShardCoreKeyMap.this) { + coreKeyToShard.remove(ownerCoreCacheKey); + final Set coreKeys = indexToCoreKey.get(index); + final boolean removed = coreKeys.remove(coreKey); + assert removed; + if (coreKeys.isEmpty()) { + indexToCoreKey.remove(index); } } }); @@ -95,15 +94,35 @@ public final class ShardCoreKeyMap { * Get the set of core cache keys associated with the given index. */ public synchronized Set getCoreKeysForIndex(String index) { - return ImmutableSet.copyOf(indexToCoreKey.get(index)); + final Set objects = indexToCoreKey.get(index); + if (objects == null) { + return Collections.emptySet(); + } + // we have to copy otherwise we risk ConcurrentModificationException + return Collections.unmodifiableSet(new HashSet<>(objects)); } /** * Return the number of tracked segments. */ public synchronized int size() { - assert indexToCoreKey.size() == coreKeyToShard.size(); + assert assertSize(); return coreKeyToShard.size(); } + private synchronized boolean assertSize() { + // this is heavy and should only used in assertions + boolean assertionsEnabled = false; + assert assertionsEnabled = true; + if (assertionsEnabled == false) { + throw new AssertionError("only run this if assertions are enabled"); + } + Collection> values = indexToCoreKey.values(); + int size = 0; + for (Set value : values) { + size += value.size(); + } + return size == coreKeyToShard.size(); + } + } diff --git a/core/src/main/java/org/elasticsearch/common/util/ArrayUtils.java b/core/src/main/java/org/elasticsearch/common/util/ArrayUtils.java index 053c9b547ae..bb8442efa08 100644 --- a/core/src/main/java/org/elasticsearch/common/util/ArrayUtils.java +++ b/core/src/main/java/org/elasticsearch/common/util/ArrayUtils.java @@ -19,6 +19,7 @@ package org.elasticsearch.common.util; +import java.lang.reflect.Array; import java.util.Arrays; /** @@ -69,4 +70,22 @@ public class ArrayUtils { } return index; } + + /** + * Concatenates 2 arrays + */ + public static String[] concat(String[] one, String[] other) { + return concat(one, other, String.class); + } + + /** + * Concatenates 2 arrays + */ + public static T[] concat(T[] one, T[] other, Class clazz) { + T[] target = (T[]) Array.newInstance(clazz, one.length + other.length); + System.arraycopy(one, 0, target, 0, one.length); + System.arraycopy(other, 0, target, one.length, other.length); + return target; + } + } diff --git a/core/src/main/java/org/elasticsearch/common/util/LongObjectPagedHashMap.java b/core/src/main/java/org/elasticsearch/common/util/LongObjectPagedHashMap.java index 7949989c2a0..63b7b23a62b 100644 --- a/core/src/main/java/org/elasticsearch/common/util/LongObjectPagedHashMap.java +++ b/core/src/main/java/org/elasticsearch/common/util/LongObjectPagedHashMap.java @@ -20,7 +20,6 @@ package org.elasticsearch.common.util; -import com.google.common.collect.UnmodifiableIterator; import org.elasticsearch.ElasticsearchException; import org.elasticsearch.common.lease.Releasables; @@ -125,7 +124,7 @@ public class LongObjectPagedHashMap extends AbstractPagedHashMap implements I @Override public Iterator> iterator() { - return new UnmodifiableIterator>() { + return new Iterator>() { boolean cached; final Cursor cursor; @@ -162,6 +161,11 @@ public class LongObjectPagedHashMap extends AbstractPagedHashMap implements I return cursor; } + @Override + public final void remove() { + throw new UnsupportedOperationException(); + } + }; } diff --git a/core/src/main/java/org/elasticsearch/http/HttpServer.java b/core/src/main/java/org/elasticsearch/http/HttpServer.java index 0fab142ac18..168ed0669e8 100644 --- a/core/src/main/java/org/elasticsearch/http/HttpServer.java +++ b/core/src/main/java/org/elasticsearch/http/HttpServer.java @@ -20,16 +20,17 @@ package org.elasticsearch.http; import com.google.common.collect.ImmutableMap; -import com.google.common.io.ByteStreams; import org.elasticsearch.common.component.AbstractLifecycleComponent; import org.elasticsearch.common.inject.Inject; import org.elasticsearch.common.io.FileSystemUtils; +import org.elasticsearch.common.io.Streams; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.env.Environment; import org.elasticsearch.node.service.NodeService; import org.elasticsearch.rest.*; +import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.nio.file.*; @@ -141,8 +142,9 @@ public class HttpServer extends AbstractLifecycleComponent { if (request.method() == RestRequest.Method.GET) { try { try (InputStream stream = getClass().getResourceAsStream("/config/favicon.ico")) { - byte[] content = ByteStreams.toByteArray(stream); - BytesRestResponse restResponse = new BytesRestResponse(RestStatus.OK, "image/x-icon", content); + ByteArrayOutputStream out = new ByteArrayOutputStream(); + Streams.copy(stream, out); + BytesRestResponse restResponse = new BytesRestResponse(RestStatus.OK, "image/x-icon", out.toByteArray()); channel.sendResponse(restResponse); } } catch (IOException e) { diff --git a/core/src/main/java/org/elasticsearch/index/mapper/internal/FieldNamesFieldMapper.java b/core/src/main/java/org/elasticsearch/index/mapper/internal/FieldNamesFieldMapper.java index ac2ef99c20b..500f973e0ea 100644 --- a/core/src/main/java/org/elasticsearch/index/mapper/internal/FieldNamesFieldMapper.java +++ b/core/src/main/java/org/elasticsearch/index/mapper/internal/FieldNamesFieldMapper.java @@ -19,7 +19,6 @@ package org.elasticsearch.index.mapper.internal; -import com.google.common.collect.UnmodifiableIterator; import org.apache.lucene.document.Field; import org.apache.lucene.index.IndexOptions; import org.apache.lucene.index.IndexableField; @@ -240,7 +239,7 @@ public class FieldNamesFieldMapper extends MetadataFieldMapper { return new Iterable() { @Override public Iterator iterator() { - return new UnmodifiableIterator() { + return new Iterator() { int endIndex = nextEndIndex(0); @@ -263,6 +262,11 @@ public class FieldNamesFieldMapper extends MetadataFieldMapper { return result; } + @Override + public final void remove() { + throw new UnsupportedOperationException(); + } + }; } }; diff --git a/core/src/main/java/org/elasticsearch/index/query/functionscore/random/RandomScoreFunctionParser.java b/core/src/main/java/org/elasticsearch/index/query/functionscore/random/RandomScoreFunctionParser.java index 124336c5bbe..6d8f72982f3 100644 --- a/core/src/main/java/org/elasticsearch/index/query/functionscore/random/RandomScoreFunctionParser.java +++ b/core/src/main/java/org/elasticsearch/index/query/functionscore/random/RandomScoreFunctionParser.java @@ -20,14 +20,12 @@ package org.elasticsearch.index.query.functionscore.random; -import com.google.common.primitives.Longs; import org.elasticsearch.common.inject.Inject; import org.elasticsearch.common.lucene.search.function.RandomScoreFunction; import org.elasticsearch.common.lucene.search.function.ScoreFunction; import org.elasticsearch.common.xcontent.XContentParser; import org.elasticsearch.index.fielddata.IndexFieldData; -import org.elasticsearch.index.mapper.FieldMapper; import org.elasticsearch.index.mapper.MappedFieldType; import org.elasticsearch.index.query.QueryParseContext; import org.elasticsearch.index.query.QueryParsingException; @@ -66,7 +64,7 @@ public class RandomScoreFunctionParser implements ScoreFunctionParser { if (parser.numberType() == XContentParser.NumberType.INT) { seed = parser.intValue(); } else if (parser.numberType() == XContentParser.NumberType.LONG) { - seed = Longs.hashCode(parser.longValue()); + seed = hash(parser.longValue()); } else { throw new QueryParsingException(parseContext, "random_score seed must be an int, long or string, not '" + token.toString() + "'"); @@ -90,7 +88,7 @@ public class RandomScoreFunctionParser implements ScoreFunctionParser { } if (seed == -1) { - seed = Longs.hashCode(parseContext.nowInMillis()); + seed = hash(parseContext.nowInMillis()); } final ShardId shardId = SearchContext.current().indexShard().shardId(); final int salt = (shardId.index().name().hashCode() << 10) | shardId.id(); @@ -98,4 +96,8 @@ public class RandomScoreFunctionParser implements ScoreFunctionParser { return new RandomScoreFunction(seed, salt, uidFieldData); } + + private static final int hash(long value) { + return (int) (value ^ (value >>> 32)); + } } \ No newline at end of file diff --git a/core/src/main/java/org/elasticsearch/repositories/blobstore/BlobStoreRepository.java b/core/src/main/java/org/elasticsearch/repositories/blobstore/BlobStoreRepository.java index 4b2c608f1f4..456457861df 100644 --- a/core/src/main/java/org/elasticsearch/repositories/blobstore/BlobStoreRepository.java +++ b/core/src/main/java/org/elasticsearch/repositories/blobstore/BlobStoreRepository.java @@ -19,7 +19,6 @@ package org.elasticsearch.repositories.blobstore; -import com.google.common.io.ByteStreams; import org.apache.lucene.store.RateLimiter; import org.elasticsearch.ElasticsearchParseException; import org.elasticsearch.Version; @@ -36,6 +35,7 @@ import org.elasticsearch.common.bytes.BytesArray; import org.elasticsearch.common.bytes.BytesReference; import org.elasticsearch.common.component.AbstractLifecycleComponent; import org.elasticsearch.common.compress.NotXContentException; +import org.elasticsearch.common.io.Streams; import org.elasticsearch.common.io.stream.BytesStreamOutput; import org.elasticsearch.common.io.stream.OutputStreamStreamOutput; import org.elasticsearch.common.io.stream.StreamOutput; @@ -66,6 +66,7 @@ import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; +import java.nio.file.Files; import java.nio.file.NoSuchFileException; import java.util.ArrayList; import java.util.Collections; @@ -590,9 +591,10 @@ public abstract class BlobStoreRepository extends AbstractLifecycleComponent readSnapshotList() throws IOException { try (InputStream blob = snapshotsBlobContainer.readBlob(SNAPSHOTS_FILE)) { - final byte[] data = ByteStreams.toByteArray(blob); + BytesStreamOutput out = new BytesStreamOutput(); + Streams.copy(blob, out); ArrayList snapshots = new ArrayList<>(); - try (XContentParser parser = XContentHelper.createParser(new BytesArray(data))) { + try (XContentParser parser = XContentHelper.createParser(out.bytes())) { if (parser.nextToken() == XContentParser.Token.START_OBJECT) { if (parser.nextToken() == XContentParser.Token.FIELD_NAME) { String currentFieldName = parser.currentName(); diff --git a/core/src/main/java/org/elasticsearch/repositories/blobstore/ChecksumBlobStoreFormat.java b/core/src/main/java/org/elasticsearch/repositories/blobstore/ChecksumBlobStoreFormat.java index 718e9da7337..9109dcd84bc 100644 --- a/core/src/main/java/org/elasticsearch/repositories/blobstore/ChecksumBlobStoreFormat.java +++ b/core/src/main/java/org/elasticsearch/repositories/blobstore/ChecksumBlobStoreFormat.java @@ -18,7 +18,6 @@ */ package org.elasticsearch.repositories.blobstore; -import com.google.common.io.ByteStreams; import org.apache.lucene.codecs.CodecUtil; import org.apache.lucene.index.CorruptIndexException; import org.apache.lucene.index.IndexFormatTooNewException; @@ -29,6 +28,7 @@ import org.elasticsearch.common.blobstore.BlobContainer; import org.elasticsearch.common.bytes.BytesArray; import org.elasticsearch.common.bytes.BytesReference; import org.elasticsearch.common.compress.CompressorFactory; +import org.elasticsearch.common.io.Streams; import org.elasticsearch.common.io.stream.BytesStreamOutput; import org.elasticsearch.common.io.stream.StreamOutput; import org.elasticsearch.common.lucene.store.ByteArrayIndexInput; @@ -93,7 +93,9 @@ public class ChecksumBlobStoreFormat extends BlobStoreForm */ public T readBlob(BlobContainer blobContainer, String blobName) throws IOException { try (InputStream inputStream = blobContainer.readBlob(blobName)) { - byte[] bytes = ByteStreams.toByteArray(inputStream); + ByteArrayOutputStream out = new ByteArrayOutputStream(); + Streams.copy(inputStream, out); + final byte[] bytes = out.toByteArray(); final String resourceDesc = "ChecksumBlobStoreFormat.readBlob(blob=\"" + blobName + "\")"; try (ByteArrayIndexInput indexInput = new ByteArrayIndexInput(resourceDesc, bytes)) { CodecUtil.checksumEntireFile(indexInput); diff --git a/core/src/main/java/org/elasticsearch/repositories/blobstore/LegacyBlobStoreFormat.java b/core/src/main/java/org/elasticsearch/repositories/blobstore/LegacyBlobStoreFormat.java index f9d5c98253c..a0c956dea45 100644 --- a/core/src/main/java/org/elasticsearch/repositories/blobstore/LegacyBlobStoreFormat.java +++ b/core/src/main/java/org/elasticsearch/repositories/blobstore/LegacyBlobStoreFormat.java @@ -18,10 +18,10 @@ */ package org.elasticsearch.repositories.blobstore; -import com.google.common.io.ByteStreams; import org.elasticsearch.common.ParseFieldMatcher; import org.elasticsearch.common.blobstore.BlobContainer; -import org.elasticsearch.common.bytes.BytesArray; +import org.elasticsearch.common.io.Streams; +import org.elasticsearch.common.io.stream.BytesStreamOutput; import org.elasticsearch.common.xcontent.FromXContentBuilder; import org.elasticsearch.common.xcontent.ToXContent; @@ -53,7 +53,9 @@ public class LegacyBlobStoreFormat extends BlobStoreFormat */ public T readBlob(BlobContainer blobContainer, String blobName) throws IOException { try (InputStream inputStream = blobContainer.readBlob(blobName)) { - return read(new BytesArray(ByteStreams.toByteArray(inputStream))); + BytesStreamOutput out = new BytesStreamOutput(); + Streams.copy(inputStream, out); + return read(out.bytes()); } } } diff --git a/core/src/main/java/org/elasticsearch/search/aggregations/bucket/terms/InternalTerms.java b/core/src/main/java/org/elasticsearch/search/aggregations/bucket/terms/InternalTerms.java index 681d18651d8..31285d20f8e 100644 --- a/core/src/main/java/org/elasticsearch/search/aggregations/bucket/terms/InternalTerms.java +++ b/core/src/main/java/org/elasticsearch/search/aggregations/bucket/terms/InternalTerms.java @@ -18,8 +18,6 @@ */ package org.elasticsearch.search.aggregations.bucket.terms; -import com.google.common.collect.ArrayListMultimap; -import com.google.common.collect.Multimap; import org.elasticsearch.common.io.stream.Streamable; import org.elasticsearch.common.xcontent.ToXContent; import org.elasticsearch.search.aggregations.AggregationExecutionException; @@ -33,7 +31,6 @@ import org.elasticsearch.search.aggregations.support.format.ValueFormatter; import java.util.ArrayList; import java.util.Arrays; -import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -167,7 +164,7 @@ public abstract class InternalTerms aggregations, ReduceContext reduceContext) { - Multimap buckets = ArrayListMultimap.create(); + Map> buckets = new HashMap<>(); long sumDocCountError = 0; long otherDocCount = 0; InternalTerms referenceTerms = null; @@ -208,14 +205,18 @@ public abstract class InternalTerms bucketList = buckets.get(bucket.getKey()); + if (bucketList == null) { + bucketList = new ArrayList<>(); + buckets.put(bucket.getKey(), bucketList); + } + bucketList.add(bucket); } } final int size = Math.min(requiredSize, buckets.size()); BucketPriorityQueue ordered = new BucketPriorityQueue(size, order.comparator(null)); - for (Collection l : buckets.asMap().values()) { - List sameTermBuckets = (List) l; // cast is ok according to javadocs + for (List sameTermBuckets : buckets.values()) { final Bucket b = sameTermBuckets.get(0).reduce(sameTermBuckets, reduceContext); if (b.docCountError != -1) { if (sumDocCountError == -1) { diff --git a/core/src/main/java/org/elasticsearch/search/aggregations/metrics/percentiles/hdr/InternalHDRPercentileRanks.java b/core/src/main/java/org/elasticsearch/search/aggregations/metrics/percentiles/hdr/InternalHDRPercentileRanks.java index 37acb5313b5..baa2325a734 100644 --- a/core/src/main/java/org/elasticsearch/search/aggregations/metrics/percentiles/hdr/InternalHDRPercentileRanks.java +++ b/core/src/main/java/org/elasticsearch/search/aggregations/metrics/percentiles/hdr/InternalHDRPercentileRanks.java @@ -18,8 +18,6 @@ */ package org.elasticsearch.search.aggregations.metrics.percentiles.hdr; -import com.google.common.collect.UnmodifiableIterator; - import org.HdrHistogram.DoubleHistogram; import org.elasticsearch.common.io.stream.StreamInput; import org.elasticsearch.search.aggregations.AggregationStreams; @@ -106,7 +104,7 @@ public class InternalHDRPercentileRanks extends AbstractInternalHDRPercentiles i return percentileRank; } - public static class Iter extends UnmodifiableIterator { + public static class Iter implements Iterator { private final double[] values; private final DoubleHistogram state; @@ -129,5 +127,10 @@ public class InternalHDRPercentileRanks extends AbstractInternalHDRPercentiles i ++i; return next; } + + @Override + public final void remove() { + throw new UnsupportedOperationException(); + } } } diff --git a/core/src/main/java/org/elasticsearch/search/aggregations/metrics/percentiles/hdr/InternalHDRPercentiles.java b/core/src/main/java/org/elasticsearch/search/aggregations/metrics/percentiles/hdr/InternalHDRPercentiles.java index 4c475ed46a8..b7b126f0a6b 100644 --- a/core/src/main/java/org/elasticsearch/search/aggregations/metrics/percentiles/hdr/InternalHDRPercentiles.java +++ b/core/src/main/java/org/elasticsearch/search/aggregations/metrics/percentiles/hdr/InternalHDRPercentiles.java @@ -18,8 +18,6 @@ */ package org.elasticsearch.search.aggregations.metrics.percentiles.hdr; -import com.google.common.collect.UnmodifiableIterator; - import org.HdrHistogram.DoubleHistogram; import org.elasticsearch.common.io.stream.StreamInput; import org.elasticsearch.search.aggregations.AggregationStreams; @@ -96,7 +94,7 @@ public class InternalHDRPercentiles extends AbstractInternalHDRPercentiles imple return TYPE; } - public static class Iter extends UnmodifiableIterator { + public static class Iter implements Iterator { private final double[] percents; private final DoubleHistogram state; @@ -119,5 +117,10 @@ public class InternalHDRPercentiles extends AbstractInternalHDRPercentiles imple ++i; return next; } + + @Override + public final void remove() { + throw new UnsupportedOperationException(); + } } } diff --git a/core/src/main/java/org/elasticsearch/search/aggregations/metrics/percentiles/tdigest/InternalTDigestPercentileRanks.java b/core/src/main/java/org/elasticsearch/search/aggregations/metrics/percentiles/tdigest/InternalTDigestPercentileRanks.java index bff0dcf2664..61deecb279d 100644 --- a/core/src/main/java/org/elasticsearch/search/aggregations/metrics/percentiles/tdigest/InternalTDigestPercentileRanks.java +++ b/core/src/main/java/org/elasticsearch/search/aggregations/metrics/percentiles/tdigest/InternalTDigestPercentileRanks.java @@ -18,8 +18,6 @@ */ package org.elasticsearch.search.aggregations.metrics.percentiles.tdigest; -import com.google.common.collect.UnmodifiableIterator; - import org.elasticsearch.common.io.stream.StreamInput; import org.elasticsearch.search.aggregations.AggregationStreams; import org.elasticsearch.search.aggregations.metrics.percentiles.InternalPercentile; @@ -102,7 +100,7 @@ public class InternalTDigestPercentileRanks extends AbstractInternalTDigestPerce return percentileRank * 100; } - public static class Iter extends UnmodifiableIterator { + public static class Iter implements Iterator { private final double[] values; private final TDigestState state; @@ -125,5 +123,10 @@ public class InternalTDigestPercentileRanks extends AbstractInternalTDigestPerce ++i; return next; } + + @Override + public final void remove() { + throw new UnsupportedOperationException(); + } } } diff --git a/core/src/main/java/org/elasticsearch/search/aggregations/metrics/percentiles/tdigest/InternalTDigestPercentiles.java b/core/src/main/java/org/elasticsearch/search/aggregations/metrics/percentiles/tdigest/InternalTDigestPercentiles.java index 564e9d538ef..878ef559ba4 100644 --- a/core/src/main/java/org/elasticsearch/search/aggregations/metrics/percentiles/tdigest/InternalTDigestPercentiles.java +++ b/core/src/main/java/org/elasticsearch/search/aggregations/metrics/percentiles/tdigest/InternalTDigestPercentiles.java @@ -18,8 +18,6 @@ */ package org.elasticsearch.search.aggregations.metrics.percentiles.tdigest; -import com.google.common.collect.UnmodifiableIterator; - import org.elasticsearch.common.io.stream.StreamInput; import org.elasticsearch.search.aggregations.AggregationStreams; import org.elasticsearch.search.aggregations.metrics.percentiles.InternalPercentile; @@ -92,7 +90,7 @@ public class InternalTDigestPercentiles extends AbstractInternalTDigestPercentil return TYPE; } - public static class Iter extends UnmodifiableIterator { + public static class Iter implements Iterator { private final double[] percents; private final TDigestState state; @@ -115,5 +113,10 @@ public class InternalTDigestPercentiles extends AbstractInternalTDigestPercentil ++i; return next; } + + @Override + public final void remove() { + throw new UnsupportedOperationException(); + } } } diff --git a/core/src/main/java/org/elasticsearch/search/aggregations/pipeline/bucketmetrics/percentile/InternalPercentilesBucket.java b/core/src/main/java/org/elasticsearch/search/aggregations/pipeline/bucketmetrics/percentile/InternalPercentilesBucket.java index 10b1481e8d6..6a11c6fafd7 100644 --- a/core/src/main/java/org/elasticsearch/search/aggregations/pipeline/bucketmetrics/percentile/InternalPercentilesBucket.java +++ b/core/src/main/java/org/elasticsearch/search/aggregations/pipeline/bucketmetrics/percentile/InternalPercentilesBucket.java @@ -19,7 +19,6 @@ package org.elasticsearch.search.aggregations.pipeline.bucketmetrics.percentile; -import com.google.common.collect.UnmodifiableIterator; import org.elasticsearch.common.io.stream.StreamInput; import org.elasticsearch.common.io.stream.StreamOutput; import org.elasticsearch.common.xcontent.XContentBuilder; @@ -136,7 +135,7 @@ public class InternalPercentilesBucket extends InternalNumericMetricsAggregation return builder; } - public static class Iter extends UnmodifiableIterator { + public static class Iter implements Iterator { private final double[] percents; private final double[] percentiles; @@ -159,5 +158,10 @@ public class InternalPercentilesBucket extends InternalNumericMetricsAggregation ++i; return next; } + + @Override + public final void remove() { + throw new UnsupportedOperationException(); + } } } diff --git a/core/src/main/java/org/elasticsearch/search/internal/SearchContext.java b/core/src/main/java/org/elasticsearch/search/internal/SearchContext.java index 34f1d5a8f45..6402d5e53d8 100644 --- a/core/src/main/java/org/elasticsearch/search/internal/SearchContext.java +++ b/core/src/main/java/org/elasticsearch/search/internal/SearchContext.java @@ -18,8 +18,6 @@ */ package org.elasticsearch.search.internal; -import com.google.common.collect.Multimap; -import com.google.common.collect.MultimapBuilder; import org.apache.lucene.search.Collector; import org.apache.lucene.search.Query; @@ -62,10 +60,7 @@ import org.elasticsearch.search.query.QuerySearchResult; import org.elasticsearch.search.rescore.RescoreSearchContext; import org.elasticsearch.search.suggest.SuggestionSearchContext; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.concurrent.atomic.AtomicBoolean; public abstract class SearchContext extends DelegatingHasContextAndHeaders implements Releasable { @@ -87,7 +82,7 @@ public abstract class SearchContext extends DelegatingHasContextAndHeaders imple return current.get(); } - private Multimap clearables = null; + private Map> clearables = null; private final AtomicBoolean closed = new AtomicBoolean(false); protected final ParseFieldMatcher parseFieldMatcher; @@ -316,19 +311,27 @@ public abstract class SearchContext extends DelegatingHasContextAndHeaders imple */ public void addReleasable(Releasable releasable, Lifetime lifetime) { if (clearables == null) { - clearables = MultimapBuilder.enumKeys(Lifetime.class).arrayListValues().build(); + clearables = new HashMap<>(); } - clearables.put(lifetime, releasable); + List releasables = clearables.get(lifetime); + if (releasables == null) { + releasables = new ArrayList<>(); + clearables.put(lifetime, releasables); + } + releasables.add(releasable); } public void clearReleasables(Lifetime lifetime) { if (clearables != null) { - List> releasables = new ArrayList<>(); + List>releasables = new ArrayList<>(); for (Lifetime lc : Lifetime.values()) { if (lc.compareTo(lifetime) > 0) { break; } - releasables.add(clearables.removeAll(lc)); + List remove = clearables.remove(lc); + if (remove != null) { + releasables.add(remove); + } } Releasables.close(Iterables.flatten(releasables)); } diff --git a/core/src/test/java/org/elasticsearch/common/util/ArrayUtilsTests.java b/core/src/test/java/org/elasticsearch/common/util/ArrayUtilsTests.java index 0c7038e8cd1..735fda16797 100644 --- a/core/src/test/java/org/elasticsearch/common/util/ArrayUtilsTests.java +++ b/core/src/test/java/org/elasticsearch/common/util/ArrayUtilsTests.java @@ -19,9 +19,12 @@ package org.elasticsearch.common.util; +import org.apache.lucene.util.ArrayUtil; import org.elasticsearch.test.ESTestCase; import org.junit.Test; +import java.lang.reflect.Array; +import java.util.ArrayList; import java.util.Arrays; import java.util.BitSet; @@ -90,4 +93,22 @@ public class ArrayUtilsTests extends ESTestCase { return min + delta; } + public void testConcat() { + assertArrayEquals(new String[]{"a", "b", "c", "d"}, ArrayUtils.concat(new String[]{"a", "b"}, new String[]{"c", "d"})); + int firstSize = randomIntBetween(0, 10); + String[] first = new String[firstSize]; + ArrayList sourceOfTruth = new ArrayList<>(); + for (int i = 0; i < firstSize; i++) { + first[i] = randomRealisticUnicodeOfCodepointLengthBetween(0,10); + sourceOfTruth.add(first[i]); + } + int secondSize = randomIntBetween(0, 10); + String[] second = new String[secondSize]; + for (int i = 0; i < secondSize; i++) { + second[i] = randomRealisticUnicodeOfCodepointLengthBetween(0, 10); + sourceOfTruth.add(second[i]); + } + assertArrayEquals(sourceOfTruth.toArray(new String[0]), ArrayUtils.concat(first, second)); + } + } diff --git a/core/src/test/java/org/elasticsearch/plugins/PluginManagerUnitTests.java b/core/src/test/java/org/elasticsearch/plugins/PluginManagerUnitTests.java index cf44a7614dc..c1ae4c22ea2 100644 --- a/core/src/test/java/org/elasticsearch/plugins/PluginManagerUnitTests.java +++ b/core/src/test/java/org/elasticsearch/plugins/PluginManagerUnitTests.java @@ -19,7 +19,6 @@ package org.elasticsearch.plugins; -import com.google.common.io.Files; import org.elasticsearch.Build; import org.elasticsearch.Version; import org.elasticsearch.common.http.client.HttpDownloadHelper; @@ -63,10 +62,9 @@ public class PluginManagerUnitTests extends ESTestCase { Environment environment = new Environment(settings); PluginManager.PluginHandle pluginHandle = new PluginManager.PluginHandle(pluginName, "version", "user"); - String configDirPath = Files.simplifyPath(pluginHandle.configDir(environment).normalize().toString()); - String expectedDirPath = Files.simplifyPath(genericConfigFolder.resolve(pluginName).normalize().toString()); - - assertThat(configDirPath, is(expectedDirPath)); + Path configDirPath = pluginHandle.configDir(environment).normalize(); + Path expectedDirPath = genericConfigFolder.resolve(pluginName).normalize(); + assertEquals(configDirPath, expectedDirPath); } @Test diff --git a/dev-tools/src/main/resources/forbidden/all-signatures.txt b/dev-tools/src/main/resources/forbidden/all-signatures.txt index 82237cce048..c79dc5c7d26 100644 --- a/dev-tools/src/main/resources/forbidden/all-signatures.txt +++ b/dev-tools/src/main/resources/forbidden/all-signatures.txt @@ -111,6 +111,14 @@ com.google.common.collect.Collections2 com.google.common.cache.LoadingCache com.google.common.cache.CacheLoader com.google.common.collect.Iterables +com.google.common.util.concurrent.UncheckedExecutionException +com.google.common.util.concurrent.AtomicLongMap +com.google.common.primitives.Longs +com.google.common.io.ByteStreams +com.google.common.collect.UnmodifiableIterator +com.google.common.collect.ObjectArrays +com.google.common.collect.Multimap +com.google.common.collect.MultimapBuilder @defaultMessage Do not violate java's access system java.lang.reflect.AccessibleObject#setAccessible(boolean)