Skip to content

Commit 263ea5e

Browse files
authored
Replace generic HashSet / HashMap with more efficient EnumSet / EnumMap (#105238)
1 parent f426b68 commit 263ea5e

File tree

18 files changed

+51
-54
lines changed

18 files changed

+51
-54
lines changed

build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/docker/DockerSupportService.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,8 @@
2525
import java.nio.file.Paths;
2626
import java.util.Arrays;
2727
import java.util.Collections;
28+
import java.util.EnumSet;
2829
import java.util.HashMap;
29-
import java.util.HashSet;
3030
import java.util.List;
3131
import java.util.Locale;
3232
import java.util.Map;
@@ -75,7 +75,7 @@ public DockerAvailability getDockerAvailability() {
7575
Version version = null;
7676
boolean isVersionHighEnough = false;
7777
boolean isComposeAvailable = false;
78-
Set<Architecture> supportedArchitectures = new HashSet<>();
78+
Set<Architecture> supportedArchitectures = EnumSet.noneOf(Architecture.class);
7979

8080
// Check if the Docker binary exists
8181
final Optional<String> dockerBinary = getDockerPath();

build-tools/src/main/java/org/elasticsearch/gradle/OS.java

+5-5
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,10 @@
77
*/
88
package org.elasticsearch.gradle;
99

10-
import java.util.Arrays;
11-
import java.util.HashMap;
12-
import java.util.HashSet;
10+
import java.util.EnumMap;
11+
import java.util.EnumSet;
1312
import java.util.Map;
13+
import java.util.Set;
1414
import java.util.function.Supplier;
1515

1616
public enum OS {
@@ -34,7 +34,7 @@ public static OS current() {
3434

3535
public static class Conditional<T> {
3636

37-
private final Map<OS, Supplier<T>> conditions = new HashMap<>();
37+
private final Map<OS, Supplier<T>> conditions = new EnumMap<>(OS.class);
3838

3939
public Conditional<T> onWindows(Supplier<T> supplier) {
4040
conditions.put(WINDOWS, supplier);
@@ -58,7 +58,7 @@ public Conditional<T> onUnix(Supplier<T> supplier) {
5858
}
5959

6060
public T supply() {
61-
HashSet<OS> missingOS = new HashSet<>(Arrays.asList(OS.values()));
61+
Set<OS> missingOS = EnumSet.allOf(OS.class);
6262
missingOS.removeAll(conditions.keySet());
6363
if (missingOS.isEmpty() == false) {
6464
throw new IllegalArgumentException("No condition specified for " + missingOS);

libs/x-content/src/main/java/org/elasticsearch/xcontent/NamedXContentRegistry.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import org.elasticsearch.core.RestApiVersion;
1313

1414
import java.io.IOException;
15+
import java.util.EnumMap;
1516
import java.util.HashMap;
1617
import java.util.List;
1718
import java.util.Map;
@@ -95,7 +96,7 @@ private static Map<RestApiVersion, Map<Class<?>, Map<String, Entry>>> createRegi
9596
return emptyMap();
9697
}
9798

98-
Map<RestApiVersion, Map<Class<?>, Map<String, Entry>>> newRegistry = new HashMap<>();
99+
Map<RestApiVersion, Map<Class<?>, Map<String, Entry>>> newRegistry = new EnumMap<>(RestApiVersion.class);
99100
for (Entry entry : entries) {
100101
for (String name : entry.name.getAllNamesIncludedDeprecated()) {
101102
if (RestApiVersion.minimumSupported().matches(entry.restApiCompatibility)) {

plugins/analysis-nori/src/main/java/org/elasticsearch/plugin/analysis/nori/NoriPartOfSpeechStopFilterFactory.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
import org.elasticsearch.index.analysis.AbstractTokenFilterFactory;
1818
import org.elasticsearch.index.analysis.Analysis;
1919

20-
import java.util.HashSet;
20+
import java.util.EnumSet;
2121
import java.util.List;
2222
import java.util.Set;
2323

@@ -36,7 +36,7 @@ public TokenStream create(TokenStream tokenStream) {
3636
}
3737

3838
static Set<POS.Tag> resolvePOSList(List<String> tagList) {
39-
Set<POS.Tag> stopTags = new HashSet<>();
39+
Set<POS.Tag> stopTags = EnumSet.noneOf(POS.Tag.class);
4040
for (String tag : tagList) {
4141
stopTags.add(POS.resolveTag(tag));
4242
}

server/src/main/java/org/elasticsearch/action/admin/indices/get/GetIndexRequest.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020

2121
import java.io.IOException;
2222
import java.util.ArrayList;
23-
import java.util.HashSet;
23+
import java.util.EnumSet;
2424
import java.util.List;
2525
import java.util.Locale;
2626
import java.util.Map;
@@ -64,7 +64,7 @@ public static Feature fromId(byte id) {
6464
public static Feature[] fromRequest(RestRequest request) {
6565
if (request.hasParam("features")) {
6666
String[] featureNames = request.param("features").split(",");
67-
Set<Feature> features = new HashSet<>();
67+
Set<Feature> features = EnumSet.noneOf(Feature.class);
6868
List<String> invalidFeatures = new ArrayList<>();
6969
for (int k = 0; k < featureNames.length; k++) {
7070
try {

server/src/main/java/org/elasticsearch/health/HealthPeriodicLogger.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,8 @@
3333

3434
import java.io.Closeable;
3535
import java.time.Clock;
36+
import java.util.EnumSet;
3637
import java.util.HashMap;
37-
import java.util.HashSet;
3838
import java.util.List;
3939
import java.util.Locale;
4040
import java.util.Map;
@@ -198,7 +198,7 @@ private HealthPeriodicLogger(
198198
this.clock = Clock.systemUTC();
199199
this.pollInterval = POLL_INTERVAL_SETTING.get(settings);
200200
this.enabled = ENABLED_SETTING.get(settings);
201-
this.outputModes = new HashSet<>(OUTPUT_MODE_SETTING.get(settings));
201+
this.outputModes = EnumSet.copyOf(OUTPUT_MODE_SETTING.get(settings));
202202
this.meterRegistry = meterRegistry;
203203
this.metricWriter = metricWriter == null ? LongGaugeMetric::set : metricWriter;
204204
this.logWriter = logWriter == null ? logger::info : logWriter;
@@ -388,7 +388,7 @@ void writeMetrics(List<HealthIndicatorResult> healthIndicatorResults) {
388388
}
389389

390390
private void updateOutputModes(List<OutputMode> newMode) {
391-
this.outputModes = new HashSet<>(newMode);
391+
this.outputModes = EnumSet.copyOf(newMode);
392392
}
393393

394394
/**

server/src/main/java/org/elasticsearch/health/node/DiskHealthIndicatorService.java

+4-4
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030
import java.util.Arrays;
3131
import java.util.Collection;
3232
import java.util.Collections;
33-
import java.util.HashMap;
33+
import java.util.EnumMap;
3434
import java.util.HashSet;
3535
import java.util.List;
3636
import java.util.Locale;
@@ -145,9 +145,9 @@ static class DiskHealthAnalyzer {
145145
private final Set<String> blockedIndices;
146146
private final List<DiscoveryNode> dataNodes = new ArrayList<>();
147147
// In this context a master node, is a master node that cannot contain data.
148-
private final Map<HealthStatus, List<DiscoveryNode>> masterNodes = new HashMap<>();
148+
private final Map<HealthStatus, List<DiscoveryNode>> masterNodes = new EnumMap<>(HealthStatus.class);
149149
// In this context "other" nodes are nodes that cannot contain data and are not masters.
150-
private final Map<HealthStatus, List<DiscoveryNode>> otherNodes = new HashMap<>();
150+
private final Map<HealthStatus, List<DiscoveryNode>> otherNodes = new EnumMap<>(HealthStatus.class);
151151
private final Set<DiscoveryNodeRole> affectedRoles = new HashSet<>();
152152
private final Set<String> indicesAtRisk;
153153
private final HealthStatus healthStatus;
@@ -402,7 +402,7 @@ static Map<HealthStatus, Integer> countNodesByHealthStatus(
402402
Map<String, DiskHealthInfo> diskHealthInfoMap,
403403
ClusterState clusterState
404404
) {
405-
Map<HealthStatus, Integer> counts = new HashMap<>();
405+
Map<HealthStatus, Integer> counts = new EnumMap<>(HealthStatus.class);
406406
for (HealthStatus healthStatus : HealthStatus.values()) {
407407
counts.put(healthStatus, 0);
408408
}

server/src/main/java/org/elasticsearch/http/CorsHandler.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
import java.time.format.DateTimeFormatter;
4040
import java.util.Arrays;
4141
import java.util.Collections;
42+
import java.util.EnumSet;
4243
import java.util.HashSet;
4344
import java.util.LinkedHashSet;
4445
import java.util.List;
@@ -340,7 +341,7 @@ private static class Builder {
340341
private final boolean anyOrigin;
341342
private boolean allowCredentials = false;
342343
long maxAge;
343-
private final Set<RestRequest.Method> requestMethods = new HashSet<>();
344+
private final Set<RestRequest.Method> requestMethods = EnumSet.noneOf(RestRequest.Method.class);
344345
private final Set<String> requestHeaders = new HashSet<>();
345346
private final Set<String> accessControlExposeHeaders = new HashSet<>();
346347

server/src/main/java/org/elasticsearch/rest/MethodHandlers.java

+3-11
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
import org.elasticsearch.http.HttpRouteStats;
1313
import org.elasticsearch.http.HttpRouteStatsTracker;
1414

15-
import java.util.HashMap;
15+
import java.util.EnumMap;
1616
import java.util.Map;
1717
import java.util.Set;
1818

@@ -28,12 +28,7 @@ final class MethodHandlers {
2828

2929
MethodHandlers(String path) {
3030
this.path = path;
31-
32-
// by setting the loadFactor to 1, these maps are resized only when they *must* be, and the vast majority of these
33-
// maps contain only 1 or 2 entries anyway, so most of these maps are never resized at all and waste only 1 or 0
34-
// array references, while those few that contain 3 or 4 elements will have been resized just once and will still
35-
// waste only 1 or 0 array references
36-
this.methodHandlers = new HashMap<>(2, 1);
31+
this.methodHandlers = new EnumMap<>(RestRequest.Method.class);
3732
}
3833

3934
public String getPath() {
@@ -45,10 +40,7 @@ public String getPath() {
4540
* does not allow replacing the handler for an already existing method.
4641
*/
4742
MethodHandlers addMethod(RestRequest.Method method, RestApiVersion version, RestHandler handler) {
48-
RestHandler existing = methodHandlers
49-
// same sizing notes as 'methodHandlers' above, except that having a size here that's more than 1 is vanishingly
50-
// rare, so an initialCapacity of 1 with a loadFactor of 1 is perfect
51-
.computeIfAbsent(method, k -> new HashMap<>(1, 1))
43+
RestHandler existing = methodHandlers.computeIfAbsent(method, k -> new EnumMap<>(RestApiVersion.class))
5244
.putIfAbsent(version, handler);
5345
if (existing != null) {
5446
throw new IllegalArgumentException("Cannot replace existing handler for [" + path + "] for method: " + method);

server/src/main/java/org/elasticsearch/rest/RestController.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@
5151
import java.io.InputStream;
5252
import java.io.OutputStream;
5353
import java.util.Collections;
54-
import java.util.HashSet;
54+
import java.util.EnumSet;
5555
import java.util.Iterator;
5656
import java.util.List;
5757
import java.util.Locale;
@@ -734,7 +734,7 @@ public static void handleServerlessRequestToProtectedResource(String uri, RestRe
734734
* Get the valid set of HTTP methods for a REST request.
735735
*/
736736
private Set<RestRequest.Method> getValidHandlerMethodSet(String rawPath) {
737-
Set<RestRequest.Method> validMethods = new HashSet<>();
737+
Set<RestRequest.Method> validMethods = EnumSet.noneOf(RestRequest.Method.class);
738738
Iterator<MethodHandlers> allHandlers = getAllHandlers(null, rawPath);
739739
while (allHandlers.hasNext()) {
740740
final MethodHandlers methodHandlers = allHandlers.next();

test/test-clusters/src/main/java/org/elasticsearch/test/cluster/local/AbstractLocalSpecBuilder.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import org.elasticsearch.test.cluster.util.resource.Resource;
1818

1919
import java.util.ArrayList;
20+
import java.util.EnumSet;
2021
import java.util.HashMap;
2122
import java.util.HashSet;
2223
import java.util.List;
@@ -33,7 +34,7 @@ public abstract class AbstractLocalSpecBuilder<T extends LocalSpecBuilder<?>> im
3334
private final Map<String, String> environment = new HashMap<>();
3435
private final Set<String> modules = new HashSet<>();
3536
private final Set<String> plugins = new HashSet<>();
36-
private final Set<FeatureFlag> features = new HashSet<>();
37+
private final Set<FeatureFlag> features = EnumSet.noneOf(FeatureFlag.class);
3738
private final List<SettingsProvider> keystoreProviders = new ArrayList<>();
3839
private final Map<String, String> keystoreSettings = new HashMap<>();
3940
private final Map<String, Resource> keystoreFiles = new HashMap<>();

test/test-clusters/src/main/java/org/elasticsearch/test/cluster/util/OS.java

+5-5
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,10 @@
88

99
package org.elasticsearch.test.cluster.util;
1010

11-
import java.util.Arrays;
12-
import java.util.HashMap;
13-
import java.util.HashSet;
11+
import java.util.EnumMap;
12+
import java.util.EnumSet;
1413
import java.util.Map;
14+
import java.util.Set;
1515
import java.util.function.Consumer;
1616
import java.util.function.Supplier;
1717

@@ -36,7 +36,7 @@ public static OS current() {
3636

3737
public static class Conditional<T> {
3838

39-
private final Map<OS, Supplier<? extends T>> conditions = new HashMap<>();
39+
private final Map<OS, Supplier<? extends T>> conditions = new EnumMap<>(OS.class);
4040

4141
public Conditional<T> onWindows(Supplier<? extends T> supplier) {
4242
conditions.put(WINDOWS, supplier);
@@ -60,7 +60,7 @@ public Conditional<T> onUnix(Supplier<? extends T> supplier) {
6060
}
6161

6262
T supply() {
63-
HashSet<OS> missingOS = new HashSet<>(Arrays.asList(OS.values()));
63+
Set<OS> missingOS = EnumSet.allOf(OS.class);
6464
missingOS.removeAll(conditions.keySet());
6565
if (missingOS.isEmpty() == false) {
6666
throw new IllegalArgumentException("No condition specified for " + missingOS);

x-pack/plugin/ent-search/src/main/java/org/elasticsearch/xpack/application/EnterpriseSearchUsageTransportAction.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
import org.elasticsearch.xpack.core.application.EnterpriseSearchFeatureSetUsage;
4444

4545
import java.util.Collections;
46+
import java.util.EnumMap;
4647
import java.util.HashMap;
4748
import java.util.IntSummaryStatistics;
4849
import java.util.List;
@@ -224,7 +225,7 @@ private void addQueryRulesetUsage(ListQueryRulesetsAction.Response response, Map
224225
List<QueryRulesetListItem> results = response.queryPage().results();
225226
IntSummaryStatistics ruleStats = results.stream().mapToInt(QueryRulesetListItem::ruleTotalCount).summaryStatistics();
226227

227-
Map<QueryRuleCriteriaType, Integer> criteriaTypeCountMap = new HashMap<>();
228+
Map<QueryRuleCriteriaType, Integer> criteriaTypeCountMap = new EnumMap<>(QueryRuleCriteriaType.class);
228229
results.stream()
229230
.flatMap(result -> result.criteriaTypeToCountMap().entrySet().stream())
230231
.forEach(entry -> criteriaTypeCountMap.merge(entry.getKey(), entry.getValue(), Integer::sum));

x-pack/plugin/ent-search/src/main/java/org/elasticsearch/xpack/application/rules/QueryRulesIndexService.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@
4343
import java.util.ArrayList;
4444
import java.util.Arrays;
4545
import java.util.Collections;
46-
import java.util.HashMap;
46+
import java.util.EnumMap;
4747
import java.util.LinkedHashMap;
4848
import java.util.List;
4949
import java.util.Map;
@@ -340,7 +340,7 @@ private static QueryRulesetListItem hitToQueryRulesetListItem(SearchHit searchHi
340340
@SuppressWarnings("unchecked")
341341
final List<LinkedHashMap<?, ?>> rules = ((List<LinkedHashMap<?, ?>>) sourceMap.get(QueryRuleset.RULES_FIELD.getPreferredName()));
342342
final int numRules = rules.size();
343-
final Map<QueryRuleCriteriaType, Integer> queryRuleCriteriaTypeToCountMap = new HashMap<>();
343+
final Map<QueryRuleCriteriaType, Integer> queryRuleCriteriaTypeToCountMap = new EnumMap<>(QueryRuleCriteriaType.class);
344344
for (LinkedHashMap<?, ?> rule : rules) {
345345
@SuppressWarnings("unchecked")
346346
List<LinkedHashMap<?, ?>> criteriaList = ((List<LinkedHashMap<?, ?>>) rule.get(QueryRule.CRITERIA_FIELD.getPreferredName()));

x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/MachineLearningUsageTransportAction.java

+9-8
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@
5757

5858
import java.time.Instant;
5959
import java.util.Collections;
60+
import java.util.EnumMap;
6061
import java.util.HashMap;
6162
import java.util.LinkedHashMap;
6263
import java.util.List;
@@ -273,18 +274,18 @@ private void addJobsUsage(GetJobsStatsAction.Response response, List<Job> jobs,
273274
StatsAccumulator allJobsModelSizeStats = new StatsAccumulator();
274275
ForecastStats allJobsForecastStats = new ForecastStats();
275276

276-
Map<JobState, Counter> jobCountByState = new HashMap<>();
277-
Map<JobState, StatsAccumulator> detectorStatsByState = new HashMap<>();
278-
Map<JobState, StatsAccumulator> modelSizeStatsByState = new HashMap<>();
279-
Map<JobState, ForecastStats> forecastStatsByState = new HashMap<>();
280-
Map<JobState, Map<String, Long>> createdByByState = new HashMap<>();
277+
Map<JobState, Counter> jobCountByState = new EnumMap<>(JobState.class);
278+
Map<JobState, StatsAccumulator> detectorStatsByState = new EnumMap<>(JobState.class);
279+
Map<JobState, StatsAccumulator> modelSizeStatsByState = new EnumMap<>(JobState.class);
280+
Map<JobState, ForecastStats> forecastStatsByState = new EnumMap<>(JobState.class);
281+
Map<JobState, Map<String, Long>> createdByByState = new EnumMap<>(JobState.class);
281282

282283
List<GetJobsStatsAction.Response.JobStats> jobsStats = response.getResponse().results();
283284
Map<String, Job> jobMap = jobs.stream().collect(Collectors.toMap(Job::getId, item -> item));
284285
Map<String, Long> allJobsCreatedBy = jobs.stream()
285286
.map(MachineLearningUsageTransportAction::jobCreatedBy)
286287
.collect(Collectors.groupingBy(item -> item, Collectors.counting()));
287-
;
288+
288289
for (GetJobsStatsAction.Response.JobStats jobStats : jobsStats) {
289290
Job job = jobMap.get(jobStats.getJobId());
290291
if (job == null) {
@@ -354,7 +355,7 @@ private static Map<String, Object> createJobUsageEntry(
354355
}
355356

356357
private static void addDatafeedsUsage(GetDatafeedsStatsAction.Response response, Map<String, Object> datafeedsUsage) {
357-
Map<DatafeedState, Counter> datafeedCountByState = new HashMap<>();
358+
Map<DatafeedState, Counter> datafeedCountByState = new EnumMap<>(DatafeedState.class);
358359

359360
List<GetDatafeedsStatsAction.Response.DatafeedStats> datafeedsStats = response.getResponse().results();
360361
for (GetDatafeedsStatsAction.Response.DatafeedStats datafeedStats : datafeedsStats) {
@@ -380,7 +381,7 @@ private static void addDataFrameAnalyticsStatsUsage(
380381
GetDataFrameAnalyticsStatsAction.Response response,
381382
Map<String, Object> dataframeAnalyticsUsage
382383
) {
383-
Map<DataFrameAnalyticsState, Counter> dataFrameAnalyticsStateCounterMap = new HashMap<>();
384+
Map<DataFrameAnalyticsState, Counter> dataFrameAnalyticsStateCounterMap = new EnumMap<>(DataFrameAnalyticsState.class);
384385

385386
StatsAccumulator memoryUsagePeakBytesStats = new StatsAccumulator();
386387
for (GetDataFrameAnalyticsStatsAction.Response.Stats stats : response.getResponse().results()) {

x-pack/plugin/transform/src/main/java/org/elasticsearch/xpack/transform/action/TransportUpgradeTransformsAction.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@
4646
import java.util.ArrayDeque;
4747
import java.util.Collections;
4848
import java.util.Deque;
49-
import java.util.HashMap;
49+
import java.util.EnumMap;
5050
import java.util.Map;
5151

5252
public class TransportUpgradeTransformsAction extends TransportMasterNodeAction<Request, Response> {
@@ -223,7 +223,7 @@ private void recursiveExpandTransformIdsAndUpgrade(
223223
return;
224224
}
225225

226-
Map<UpdateResult.Status, Long> updatesByStatus = new HashMap<>();
226+
Map<UpdateResult.Status, Long> updatesByStatus = new EnumMap<>(UpdateResult.Status.class);
227227
updatesByStatus.put(UpdateResult.Status.NONE, totalAndIds.v1() - totalAndIds.v2().size());
228228

229229
Deque<String> ids = new ArrayDeque<>(totalAndIds.v2());

x-pack/plugin/watcher/src/main/java/org/elasticsearch/xpack/watcher/trigger/schedule/support/WeekTimes.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,7 @@ static DayOfWeek parseDayValue(XContentParser parser, XContentParser.Token token
158158

159159
public static class Builder {
160160

161-
private final Set<DayOfWeek> days = new HashSet<>();
161+
private final Set<DayOfWeek> days = EnumSet.noneOf(DayOfWeek.class);
162162
private final Set<DayTimes> times = new HashSet<>();
163163

164164
private Builder() {}

0 commit comments

Comments
 (0)