diff --git a/core/src/main/java/org/elasticsearch/action/admin/indices/mapping/get/TransportGetFieldMappingsAction.java b/core/src/main/java/org/elasticsearch/action/admin/indices/mapping/get/TransportGetFieldMappingsAction.java index 060d94ad181..82d6c21f022 100644 --- a/core/src/main/java/org/elasticsearch/action/admin/indices/mapping/get/TransportGetFieldMappingsAction.java +++ b/core/src/main/java/org/elasticsearch/action/admin/indices/mapping/get/TransportGetFieldMappingsAction.java @@ -25,16 +25,18 @@ import org.elasticsearch.action.support.HandledTransportAction; import org.elasticsearch.cluster.ClusterService; import org.elasticsearch.cluster.ClusterState; import org.elasticsearch.cluster.metadata.IndexNameExpressionResolver; -import org.elasticsearch.common.collect.MapBuilder; import org.elasticsearch.common.inject.Inject; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.threadpool.ThreadPool; import org.elasticsearch.transport.TransportService; +import java.util.HashMap; import java.util.Map; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicReferenceArray; +import static java.util.Collections.unmodifiableMap; + /** */ public class TransportGetFieldMappingsAction extends HandledTransportAction { @@ -88,7 +90,7 @@ public class TransportGetFieldMappingsAction extends HandledTransportAction indexResponses) { - MapBuilder>> mergedResponses = MapBuilder.newMapBuilder(); + Map>> mergedResponses = new HashMap<>(); for (int i = 0; i < indexResponses.length(); i++) { Object element = indexResponses.get(i); if (element instanceof GetFieldMappingsResponse) { @@ -96,6 +98,6 @@ public class TransportGetFieldMappingsAction extends HandledTransportAction actions; + private final Map actions; @Inject public NodeClient(Settings settings, ThreadPool threadPool, Headers headers, Map actions) { super(settings, threadPool, headers); - this.actions = ImmutableMap.copyOf(actions); + this.actions = unmodifiableMap(actions); } @Override diff --git a/core/src/main/java/org/elasticsearch/cluster/RestoreInProgress.java b/core/src/main/java/org/elasticsearch/cluster/RestoreInProgress.java index a3d567eaed7..7e07cb6084c 100644 --- a/core/src/main/java/org/elasticsearch/cluster/RestoreInProgress.java +++ b/core/src/main/java/org/elasticsearch/cluster/RestoreInProgress.java @@ -19,8 +19,6 @@ package org.elasticsearch.cluster; -import com.google.common.collect.ImmutableMap; - import org.elasticsearch.cluster.ClusterState.Custom; import org.elasticsearch.cluster.metadata.SnapshotId; import org.elasticsearch.common.io.stream.StreamInput; @@ -33,10 +31,12 @@ import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; +import java.util.HashMap; import java.util.List; import java.util.Map; import static java.util.Collections.emptyMap; +import static java.util.Collections.unmodifiableMap; /** * Meta data about restore processes that are currently executing @@ -419,14 +419,14 @@ public class RestoreInProgress extends AbstractDiffable implements Custo for (int j = 0; j < indices; j++) { indexBuilder.add(in.readString()); } - ImmutableMap.Builder builder = ImmutableMap.builder(); + Map builder = new HashMap<>(); int shards = in.readVInt(); for (int j = 0; j < shards; j++) { ShardId shardId = ShardId.readShardId(in); ShardRestoreStatus shardState = ShardRestoreStatus.readShardRestoreStatus(in); builder.put(shardId, shardState); } - entries[i] = new Entry(snapshotId, state, Collections.unmodifiableList(indexBuilder), builder.build()); + entries[i] = new Entry(snapshotId, state, Collections.unmodifiableList(indexBuilder), unmodifiableMap(builder)); } return new RestoreInProgress(entries); } diff --git a/core/src/main/java/org/elasticsearch/common/collect/MapBuilder.java b/core/src/main/java/org/elasticsearch/common/collect/MapBuilder.java index cafeaad4545..3c77c628c05 100644 --- a/core/src/main/java/org/elasticsearch/common/collect/MapBuilder.java +++ b/core/src/main/java/org/elasticsearch/common/collect/MapBuilder.java @@ -19,11 +19,11 @@ package org.elasticsearch.common.collect; -import com.google.common.collect.ImmutableMap; - import java.util.HashMap; import java.util.Map; +import static java.util.Collections.unmodifiableMap; + /** * */ @@ -83,7 +83,7 @@ public class MapBuilder { return this.map; } - public ImmutableMap immutableMap() { - return ImmutableMap.copyOf(map); + public Map immutableMap() { + return unmodifiableMap(new HashMap<>(map)); } } diff --git a/core/src/main/java/org/elasticsearch/common/inject/internal/PrivateElementsImpl.java b/core/src/main/java/org/elasticsearch/common/inject/internal/PrivateElementsImpl.java index 29f788668f3..34cb541813c 100644 --- a/core/src/main/java/org/elasticsearch/common/inject/internal/PrivateElementsImpl.java +++ b/core/src/main/java/org/elasticsearch/common/inject/internal/PrivateElementsImpl.java @@ -16,7 +16,6 @@ package org.elasticsearch.common.inject.internal; -import com.google.common.collect.ImmutableMap; import org.elasticsearch.common.inject.Binder; import org.elasticsearch.common.inject.Injector; import org.elasticsearch.common.inject.Key; @@ -25,7 +24,15 @@ import org.elasticsearch.common.inject.spi.Element; import org.elasticsearch.common.inject.spi.ElementVisitor; import org.elasticsearch.common.inject.spi.PrivateElements; -import java.util.*; +import java.util.ArrayList; +import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Set; + +import static java.util.Collections.unmodifiableMap; /** * @author jessewilson@google.com (Jesse Wilson) @@ -92,7 +99,7 @@ public final class PrivateElementsImpl implements PrivateElements { for (ExposureBuilder exposureBuilder : exposureBuilders) { exposedKeysToSourcesMutable.put(exposureBuilder.getKey(), exposureBuilder.getSource()); } - exposedKeysToSources = ImmutableMap.copyOf(exposedKeysToSourcesMutable); + exposedKeysToSources = unmodifiableMap(exposedKeysToSourcesMutable); exposureBuilders = null; } diff --git a/core/src/main/java/org/elasticsearch/gateway/DanglingIndicesState.java b/core/src/main/java/org/elasticsearch/gateway/DanglingIndicesState.java index 4d462f25441..0ebba04a9fa 100644 --- a/core/src/main/java/org/elasticsearch/gateway/DanglingIndicesState.java +++ b/core/src/main/java/org/elasticsearch/gateway/DanglingIndicesState.java @@ -19,8 +19,6 @@ package org.elasticsearch.gateway; -import com.google.common.collect.ImmutableMap; - import org.elasticsearch.cluster.metadata.IndexMetaData; import org.elasticsearch.cluster.metadata.MetaData; import org.elasticsearch.common.component.AbstractComponent; @@ -36,6 +34,7 @@ import java.util.Map; import java.util.Set; import static java.util.Collections.emptyMap; +import static java.util.Collections.unmodifiableMap; /** * The dangling indices state is responsible for finding new dangling indices (indices that have @@ -76,7 +75,8 @@ public class DanglingIndicesState extends AbstractComponent { * The current set of dangling indices. */ Map getDanglingIndices() { - return ImmutableMap.copyOf(danglingIndices); + // This might be a good use case for CopyOnWriteHashMap + return unmodifiableMap(new HashMap<>(danglingIndices)); } /** diff --git a/core/src/main/java/org/elasticsearch/http/HttpServer.java b/core/src/main/java/org/elasticsearch/http/HttpServer.java index 168ed0669e8..f3b8c3f0a4b 100644 --- a/core/src/main/java/org/elasticsearch/http/HttpServer.java +++ b/core/src/main/java/org/elasticsearch/http/HttpServer.java @@ -19,8 +19,6 @@ package org.elasticsearch.http; -import com.google.common.collect.ImmutableMap; - import org.elasticsearch.common.component.AbstractLifecycleComponent; import org.elasticsearch.common.inject.Inject; import org.elasticsearch.common.io.FileSystemUtils; @@ -28,18 +26,29 @@ 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 org.elasticsearch.rest.BytesRestResponse; +import org.elasticsearch.rest.RestChannel; +import org.elasticsearch.rest.RestController; +import org.elasticsearch.rest.RestFilter; +import org.elasticsearch.rest.RestFilterChain; +import org.elasticsearch.rest.RestRequest; +import org.elasticsearch.rest.RestStatus; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; -import java.nio.file.*; +import java.nio.file.Files; +import java.nio.file.Path; import java.nio.file.attribute.BasicFileAttributes; import java.util.HashMap; import java.util.Locale; import java.util.Map; -import static org.elasticsearch.rest.RestStatus.*; +import static java.util.Collections.unmodifiableMap; +import static org.elasticsearch.rest.RestStatus.FORBIDDEN; +import static org.elasticsearch.rest.RestStatus.INTERNAL_SERVER_ERROR; +import static org.elasticsearch.rest.RestStatus.NOT_FOUND; +import static org.elasticsearch.rest.RestStatus.OK; /** * @@ -204,7 +213,7 @@ public class HttpServer extends AbstractLifecycleComponent { final String separator = siteFile.getFileSystem().getSeparator(); // Convert file separators. sitePath = sitePath.replace("/", separator); - + Path file = siteFile.resolve(sitePath); // return not found instead of forbidden to prevent malicious requests to find out if files exist or dont exist @@ -275,7 +284,7 @@ public class HttpServer extends AbstractLifecycleComponent { mimeTypes.put("svg", "image/svg+xml"); mimeTypes.put("ico", "image/vnd.microsoft.icon"); mimeTypes.put("mp3", "audio/mpeg"); - DEFAULT_MIME_TYPES = ImmutableMap.copyOf(mimeTypes); + DEFAULT_MIME_TYPES = unmodifiableMap(mimeTypes); } public static final Map DEFAULT_MIME_TYPES; diff --git a/core/src/main/java/org/elasticsearch/index/analysis/AnalysisService.java b/core/src/main/java/org/elasticsearch/index/analysis/AnalysisService.java index 829f9db3b77..c76446c6676 100644 --- a/core/src/main/java/org/elasticsearch/index/analysis/AnalysisService.java +++ b/core/src/main/java/org/elasticsearch/index/analysis/AnalysisService.java @@ -19,7 +19,6 @@ package org.elasticsearch.index.analysis; -import com.google.common.collect.ImmutableMap; import org.apache.lucene.analysis.Analyzer; import org.elasticsearch.Version; import org.elasticsearch.cluster.metadata.IndexMetaData; @@ -37,15 +36,17 @@ import java.io.Closeable; import java.util.HashMap; import java.util.Map; +import static java.util.Collections.unmodifiableMap; + /** * */ public class AnalysisService extends AbstractIndexComponent implements Closeable { - private final ImmutableMap analyzers; - private final ImmutableMap tokenizers; - private final ImmutableMap charFilters; - private final ImmutableMap tokenFilters; + private final Map analyzers; + private final Map tokenizers; + private final Map charFilters; + private final Map tokenFilters; private final NamedAnalyzer defaultAnalyzer; private final NamedAnalyzer defaultIndexAnalyzer; @@ -98,7 +99,7 @@ public class AnalysisService extends AbstractIndexComponent implements Closeable } } - this.tokenizers = ImmutableMap.copyOf(tokenizers); + this.tokenizers = unmodifiableMap(tokenizers); Map charFilters = new HashMap<>(); if (charFilterFactoryFactories != null) { @@ -133,7 +134,7 @@ public class AnalysisService extends AbstractIndexComponent implements Closeable } } - this.charFilters = ImmutableMap.copyOf(charFilters); + this.charFilters = unmodifiableMap(charFilters); Map tokenFilters = new HashMap<>(); if (tokenFilterFactoryFactories != null) { @@ -168,7 +169,7 @@ public class AnalysisService extends AbstractIndexComponent implements Closeable } } } - this.tokenFilters = ImmutableMap.copyOf(tokenFilters); + this.tokenFilters = unmodifiableMap(tokenFilters); Map analyzerProviders = new HashMap<>(); if (analyzerFactoryFactories != null) { @@ -275,7 +276,7 @@ public class AnalysisService extends AbstractIndexComponent implements Closeable throw new IllegalArgumentException("analyzer name must not start with '_'. got \"" + analyzer.getKey() + "\""); } } - this.analyzers = ImmutableMap.copyOf(analyzers); + this.analyzers = unmodifiableMap(analyzers); } @Override diff --git a/core/src/main/java/org/elasticsearch/index/fielddata/IndexFieldDataService.java b/core/src/main/java/org/elasticsearch/index/fielddata/IndexFieldDataService.java index a9713ce1b20..de3adbcf2e7 100644 --- a/core/src/main/java/org/elasticsearch/index/fielddata/IndexFieldDataService.java +++ b/core/src/main/java/org/elasticsearch/index/fielddata/IndexFieldDataService.java @@ -19,10 +19,8 @@ package org.elasticsearch.index.fielddata; -import com.google.common.collect.ImmutableMap; import org.apache.lucene.util.Accountable; import org.elasticsearch.ExceptionsHelper; -import org.elasticsearch.Version; import org.elasticsearch.common.collect.MapBuilder; import org.elasticsearch.common.collect.Tuple; import org.elasticsearch.common.inject.Inject; @@ -41,6 +39,7 @@ import org.elasticsearch.index.fielddata.plain.PackedArrayIndexFieldData; import org.elasticsearch.index.fielddata.plain.PagedBytesIndexFieldData; import org.elasticsearch.index.fielddata.plain.ParentChildIndexFieldData; import org.elasticsearch.index.mapper.MappedFieldType; +import org.elasticsearch.index.mapper.MappedFieldType.Names; import org.elasticsearch.index.mapper.MapperService; import org.elasticsearch.index.mapper.core.BooleanFieldMapper; import org.elasticsearch.index.mapper.internal.IndexFieldMapper; @@ -56,7 +55,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -import static org.elasticsearch.index.mapper.MappedFieldType.Names; +import static java.util.Collections.unmodifiableMap; /** */ @@ -70,26 +69,28 @@ public class IndexFieldDataService extends AbstractIndexComponent { private static final String ARRAY_FORMAT = "array"; private static final String PAGED_BYTES_FORMAT = "paged_bytes"; - private final static ImmutableMap buildersByType; - private final static ImmutableMap docValuesBuildersByType; - private final static ImmutableMap, IndexFieldData.Builder> buildersByTypeAndFormat; + private final static Map buildersByType; + private final static Map docValuesBuildersByType; + private final static Map, IndexFieldData.Builder> buildersByTypeAndFormat; private final CircuitBreakerService circuitBreakerService; static { - buildersByType = MapBuilder.newMapBuilder() - .put("string", new PagedBytesIndexFieldData.Builder()) - .put("float", new FloatArrayIndexFieldData.Builder()) - .put("double", new DoubleArrayIndexFieldData.Builder()) - .put("byte", new PackedArrayIndexFieldData.Builder().setNumericType(IndexNumericFieldData.NumericType.BYTE)) - .put("short", new PackedArrayIndexFieldData.Builder().setNumericType(IndexNumericFieldData.NumericType.SHORT)) - .put("int", new PackedArrayIndexFieldData.Builder().setNumericType(IndexNumericFieldData.NumericType.INT)) - .put("long", new PackedArrayIndexFieldData.Builder().setNumericType(IndexNumericFieldData.NumericType.LONG)) - .put("geo_point", new GeoPointDoubleArrayIndexFieldData.Builder()) - .put(ParentFieldMapper.NAME, new ParentChildIndexFieldData.Builder()) - .put(IndexFieldMapper.NAME, new IndexIndexFieldData.Builder()) - .put("binary", new DisabledIndexFieldData.Builder()) - .put(BooleanFieldMapper.CONTENT_TYPE, new PackedArrayIndexFieldData.Builder().setNumericType(IndexNumericFieldData.NumericType.BOOLEAN)) - .immutableMap(); + Map buildersByTypeBuilder = new HashMap<>(); + buildersByTypeBuilder.put("string", new PagedBytesIndexFieldData.Builder()); + buildersByTypeBuilder.put("float", new FloatArrayIndexFieldData.Builder()); + buildersByTypeBuilder.put("double", new DoubleArrayIndexFieldData.Builder()); + buildersByTypeBuilder.put("byte", new PackedArrayIndexFieldData.Builder().setNumericType(IndexNumericFieldData.NumericType.BYTE)); + buildersByTypeBuilder.put("short", new PackedArrayIndexFieldData.Builder().setNumericType(IndexNumericFieldData.NumericType.SHORT)); + buildersByTypeBuilder.put("int", new PackedArrayIndexFieldData.Builder().setNumericType(IndexNumericFieldData.NumericType.INT)); + buildersByTypeBuilder.put("long", new PackedArrayIndexFieldData.Builder().setNumericType(IndexNumericFieldData.NumericType.LONG)); + buildersByTypeBuilder.put("geo_point", new GeoPointDoubleArrayIndexFieldData.Builder()); + buildersByTypeBuilder.put(ParentFieldMapper.NAME, new ParentChildIndexFieldData.Builder()); + buildersByTypeBuilder.put(IndexFieldMapper.NAME, new IndexIndexFieldData.Builder()); + buildersByTypeBuilder.put("binary", new DisabledIndexFieldData.Builder()); + buildersByTypeBuilder.put(BooleanFieldMapper.CONTENT_TYPE, + new PackedArrayIndexFieldData.Builder().setNumericType(IndexNumericFieldData.NumericType.BOOLEAN)); + buildersByType = unmodifiableMap(buildersByTypeBuilder); + docValuesBuildersByType = MapBuilder.newMapBuilder() .put("string", new DocValuesIndexFieldData.Builder()) diff --git a/core/src/main/java/org/elasticsearch/index/query/QueryShardContext.java b/core/src/main/java/org/elasticsearch/index/query/QueryShardContext.java index 7862bb25280..177ae9b06bb 100644 --- a/core/src/main/java/org/elasticsearch/index/query/QueryShardContext.java +++ b/core/src/main/java/org/elasticsearch/index/query/QueryShardContext.java @@ -19,7 +19,6 @@ package org.elasticsearch.index.query; -import com.google.common.collect.ImmutableMap; import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.queryparser.classic.MapperQueryParser; import org.apache.lucene.queryparser.classic.QueryParserSettings; @@ -37,7 +36,11 @@ import org.elasticsearch.common.xcontent.XContentParser; import org.elasticsearch.index.Index; import org.elasticsearch.index.analysis.AnalysisService; import org.elasticsearch.index.fielddata.IndexFieldData; -import org.elasticsearch.index.mapper.*; +import org.elasticsearch.index.mapper.ContentPath; +import org.elasticsearch.index.mapper.MappedFieldType; +import org.elasticsearch.index.mapper.Mapper; +import org.elasticsearch.index.mapper.MapperBuilders; +import org.elasticsearch.index.mapper.MapperService; import org.elasticsearch.index.mapper.core.StringFieldMapper; import org.elasticsearch.index.mapper.object.ObjectMapper; import org.elasticsearch.index.query.support.NestedScope; @@ -54,6 +57,8 @@ import java.util.Collection; import java.util.HashMap; import java.util.Map; +import static java.util.Collections.unmodifiableMap; + /** * Context object used to create lucene queries on the shard level. */ @@ -186,8 +191,9 @@ public class QueryShardContext { } } - public ImmutableMap copyNamedQueries() { - return ImmutableMap.copyOf(namedQueries); + public Map copyNamedQueries() { + // This might be a good use case for CopyOnWriteHashMap + return unmodifiableMap(new HashMap<>(namedQueries)); } public void combineNamedQueries(QueryShardContext context) { diff --git a/core/src/main/java/org/elasticsearch/index/similarity/DFRSimilarityProvider.java b/core/src/main/java/org/elasticsearch/index/similarity/DFRSimilarityProvider.java index b5a5cdcfeff..7858cb132d6 100644 --- a/core/src/main/java/org/elasticsearch/index/similarity/DFRSimilarityProvider.java +++ b/core/src/main/java/org/elasticsearch/index/similarity/DFRSimilarityProvider.java @@ -19,13 +19,29 @@ package org.elasticsearch.index.similarity; -import com.google.common.collect.ImmutableMap; -import org.apache.lucene.search.similarities.*; -import org.elasticsearch.common.collect.MapBuilder; +import org.apache.lucene.search.similarities.AfterEffect; +import org.apache.lucene.search.similarities.AfterEffectB; +import org.apache.lucene.search.similarities.AfterEffectL; +import org.apache.lucene.search.similarities.BasicModel; +import org.apache.lucene.search.similarities.BasicModelBE; +import org.apache.lucene.search.similarities.BasicModelD; +import org.apache.lucene.search.similarities.BasicModelG; +import org.apache.lucene.search.similarities.BasicModelIF; +import org.apache.lucene.search.similarities.BasicModelIn; +import org.apache.lucene.search.similarities.BasicModelIne; +import org.apache.lucene.search.similarities.BasicModelP; +import org.apache.lucene.search.similarities.DFRSimilarity; +import org.apache.lucene.search.similarities.Normalization; +import org.apache.lucene.search.similarities.Similarity; import org.elasticsearch.common.inject.Inject; import org.elasticsearch.common.inject.assistedinject.Assisted; import org.elasticsearch.common.settings.Settings; +import java.util.HashMap; +import java.util.Map; + +import static java.util.Collections.unmodifiableMap; + /** * {@link SimilarityProvider} for {@link DFRSimilarity}. *

@@ -38,12 +54,11 @@ import org.elasticsearch.common.settings.Settings; * @see DFRSimilarity For more information about configuration */ public class DFRSimilarityProvider extends AbstractSimilarityProvider { - - private static final ImmutableMap MODEL_CACHE; - private static final ImmutableMap EFFECT_CACHE; + private static final Map MODEL_CACHE; + private static final Map EFFECT_CACHE; static { - MapBuilder models = MapBuilder.newMapBuilder(); + Map models = new HashMap<>(); models.put("be", new BasicModelBE()); models.put("d", new BasicModelD()); models.put("g", new BasicModelG()); @@ -51,13 +66,13 @@ public class DFRSimilarityProvider extends AbstractSimilarityProvider { models.put("in", new BasicModelIn()); models.put("ine", new BasicModelIne()); models.put("p", new BasicModelP()); - MODEL_CACHE = models.immutableMap(); + MODEL_CACHE = unmodifiableMap(models); - MapBuilder effects = MapBuilder.newMapBuilder(); + Map effects = new HashMap<>(); effects.put("no", new AfterEffect.NoAfterEffect()); effects.put("b", new AfterEffectB()); effects.put("l", new AfterEffectL()); - EFFECT_CACHE = effects.immutableMap(); + EFFECT_CACHE = unmodifiableMap(effects); } private final DFRSimilarity similarity; diff --git a/core/src/main/java/org/elasticsearch/index/snapshots/blobstore/BlobStoreIndexShardSnapshots.java b/core/src/main/java/org/elasticsearch/index/snapshots/blobstore/BlobStoreIndexShardSnapshots.java index ad3b9c9be9c..8f05572bedb 100644 --- a/core/src/main/java/org/elasticsearch/index/snapshots/blobstore/BlobStoreIndexShardSnapshots.java +++ b/core/src/main/java/org/elasticsearch/index/snapshots/blobstore/BlobStoreIndexShardSnapshots.java @@ -19,7 +19,6 @@ package org.elasticsearch.index.snapshots.blobstore; -import com.google.common.collect.ImmutableMap; import org.elasticsearch.ElasticsearchParseException; import org.elasticsearch.common.ParseField; import org.elasticsearch.common.ParseFieldMatcher; @@ -38,6 +37,8 @@ import java.util.Iterator; import java.util.List; import java.util.Map; +import static java.util.Collections.unmodifiableMap; + /** * Contains information about all snapshot for the given shard in repository *

@@ -77,15 +78,15 @@ public class BlobStoreIndexShardSnapshots implements Iterable, To physicalFileList.add(newFiles.get(fileInfo.name())); } } - ImmutableMap.Builder> mapBuilder = ImmutableMap.builder(); + Map> mapBuilder = new HashMap<>(); for (Map.Entry> entry : physicalFiles.entrySet()) { mapBuilder.put(entry.getKey(), Collections.unmodifiableList(new ArrayList<>(entry.getValue()))); } - this.physicalFiles = mapBuilder.build(); - this.files = ImmutableMap.copyOf(newFiles); + this.physicalFiles = unmodifiableMap(mapBuilder); + this.files = unmodifiableMap(newFiles); } - private BlobStoreIndexShardSnapshots(ImmutableMap files, List shardSnapshots) { + private BlobStoreIndexShardSnapshots(Map files, List shardSnapshots) { this.shardSnapshots = shardSnapshots; this.files = files; Map> physicalFiles = new HashMap<>(); @@ -99,11 +100,11 @@ public class BlobStoreIndexShardSnapshots implements Iterable, To physicalFileList.add(files.get(fileInfo.name())); } } - ImmutableMap.Builder> mapBuilder = ImmutableMap.builder(); + Map> mapBuilder = new HashMap<>(); for (Map.Entry> entry : physicalFiles.entrySet()) { mapBuilder.put(entry.getKey(), Collections.unmodifiableList(new ArrayList<>(entry.getValue()))); } - this.physicalFiles = mapBuilder.build(); + this.physicalFiles = unmodifiableMap(mapBuilder); } private BlobStoreIndexShardSnapshots() { @@ -232,13 +233,14 @@ public class BlobStoreIndexShardSnapshots implements Iterable, To return builder; } + @Override public BlobStoreIndexShardSnapshots fromXContent(XContentParser parser, ParseFieldMatcher parseFieldMatcher) throws IOException { XContentParser.Token token = parser.currentToken(); if (token == null) { // New parser token = parser.nextToken(); } Map> snapshotsMap = new HashMap<>(); - ImmutableMap.Builder filesBuilder = ImmutableMap.builder(); + Map files = new HashMap<>(); if (token == XContentParser.Token.START_OBJECT) { while ((token = parser.nextToken()) != XContentParser.Token.END_OBJECT) { if (token != XContentParser.Token.FIELD_NAME) { @@ -252,7 +254,7 @@ public class BlobStoreIndexShardSnapshots implements Iterable, To } while (parser.nextToken() != XContentParser.Token.END_ARRAY) { FileInfo fileInfo = FileInfo.fromXContent(parser); - filesBuilder.put(fileInfo.name(), fileInfo); + files.put(fileInfo.name(), fileInfo); } } else if (token == XContentParser.Token.START_OBJECT) { if (parseFieldMatcher.match(currentFieldName, ParseFields.SNAPSHOTS) == false) { @@ -288,7 +290,6 @@ public class BlobStoreIndexShardSnapshots implements Iterable, To } } - ImmutableMap files = filesBuilder.build(); List snapshots = new ArrayList<>(); for (Map.Entry> entry : snapshotsMap.entrySet()) { List fileInfosBuilder = new ArrayList<>(); diff --git a/core/src/main/java/org/elasticsearch/indices/IndicesService.java b/core/src/main/java/org/elasticsearch/indices/IndicesService.java index 37941530dd0..0ad77fbfcd5 100644 --- a/core/src/main/java/org/elasticsearch/indices/IndicesService.java +++ b/core/src/main/java/org/elasticsearch/indices/IndicesService.java @@ -19,8 +19,6 @@ package org.elasticsearch.indices; -import com.google.common.collect.ImmutableMap; - import org.apache.lucene.store.LockObtainFailedException; import org.apache.lucene.util.CollectionUtil; import org.apache.lucene.util.IOUtils; @@ -99,6 +97,7 @@ import java.util.concurrent.TimeUnit; import java.util.stream.Stream; import static java.util.Collections.emptyMap; +import static java.util.Collections.unmodifiableMap; import static org.elasticsearch.cluster.metadata.IndexMetaData.SETTING_NUMBER_OF_REPLICAS; import static org.elasticsearch.cluster.metadata.IndexMetaData.SETTING_NUMBER_OF_SHARDS; import static org.elasticsearch.common.collect.MapBuilder.newMapBuilder; @@ -389,11 +388,11 @@ public class IndicesService extends AbstractLifecycleComponent i } logger.debug("[{}] closing ... (reason [{}])", index, reason); - Map tmpMap = new HashMap<>(indices); - IndexServiceInjectorPair remove = tmpMap.remove(index); + Map newIndices = new HashMap<>(indices); + IndexServiceInjectorPair remove = newIndices.remove(index); indexService = remove.getIndexService(); indexInjector = remove.getInjector(); - indices = ImmutableMap.copyOf(tmpMap); + indices = unmodifiableMap(newIndices); } indicesLifecycle.beforeIndexClosed(indexService); diff --git a/core/src/main/java/org/elasticsearch/indices/query/IndicesQueriesRegistry.java b/core/src/main/java/org/elasticsearch/indices/query/IndicesQueriesRegistry.java index b453503f832..450718b8879 100644 --- a/core/src/main/java/org/elasticsearch/indices/query/IndicesQueriesRegistry.java +++ b/core/src/main/java/org/elasticsearch/indices/query/IndicesQueriesRegistry.java @@ -19,7 +19,6 @@ package org.elasticsearch.indices.query; -import com.google.common.collect.ImmutableMap; import org.elasticsearch.common.component.AbstractComponent; import org.elasticsearch.common.inject.Inject; import org.elasticsearch.common.io.stream.NamedWriteableRegistry; @@ -32,12 +31,13 @@ import java.util.HashMap; import java.util.Map; import java.util.Set; -public class IndicesQueriesRegistry extends AbstractComponent { +import static java.util.Collections.unmodifiableMap; - private ImmutableMap> queryParsers; +public class IndicesQueriesRegistry extends AbstractComponent { + private Map> queryParsers; @Inject - public IndicesQueriesRegistry(Settings settings, Set injectedQueryParsers, NamedWriteableRegistry namedWriteableRegistry) { + public IndicesQueriesRegistry(Settings settings, Set> injectedQueryParsers, NamedWriteableRegistry namedWriteableRegistry) { super(settings); Map> queryParsers = new HashMap<>(); for (QueryParser queryParser : injectedQueryParsers) { @@ -49,13 +49,13 @@ public class IndicesQueriesRegistry extends AbstractComponent { // EmptyQueryBuilder is not registered as query parser but used internally. // We need to register it with the NamedWriteableRegistry in order to serialize it namedWriteableRegistry.registerPrototype(QueryBuilder.class, EmptyQueryBuilder.PROTOTYPE); - this.queryParsers = ImmutableMap.copyOf(queryParsers); + this.queryParsers = unmodifiableMap(queryParsers); } /** * Returns all the registered query parsers */ - public ImmutableMap> queryParsers() { + public Map> queryParsers() { return queryParsers; } } \ No newline at end of file diff --git a/core/src/main/java/org/elasticsearch/node/service/NodeService.java b/core/src/main/java/org/elasticsearch/node/service/NodeService.java index d394765bcfc..fe57800a466 100644 --- a/core/src/main/java/org/elasticsearch/node/service/NodeService.java +++ b/core/src/main/java/org/elasticsearch/node/service/NodeService.java @@ -25,7 +25,6 @@ import org.elasticsearch.action.admin.cluster.node.info.NodeInfo; import org.elasticsearch.action.admin.cluster.node.stats.NodeStats; import org.elasticsearch.action.admin.indices.stats.CommonStatsFlags; import org.elasticsearch.common.Nullable; -import org.elasticsearch.common.collect.MapBuilder; import org.elasticsearch.common.component.AbstractComponent; import org.elasticsearch.common.inject.Inject; import org.elasticsearch.common.settings.Settings; @@ -40,9 +39,11 @@ import org.elasticsearch.threadpool.ThreadPool; import org.elasticsearch.transport.TransportService; import java.io.IOException; +import java.util.HashMap; import java.util.Map; import static java.util.Collections.emptyMap; +import static java.util.Collections.unmodifiableMap; /** */ @@ -93,11 +94,15 @@ public class NodeService extends AbstractComponent { } public synchronized void putAttribute(String key, String value) { - serviceAttributes = new MapBuilder<>(serviceAttributes).put(key, value).immutableMap(); + Map newServiceAttributes = new HashMap<>(serviceAttributes); + newServiceAttributes.put(key, value); + serviceAttributes = unmodifiableMap(newServiceAttributes); } public synchronized void removeAttribute(String key) { - serviceAttributes = new MapBuilder<>(serviceAttributes).remove(key).immutableMap(); + Map newServiceAttributes = new HashMap<>(serviceAttributes); + newServiceAttributes.remove(key); + serviceAttributes = unmodifiableMap(newServiceAttributes); } /** diff --git a/core/src/main/java/org/elasticsearch/script/NativeScriptEngineService.java b/core/src/main/java/org/elasticsearch/script/NativeScriptEngineService.java index 548c1b372fd..005e8f98cc6 100644 --- a/core/src/main/java/org/elasticsearch/script/NativeScriptEngineService.java +++ b/core/src/main/java/org/elasticsearch/script/NativeScriptEngineService.java @@ -19,8 +19,6 @@ package org.elasticsearch.script; -import com.google.common.collect.ImmutableMap; - import org.apache.lucene.index.LeafReaderContext; import org.elasticsearch.common.Nullable; import org.elasticsearch.common.component.AbstractComponent; @@ -31,6 +29,8 @@ import org.elasticsearch.search.lookup.SearchLookup; import java.io.IOException; import java.util.Map; +import static java.util.Collections.unmodifiableMap; + /** * A native script engine service. */ @@ -38,12 +38,12 @@ public class NativeScriptEngineService extends AbstractComponent implements Scri public static final String NAME = "native"; - private final ImmutableMap scripts; + private final Map scripts; @Inject public NativeScriptEngineService(Settings settings, Map scripts) { super(settings); - this.scripts = ImmutableMap.copyOf(scripts); + this.scripts = unmodifiableMap(scripts); } @Override diff --git a/core/src/main/java/org/elasticsearch/script/ScriptContextRegistry.java b/core/src/main/java/org/elasticsearch/script/ScriptContextRegistry.java index bf2b6679f3e..929575cc3aa 100644 --- a/core/src/main/java/org/elasticsearch/script/ScriptContextRegistry.java +++ b/core/src/main/java/org/elasticsearch/script/ScriptContextRegistry.java @@ -19,15 +19,13 @@ package org.elasticsearch.script; -import com.google.common.collect.ImmutableCollection; -import com.google.common.collect.ImmutableMap; - import java.util.Collection; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; +import static java.util.Collections.unmodifiableMap; import static java.util.Collections.unmodifiableSet; /** @@ -38,7 +36,7 @@ import static java.util.Collections.unmodifiableSet; public final class ScriptContextRegistry { static final Set RESERVED_SCRIPT_CONTEXTS = reservedScriptContexts(); - private final ImmutableMap scriptContexts; + private final Map scriptContexts; public ScriptContextRegistry(Collection customScriptContexts) { Map scriptContexts = new HashMap<>(); @@ -52,13 +50,13 @@ public final class ScriptContextRegistry { throw new IllegalArgumentException("script context [" + customScriptContext.getKey() + "] cannot be registered twice"); } } - this.scriptContexts = ImmutableMap.copyOf(scriptContexts); + this.scriptContexts = unmodifiableMap(scriptContexts); } /** * @return a list that contains all the supported {@link ScriptContext}s, both standard ones and registered via plugins */ - ImmutableCollection scriptContexts() { + Collection scriptContexts() { return scriptContexts.values(); } diff --git a/core/src/main/java/org/elasticsearch/script/ScriptModes.java b/core/src/main/java/org/elasticsearch/script/ScriptModes.java index 897e69be164..cfa3a592d8e 100644 --- a/core/src/main/java/org/elasticsearch/script/ScriptModes.java +++ b/core/src/main/java/org/elasticsearch/script/ScriptModes.java @@ -19,7 +19,6 @@ package org.elasticsearch.script; -import com.google.common.collect.ImmutableMap; import org.elasticsearch.common.Strings; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.script.ScriptService.ScriptType; @@ -29,6 +28,8 @@ import java.util.Map; import java.util.Set; import java.util.TreeMap; +import static java.util.Collections.unmodifiableMap; + /** * Holds the {@link org.elasticsearch.script.ScriptMode}s for each of the different scripting languages available, * each script source and each scripted operation. @@ -38,7 +39,7 @@ public class ScriptModes { static final String SCRIPT_SETTINGS_PREFIX = "script."; static final String ENGINE_SETTINGS_PREFIX = "script.engine"; - final ImmutableMap scriptModes; + final Map scriptModes; ScriptModes(Map scriptEngines, ScriptContextRegistry scriptContextRegistry, Settings settings) { //filter out the native engine as we don't want to apply fine grained settings to it. @@ -48,7 +49,7 @@ public class ScriptModes { this.scriptModes = buildScriptModeSettingsMap(settings, filteredEngines, scriptContextRegistry); } - private static ImmutableMap buildScriptModeSettingsMap(Settings settings, Map scriptEngines, ScriptContextRegistry scriptContextRegistry) { + private static Map buildScriptModeSettingsMap(Settings settings, Map scriptEngines, ScriptContextRegistry scriptContextRegistry) { HashMap scriptModesMap = new HashMap<>(); //file scripts are enabled by default, for any language @@ -61,7 +62,7 @@ public class ScriptModes { processSourceBasedGlobalSettings(settings, scriptEngines, scriptContextRegistry, scriptModesMap); processOperationBasedGlobalSettings(settings, scriptEngines, scriptContextRegistry, scriptModesMap); processEngineSpecificSettings(settings, scriptEngines, scriptContextRegistry, scriptModesMap); - return ImmutableMap.copyOf(scriptModesMap); + return unmodifiableMap(scriptModesMap); } private static void processSourceBasedGlobalSettings(Settings settings, Map scriptEngines, ScriptContextRegistry scriptContextRegistry, Map scriptModes) { diff --git a/core/src/main/java/org/elasticsearch/search/SearchService.java b/core/src/main/java/org/elasticsearch/search/SearchService.java index 59ec671dd8f..7953b59f07a 100644 --- a/core/src/main/java/org/elasticsearch/search/SearchService.java +++ b/core/src/main/java/org/elasticsearch/search/SearchService.java @@ -22,7 +22,6 @@ package org.elasticsearch.search; import com.carrotsearch.hppc.ObjectHashSet; import com.carrotsearch.hppc.ObjectSet; import com.carrotsearch.hppc.cursors.ObjectCursor; -import com.google.common.collect.ImmutableMap; import org.apache.lucene.index.IndexOptions; import org.apache.lucene.index.LeafReaderContext; @@ -112,6 +111,7 @@ import java.util.concurrent.Executor; import java.util.concurrent.ScheduledFuture; import java.util.concurrent.atomic.AtomicLong; +import static java.util.Collections.unmodifiableMap; import static org.elasticsearch.common.Strings.hasLength; import static org.elasticsearch.common.unit.TimeValue.timeValueMillis; import static org.elasticsearch.common.unit.TimeValue.timeValueMinutes; @@ -160,7 +160,7 @@ public class SearchService extends AbstractLifecycleComponent { private final ConcurrentMapLong activeContexts = ConcurrentCollections.newConcurrentMapLongWithAggressiveConcurrency(); - private final ImmutableMap elementParsers; + private final Map elementParsers; private final ParseFieldMatcher parseFieldMatcher; @@ -212,7 +212,7 @@ public class SearchService extends AbstractLifecycleComponent { elementParsers.putAll(queryPhase.parseElements()); elementParsers.putAll(fetchPhase.parseElements()); elementParsers.put("stats", new StatsGroupsParseElement()); - this.elementParsers = ImmutableMap.copyOf(elementParsers); + this.elementParsers = unmodifiableMap(elementParsers); this.keepAliveReaper = threadPool.scheduleWithFixedDelay(new Reaper(), keepAliveInterval); diff --git a/core/src/main/java/org/elasticsearch/snapshots/RestoreService.java b/core/src/main/java/org/elasticsearch/snapshots/RestoreService.java index 1c7773e34b8..37cdfbed9a1 100644 --- a/core/src/main/java/org/elasticsearch/snapshots/RestoreService.java +++ b/core/src/main/java/org/elasticsearch/snapshots/RestoreService.java @@ -22,7 +22,6 @@ import com.carrotsearch.hppc.IntHashSet; import com.carrotsearch.hppc.IntSet; import com.carrotsearch.hppc.cursors.ObjectCursor; import com.carrotsearch.hppc.cursors.ObjectObjectCursor; -import com.google.common.collect.ImmutableMap; import org.elasticsearch.Version; import org.elasticsearch.action.ActionListener; @@ -91,6 +90,7 @@ import java.util.concurrent.BlockingQueue; import java.util.concurrent.CopyOnWriteArrayList; import static java.util.Collections.emptyMap; +import static java.util.Collections.unmodifiableMap; import static java.util.Collections.unmodifiableSet; import static org.elasticsearch.cluster.metadata.IndexMetaData.SETTING_AUTO_EXPAND_REPLICAS; import static org.elasticsearch.cluster.metadata.IndexMetaData.SETTING_CREATION_DATE; @@ -237,7 +237,7 @@ public class RestoreService extends AbstractComponent implements ClusterStateLis Set aliases = new HashSet<>(); if (!renamedIndices.isEmpty()) { // We have some indices to restore - ImmutableMap.Builder shardsBuilder = ImmutableMap.builder(); + Map shardsBuilder = new HashMap<>(); for (Map.Entry indexEntry : renamedIndices.entrySet()) { String index = indexEntry.getValue(); boolean partial = checkPartial(index); @@ -308,7 +308,7 @@ public class RestoreService extends AbstractComponent implements ClusterStateLis } } - shards = shardsBuilder.build(); + shards = unmodifiableMap(shardsBuilder); RestoreInProgress.Entry restoreEntry = new RestoreInProgress.Entry(snapshotId, RestoreInProgress.State.INIT, Collections.unmodifiableList(new ArrayList<>(renamedIndices.keySet())), shards); builder.putCustom(RestoreInProgress.TYPE, new RestoreInProgress(restoreEntry)); } else { @@ -574,7 +574,7 @@ public class RestoreService extends AbstractComponent implements ClusterStateLis if (shards != null) { if (!completed(shards)) { - entries.add(new RestoreInProgress.Entry(entry.snapshotId(), RestoreInProgress.State.STARTED, entry.indices(), ImmutableMap.copyOf(shards))); + entries.add(new RestoreInProgress.Entry(entry.snapshotId(), RestoreInProgress.State.STARTED, entry.indices(), unmodifiableMap(shards))); } else { logger.info("restore [{}] is done", entry.snapshotId()); if (batchedRestoreInfo == null) { @@ -746,7 +746,7 @@ public class RestoreService extends AbstractComponent implements ClusterStateLis // Some indices were deleted, let's make sure all indices that we are restoring still exist for (RestoreInProgress.Entry entry : restore.entries()) { List shardsToFail = null; - for (ImmutableMap.Entry shard : entry.shards().entrySet()) { + for (Map.Entry shard : entry.shards().entrySet()) { if (!shard.getValue().state().completed()) { if (!event.state().metaData().hasIndex(shard.getKey().getIndex())) { if (shardsToFail == null) { diff --git a/core/src/main/java/org/elasticsearch/snapshots/SnapshotShardsService.java b/core/src/main/java/org/elasticsearch/snapshots/SnapshotShardsService.java index 8c7ff14905a..ee1c3f98f1c 100644 --- a/core/src/main/java/org/elasticsearch/snapshots/SnapshotShardsService.java +++ b/core/src/main/java/org/elasticsearch/snapshots/SnapshotShardsService.java @@ -20,7 +20,6 @@ package org.elasticsearch.snapshots; import com.carrotsearch.hppc.cursors.ObjectObjectCursor; -import com.google.common.collect.ImmutableMap; import org.apache.lucene.index.IndexCommit; import org.elasticsearch.ExceptionsHelper; @@ -71,6 +70,7 @@ import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; import static java.util.Collections.emptyMap; +import static java.util.Collections.unmodifiableMap; import static org.elasticsearch.cluster.SnapshotsInProgress.completed; /** @@ -227,15 +227,15 @@ public class SnapshotShardsService extends AbstractLifecycleComponent shards = ImmutableMap.builder(); + Map shards = new HashMap<>(); // Put all shards that were already running on this node shards.putAll(snapshotShards.shards); // Put all newly started shards shards.putAll(startedShards); - survivors.put(entry.snapshotId(), new SnapshotShards(shards.build())); + survivors.put(entry.snapshotId(), new SnapshotShards(unmodifiableMap(shards))); } else { // Brand new snapshot that we haven't seen before - survivors.put(entry.snapshotId(), new SnapshotShards(ImmutableMap.copyOf(startedShards))); + survivors.put(entry.snapshotId(), new SnapshotShards(unmodifiableMap(startedShards))); } } } else if (entry.state() == SnapshotsInProgress.State.ABORTED) { @@ -277,7 +277,7 @@ public class SnapshotShardsService extends AbstractLifecycleComponent shards; - private SnapshotShards(ImmutableMap shards) { + private SnapshotShards(Map shards) { this.shards = shards; } } diff --git a/core/src/main/java/org/elasticsearch/threadpool/ThreadPool.java b/core/src/main/java/org/elasticsearch/threadpool/ThreadPool.java index 85de5f6ec06..d20f600e6c3 100644 --- a/core/src/main/java/org/elasticsearch/threadpool/ThreadPool.java +++ b/core/src/main/java/org/elasticsearch/threadpool/ThreadPool.java @@ -19,7 +19,6 @@ package org.elasticsearch.threadpool; -import com.google.common.collect.ImmutableMap; import org.apache.lucene.util.Counter; import org.elasticsearch.common.Nullable; import org.elasticsearch.common.component.AbstractComponent; @@ -57,7 +56,7 @@ import java.util.concurrent.ThreadFactory; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; -import static org.elasticsearch.common.collect.MapBuilder.newMapBuilder; +import static java.util.Collections.unmodifiableMap; import static org.elasticsearch.common.settings.Settings.settingsBuilder; import static org.elasticsearch.common.unit.SizeValue.parseSizeValue; import static org.elasticsearch.common.unit.TimeValue.timeValueMinutes; @@ -89,7 +88,7 @@ public class ThreadPool extends AbstractComponent { public static final String THREADPOOL_GROUP = "threadpool."; - private volatile ImmutableMap executors; + private volatile Map executors; private final Map defaultExecutorTypeSettings; @@ -118,26 +117,38 @@ public class ThreadPool extends AbstractComponent { int availableProcessors = EsExecutors.boundedNumberOfProcessors(settings); int halfProcMaxAt5 = Math.min(((availableProcessors + 1) / 2), 5); int halfProcMaxAt10 = Math.min(((availableProcessors + 1) / 2), 10); - defaultExecutorTypeSettings = ImmutableMap.builder() - .put(Names.GENERIC, settingsBuilder().put("type", "cached").put("keep_alive", "30s").build()) - .put(Names.INDEX, settingsBuilder().put("type", "fixed").put("size", availableProcessors).put("queue_size", 200).build()) - .put(Names.BULK, settingsBuilder().put("type", "fixed").put("size", availableProcessors).put("queue_size", 50).build()) - .put(Names.GET, settingsBuilder().put("type", "fixed").put("size", availableProcessors).put("queue_size", 1000).build()) - .put(Names.SEARCH, settingsBuilder().put("type", "fixed").put("size", ((availableProcessors * 3) / 2) + 1).put("queue_size", 1000).build()) - .put(Names.SUGGEST, settingsBuilder().put("type", "fixed").put("size", availableProcessors).put("queue_size", 1000).build()) - .put(Names.PERCOLATE, settingsBuilder().put("type", "fixed").put("size", availableProcessors).put("queue_size", 1000).build()) - .put(Names.MANAGEMENT, settingsBuilder().put("type", "scaling").put("keep_alive", "5m").put("size", 5).build()) - // no queue as this means clients will need to handle rejections on listener queue even if the operation succeeded - // the assumption here is that the listeners should be very lightweight on the listeners side - .put(Names.LISTENER, settingsBuilder().put("type", "fixed").put("size", halfProcMaxAt10).build()) - .put(Names.FLUSH, settingsBuilder().put("type", "scaling").put("keep_alive", "5m").put("size", halfProcMaxAt5).build()) - .put(Names.REFRESH, settingsBuilder().put("type", "scaling").put("keep_alive", "5m").put("size", halfProcMaxAt10).build()) - .put(Names.WARMER, settingsBuilder().put("type", "scaling").put("keep_alive", "5m").put("size", halfProcMaxAt5).build()) - .put(Names.SNAPSHOT, settingsBuilder().put("type", "scaling").put("keep_alive", "5m").put("size", halfProcMaxAt5).build()) - .put(Names.OPTIMIZE, settingsBuilder().put("type", "fixed").put("size", 1).build()) - .put(Names.FETCH_SHARD_STARTED, settingsBuilder().put("type", "scaling").put("keep_alive", "5m").put("size", availableProcessors * 2).build()) - .put(Names.FETCH_SHARD_STORE, settingsBuilder().put("type", "scaling").put("keep_alive", "5m").put("size", availableProcessors * 2).build()) - .build(); + Map defaultExecutorTypeSettings = new HashMap<>(); + defaultExecutorTypeSettings.put(Names.GENERIC, settingsBuilder().put("type", "cached").put("keep_alive", "30s").build()); + defaultExecutorTypeSettings.put(Names.INDEX, + settingsBuilder().put("type", "fixed").put("size", availableProcessors).put("queue_size", 200).build()); + defaultExecutorTypeSettings.put(Names.BULK, + settingsBuilder().put("type", "fixed").put("size", availableProcessors).put("queue_size", 50).build()); + defaultExecutorTypeSettings.put(Names.GET, + settingsBuilder().put("type", "fixed").put("size", availableProcessors).put("queue_size", 1000).build()); + defaultExecutorTypeSettings.put(Names.SEARCH, + settingsBuilder().put("type", "fixed").put("size", ((availableProcessors * 3) / 2) + 1).put("queue_size", 1000).build()); + defaultExecutorTypeSettings.put(Names.SUGGEST, + settingsBuilder().put("type", "fixed").put("size", availableProcessors).put("queue_size", 1000).build()); + defaultExecutorTypeSettings.put(Names.PERCOLATE, + settingsBuilder().put("type", "fixed").put("size", availableProcessors).put("queue_size", 1000).build()); + defaultExecutorTypeSettings .put(Names.MANAGEMENT, settingsBuilder().put("type", "scaling").put("keep_alive", "5m").put("size", 5).build()); + // no queue as this means clients will need to handle rejections on listener queue even if the operation succeeded + // the assumption here is that the listeners should be very lightweight on the listeners side + defaultExecutorTypeSettings.put(Names.LISTENER, settingsBuilder().put("type", "fixed").put("size", halfProcMaxAt10).build()); + defaultExecutorTypeSettings.put(Names.FLUSH, + settingsBuilder().put("type", "scaling").put("keep_alive", "5m").put("size", halfProcMaxAt5).build()); + defaultExecutorTypeSettings.put(Names.REFRESH, + settingsBuilder().put("type", "scaling").put("keep_alive", "5m").put("size", halfProcMaxAt10).build()); + defaultExecutorTypeSettings.put(Names.WARMER, + settingsBuilder().put("type", "scaling").put("keep_alive", "5m").put("size", halfProcMaxAt5).build()); + defaultExecutorTypeSettings.put(Names.SNAPSHOT, + settingsBuilder().put("type", "scaling").put("keep_alive", "5m").put("size", halfProcMaxAt5).build()); + defaultExecutorTypeSettings.put(Names.OPTIMIZE, settingsBuilder().put("type", "fixed").put("size", 1).build()); + defaultExecutorTypeSettings.put(Names.FETCH_SHARD_STARTED, + settingsBuilder().put("type", "scaling").put("keep_alive", "5m").put("size", availableProcessors * 2).build()); + defaultExecutorTypeSettings.put(Names.FETCH_SHARD_STORE, + settingsBuilder().put("type", "scaling").put("keep_alive", "5m").put("size", availableProcessors * 2).build()); + this.defaultExecutorTypeSettings = unmodifiableMap(defaultExecutorTypeSettings); Map executors = new HashMap<>(); for (Map.Entry executor : defaultExecutorTypeSettings.entrySet()) { @@ -156,7 +167,7 @@ public class ThreadPool extends AbstractComponent { if (!executors.get(Names.GENERIC).info.getType().equals("cached")) { throw new IllegalArgumentException("generic thread pool must be of type cached"); } - this.executors = ImmutableMap.copyOf(executors); + this.executors = unmodifiableMap(executors); this.scheduler = new ScheduledThreadPoolExecutor(1, EsExecutors.daemonThreadFactory(settings, "scheduler"), new EsAbortPolicy()); this.scheduler.setExecuteExistingDelayedTasksAfterShutdownPolicy(false); this.scheduler.setContinueExistingPeriodicTasksAfterShutdownPolicy(false); @@ -446,7 +457,9 @@ public class ThreadPool extends AbstractComponent { ExecutorHolder oldExecutorHolder = executors.get(executor.getKey()); ExecutorHolder newExecutorHolder = rebuild(executor.getKey(), oldExecutorHolder, updatedSettings, executor.getValue()); if (!oldExecutorHolder.equals(newExecutorHolder)) { - executors = newMapBuilder(executors).put(executor.getKey(), newExecutorHolder).immutableMap(); + Map newExecutors = new HashMap<>(executors); + newExecutors.put(executor.getKey(), newExecutorHolder); + executors = unmodifiableMap(newExecutors); if (!oldExecutorHolder.executor().equals(newExecutorHolder.executor()) && oldExecutorHolder.executor() instanceof EsThreadPoolExecutor) { retiredExecutors.add(oldExecutorHolder); ((EsThreadPoolExecutor) oldExecutorHolder.executor()).shutdown(new ExecutorShutdownListener(oldExecutorHolder)); @@ -466,7 +479,9 @@ public class ThreadPool extends AbstractComponent { // case the settings contains a thread pool not defined in the initial settings in the constructor. The if // statement will then fail and so this prevents the addition of new thread groups at runtime, which is desired. if (!newExecutorHolder.equals(oldExecutorHolder)) { - executors = newMapBuilder(executors).put(entry.getKey(), newExecutorHolder).immutableMap(); + Map newExecutors = new HashMap<>(executors); + newExecutors.put(entry.getKey(), newExecutorHolder); + executors = unmodifiableMap(newExecutors); if (!oldExecutorHolder.executor().equals(newExecutorHolder.executor()) && oldExecutorHolder.executor() instanceof EsThreadPoolExecutor) { retiredExecutors.add(oldExecutorHolder); ((EsThreadPoolExecutor) oldExecutorHolder.executor()).shutdown(new ExecutorShutdownListener(oldExecutorHolder)); diff --git a/core/src/main/java/org/elasticsearch/transport/netty/NettyTransport.java b/core/src/main/java/org/elasticsearch/transport/netty/NettyTransport.java index 5cf9ed31d32..853497d59ae 100644 --- a/core/src/main/java/org/elasticsearch/transport/netty/NettyTransport.java +++ b/core/src/main/java/org/elasticsearch/transport/netty/NettyTransport.java @@ -19,8 +19,6 @@ package org.elasticsearch.transport.netty; -import java.nio.charset.StandardCharsets; -import com.google.common.collect.ImmutableMap; import org.elasticsearch.ExceptionsHelper; import org.elasticsearch.Version; import org.elasticsearch.cluster.node.DiscoveryNode; @@ -93,6 +91,7 @@ import java.net.InetSocketAddress; import java.net.SocketAddress; import java.net.UnknownHostException; import java.nio.channels.CancelledKeyException; +import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; @@ -115,6 +114,7 @@ import java.util.concurrent.locks.ReentrantReadWriteLock; import java.util.regex.Matcher; import java.util.regex.Pattern; +import static java.util.Collections.unmodifiableMap; import static org.elasticsearch.common.network.NetworkService.TcpSettings.TCP_BLOCKING; import static org.elasticsearch.common.network.NetworkService.TcpSettings.TCP_BLOCKING_CLIENT; import static org.elasticsearch.common.network.NetworkService.TcpSettings.TCP_BLOCKING_SERVER; @@ -340,7 +340,7 @@ public class NettyTransport extends AbstractLifecycleComponent implem @Override public Map profileBoundAddresses() { - return ImmutableMap.copyOf(profileBoundAddresses); + return unmodifiableMap(new HashMap<>(profileBoundAddresses)); } private InetSocketAddress createPublishAddress(String publishHost, int publishPort) { @@ -453,7 +453,7 @@ public class NettyTransport extends AbstractLifecycleComponent implem bindServerBootstrap(name, hostAddress, settings); } } - + private void bindServerBootstrap(final String name, final InetAddress hostAddress, Settings profileSettings) { String port = profileSettings.get("port"); @@ -657,15 +657,15 @@ public class NettyTransport extends AbstractLifecycleComponent implem @Override public TransportAddress[] addressesFromString(String address, int perAddressLimit) throws Exception { - return parse(address, settings.get("transport.profiles.default.port", - settings.get("transport.netty.port", - settings.get("transport.tcp.port", + return parse(address, settings.get("transport.profiles.default.port", + settings.get("transport.netty.port", + settings.get("transport.tcp.port", DEFAULT_PORT_RANGE))), perAddressLimit); } - + // this code is a take on guava's HostAndPort, like a HostAndPortRange - - // pattern for validating ipv6 bracked addresses. + + // pattern for validating ipv6 bracked addresses. // not perfect, but PortsRange should take care of any port range validation, not a regex private static final Pattern BRACKET_PATTERN = Pattern.compile("^\\[(.*:.*)\\](?::([\\d\\-]*))?$"); @@ -698,12 +698,12 @@ public class NettyTransport extends AbstractLifecycleComponent implem } } } - + // if port isn't specified, fill with the default if (portString == null || portString.isEmpty()) { portString = defaultPortRange; } - + // generate address for each port in the range Set addresses = new HashSet<>(Arrays.asList(InetAddress.getAllByName(host))); List transportAddresses = new ArrayList<>(); diff --git a/dev-tools/src/main/resources/forbidden/all-signatures.txt b/dev-tools/src/main/resources/forbidden/all-signatures.txt index 4f094cbe2e8..e8675acb1d2 100644 --- a/dev-tools/src/main/resources/forbidden/all-signatures.txt +++ b/dev-tools/src/main/resources/forbidden/all-signatures.txt @@ -135,6 +135,7 @@ com.google.common.collect.ImmutableMap#of(java.lang.Object, java.lang.Object, ja com.google.common.collect.ImmutableMap#of(java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Object) com.google.common.collect.ImmutableMap#of(java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Object) com.google.common.collect.ImmutableMap#of(java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Object) +com.google.common.collect.ImmutableMap#copyOf(java.util.Map) @defaultMessage Do not violate java's access system java.lang.reflect.AccessibleObject#setAccessible(boolean)