From cb2a2980bd0e8dfc03d40c204c44fb0d5e6cbe95 Mon Sep 17 00:00:00 2001 From: Dave Marion Date: Tue, 7 Jul 2026 20:17:59 +0000 Subject: [PATCH] Provide a better initial size for collections if possible --- .../core/clientImpl/ActiveCompactionImpl.java | 2 +- .../core/clientImpl/ClientTabletCache.java | 2 +- .../clientImpl/ClientTabletCacheImpl.java | 6 ++- .../clientImpl/ConditionalWriterImpl.java | 21 +++++---- .../clientImpl/InstanceOperationsImpl.java | 47 ++++++++++++------- .../core/clientImpl/OfflineIterator.java | 1 + .../clientImpl/RootClientTabletCache.java | 3 +- .../clientImpl/SyncingClientTabletCache.java | 3 +- .../core/clientImpl/TableOperationsImpl.java | 6 +-- .../TabletInformationCollector.java | 2 +- .../TabletServerBatchReaderIterator.java | 12 ++--- .../core/clientImpl/ThriftTransportPool.java | 6 +-- .../clientImpl/TimeoutClientTabletCache.java | 3 +- .../accumulo/core/clientImpl/bulk/Bulk.java | 7 ++- .../core/clientImpl/bulk/BulkImport.java | 8 ++-- .../accumulo/core/lock/ServiceLockPaths.java | 2 +- .../manager/balancer/BalanceParamsImpl.java | 2 +- .../RatioBasedCompactionPlanner.java | 2 +- .../core/spi/scan/ScanServersSnapshot.java | 2 +- .../compaction/ExternalCompactionUtil.java | 5 +- .../clientImpl/ClientTabletCacheImplTest.java | 4 +- .../accumulo/server/fs/FileManager.java | 2 +- .../server/manager/LiveTServerSet.java | 7 +-- .../ConditionalTabletsMutatorImpl.java | 11 +++-- .../security/AuditedSecurityOperation.java | 3 +- .../accumulo/server/split/SplitUtils.java | 2 +- .../org/apache/accumulo/manager/Manager.java | 2 +- .../manager/ManagerClientServiceHandler.java | 2 +- .../tableOps/bulkVer2/BulkImportMove.java | 2 +- .../manager/tableOps/bulkVer2/LoadFiles.java | 12 ++--- .../tableOps/bulkVer2/TabletRefresher.java | 3 +- .../org/apache/accumulo/tserver/RowLocks.java | 1 + .../apache/accumulo/tserver/ScanServer.java | 11 +++-- .../accumulo/tserver/TabletClientHandler.java | 9 ++-- .../accumulo/tserver/log/DfsLogger.java | 3 +- 35 files changed, 124 insertions(+), 92 deletions(-) diff --git a/core/src/main/java/org/apache/accumulo/core/clientImpl/ActiveCompactionImpl.java b/core/src/main/java/org/apache/accumulo/core/clientImpl/ActiveCompactionImpl.java index 08a1c5f4017..56b66cc2a6e 100644 --- a/core/src/main/java/org/apache/accumulo/core/clientImpl/ActiveCompactionImpl.java +++ b/core/src/main/java/org/apache/accumulo/core/clientImpl/ActiveCompactionImpl.java @@ -104,7 +104,7 @@ public long getPausedCount() { @Override public List getIterators() { - ArrayList ret = new ArrayList<>(); + ArrayList ret = new ArrayList<>(tac.getSsiListSize()); for (IterInfo ii : tac.getSsiList()) { IteratorSetting settings = diff --git a/core/src/main/java/org/apache/accumulo/core/clientImpl/ClientTabletCache.java b/core/src/main/java/org/apache/accumulo/core/clientImpl/ClientTabletCache.java index 37cd2936156..f671dcb27c1 100644 --- a/core/src/main/java/org/apache/accumulo/core/clientImpl/ClientTabletCache.java +++ b/core/src/main/java/org/apache/accumulo/core/clientImpl/ClientTabletCache.java @@ -116,7 +116,7 @@ public CachedTablet findTablet(ClientContext context, Text row, boolean skipRow, } public abstract void binMutations(ClientContext context, List mutations, - Map> binnedMutations, List failures) + Map> binnedMutations, ArrayList failures) throws AccumuloException, AccumuloSecurityException, TableNotFoundException, InvalidTabletHostingRequestException; diff --git a/core/src/main/java/org/apache/accumulo/core/clientImpl/ClientTabletCacheImpl.java b/core/src/main/java/org/apache/accumulo/core/clientImpl/ClientTabletCacheImpl.java index 814c4b856f6..ed95bc366d6 100644 --- a/core/src/main/java/org/apache/accumulo/core/clientImpl/ClientTabletCacheImpl.java +++ b/core/src/main/java/org/apache/accumulo/core/clientImpl/ClientTabletCacheImpl.java @@ -219,7 +219,7 @@ public ClientTabletCacheImpl(TableId tableId, ClientTabletCache parent, CachedTa @Override public void binMutations(ClientContext context, List mutations, - Map> binnedMutations, List failures) + Map> binnedMutations, ArrayList failures) throws AccumuloException, AccumuloSecurityException, TableNotFoundException, InvalidTabletHostingRequestException { @@ -257,6 +257,8 @@ public void binMutations(ClientContext context, List mut notInCache.sort((o1, o2) -> WritableComparator.compareBytes(o1.getRow(), 0, o1.getRow().length, o2.getRow(), 0, o2.getRow().length)); + failures.ensureCapacity(failures.size() + notInCache.size()); + // Want to ignore any entries in the cache w/o a location that were created before the // following time. Entries created after the following time may have been populated by the // following loop, and we want to use those. @@ -635,7 +637,7 @@ private void requestTabletHosting(ClientContext context, return; } - List extentsToBringOnline = new ArrayList<>(); + List extentsToBringOnline = new ArrayList<>(tabletsWithNoLocation.size()); for (var cachedTablet : tabletsWithNoLocation) { if (cachedTablet.getCreationTimer().elapsed().compareTo(STALE_DURATION) < 0) { if (cachedTablet.getAvailability() == TabletAvailability.ONDEMAND) { diff --git a/core/src/main/java/org/apache/accumulo/core/clientImpl/ConditionalWriterImpl.java b/core/src/main/java/org/apache/accumulo/core/clientImpl/ConditionalWriterImpl.java index d5417c4fbcb..2335196cc66 100644 --- a/core/src/main/java/org/apache/accumulo/core/clientImpl/ConditionalWriterImpl.java +++ b/core/src/main/java/org/apache/accumulo/core/clientImpl/ConditionalWriterImpl.java @@ -286,7 +286,7 @@ private void queueRetry(List mutations, HostAndPort server) { } private void queue(List mutations) { - List failures = new ArrayList<>(); + ArrayList failures = new ArrayList<>(); Map> binnedMutations = new HashMap<>(); try { @@ -349,7 +349,7 @@ private void reschedule(SendTask task) { private TabletServerMutations dequeue(String location) { var queue = getServerQueue(location).queue; - var mutations = new ArrayList>(); + var mutations = new ArrayList>(queue.size()); queue.drainTo(mutations); if (mutations.isEmpty()) { @@ -363,8 +363,10 @@ private TabletServerMutations dequeue(String location) { TabletServerMutations tsm = mutations.get(0); for (int i = 1; i < mutations.size(); i++) { - mutations.get(i).getMutations().forEach((keyExtent, mutationList) -> tsm.getMutations() - .computeIfAbsent(keyExtent, k -> new ArrayList<>()).addAll(mutationList)); + mutations.get(i).getMutations() + .forEach((keyExtent, mutationList) -> tsm.getMutations() + .computeIfAbsent(keyExtent, k -> new ArrayList<>(mutationList.size())) + .addAll(mutationList)); } return tsm; @@ -388,7 +390,7 @@ private TabletServerMutations dequeue(String location) { this.classLoaderContext = config.getClassLoaderContext(); Runnable failureHandler = () -> { - List mutations = new ArrayList<>(); + List mutations = new ArrayList<>(failedMutations.size()); failedMutations.drainTo(mutations); if (!mutations.isEmpty()) { queue(mutations); @@ -545,7 +547,7 @@ private void unreserveSessionID(HostAndPort location) { } List getActiveSessions() { - ArrayList activeSessions = new ArrayList<>(); + ArrayList activeSessions = new ArrayList<>(cachedSessionIDs.values().size() / 2); for (SessionID sid : cachedSessionIDs.values()) { if (sid.isActive()) { activeSessions.add(sid); @@ -638,8 +640,9 @@ private void sendToServer(HostAndPort location, TabletServerMutations cmidToCm, HostAndPort location) { - ArrayList ignored = new ArrayList<>(); - for (CMK cmk : cmidToCm.values()) { + var values = cmidToCm.values(); + ArrayList ignored = new ArrayList<>(values.size()); + for (CMK cmk : values) { ignored.add(cmk.cm); } queueRetry(ignored, location); @@ -742,7 +745,7 @@ private void convertMutations(TabletServerMutations mutations, Map { - var tcondMutaions = new ArrayList(); + var tcondMutaions = new ArrayList(mutationList.size()); for (var cm : mutationList) { var id = cmid.longValue(); diff --git a/core/src/main/java/org/apache/accumulo/core/clientImpl/InstanceOperationsImpl.java b/core/src/main/java/org/apache/accumulo/core/clientImpl/InstanceOperationsImpl.java index ec5af824aa0..85d660ca28a 100644 --- a/core/src/main/java/org/apache/accumulo/core/clientImpl/InstanceOperationsImpl.java +++ b/core/src/main/java/org/apache/accumulo/core/clientImpl/InstanceOperationsImpl.java @@ -240,28 +240,30 @@ public List getManagerLocations() { @Override @Deprecated(since = "4.0.0") public Set getCompactors() { - Set results = new HashSet<>(); - context.getServerPaths().getCompactor(ResourceGroupPredicate.ANY, AddressSelector.all(), true) - .forEach(t -> results.add(t.getServer())); + var compactors = context.getServerPaths().getCompactor(ResourceGroupPredicate.ANY, + AddressSelector.all(), true); + Set results = new HashSet<>(compactors.size(), 1.0f); + compactors.forEach(t -> results.add(t.getServer())); return results; } @Override @Deprecated(since = "4.0.0") public Set getScanServers() { - Set results = new HashSet<>(); - context.getServerPaths().getScanServer(ResourceGroupPredicate.ANY, AddressSelector.all(), true) - .forEach(t -> results.add(t.getServer())); + var sservers = context.getServerPaths().getScanServer(ResourceGroupPredicate.ANY, + AddressSelector.all(), true); + Set results = new HashSet<>(sservers.size(), 1.f); + sservers.forEach(t -> results.add(t.getServer())); return results; } @Override @Deprecated(since = "4.0.0") public List getTabletServers() { - List results = new ArrayList<>(); - context.getServerPaths() - .getTabletServer(ResourceGroupPredicate.ANY, AddressSelector.all(), true) - .forEach(t -> results.add(t.getServer())); + var tserverLocks = context.getServerPaths().getTabletServer(ResourceGroupPredicate.ANY, + AddressSelector.all(), true); + List results = new ArrayList<>(tserverLocks.size()); + tserverLocks.forEach(t -> results.add(t.getServer())); return results; } @@ -556,18 +558,22 @@ public Set getServers(ServerId.Type type, private Set getServers(ServerId.Type type, Predicate resourceGroupPredicate, AddressSelector addressSelector) { - final Set results = new HashSet<>(); + final Set results; switch (type) { case COMPACTOR: - context.getServerPaths().getCompactor(resourceGroupPredicate::test, addressSelector, true) - .forEach(c -> results.add(createServerId(type, c))); + var compactors = context.getServerPaths().getCompactor(resourceGroupPredicate::test, + addressSelector, true); + results = new HashSet<>(compactors.size(), 1.0f); + compactors.forEach(c -> results.add(createServerId(type, c))); break; case MANAGER: + results = new HashSet<>(); context.getServerPaths().getAssistantManagers(addressSelector, true) .forEach(s -> results.add(createServerId(type, s))); break; case MONITOR: + results = new HashSet<>(); ServiceLockPath mon = context.getServerPaths().getMonitor(true); if (mon != null) { Optional sld = context.getZooCache().getLockData(mon); @@ -582,6 +588,7 @@ private Set getServers(ServerId.Type type, } break; case GARBAGE_COLLECTOR: + results = new HashSet<>(); ServiceLockPath gc = context.getServerPaths().getGarbageCollector(true); if (gc != null) { Optional sld = context.getZooCache().getLockData(gc); @@ -596,15 +603,19 @@ private Set getServers(ServerId.Type type, } break; case SCAN_SERVER: - context.getServerPaths().getScanServer(resourceGroupPredicate::test, addressSelector, true) - .forEach(s -> results.add(createServerId(type, s))); + var sservers = context.getServerPaths().getScanServer(resourceGroupPredicate::test, + addressSelector, true); + results = new HashSet<>(sservers.size(), 1.0f); + sservers.forEach(s -> results.add(createServerId(type, s))); break; case TABLET_SERVER: - context.getServerPaths() - .getTabletServer(resourceGroupPredicate::test, addressSelector, true) - .forEach(t -> results.add(createServerId(type, t))); + var tservers = context.getServerPaths().getTabletServer(resourceGroupPredicate::test, + addressSelector, true); + results = new HashSet<>(tservers.size(), 1.0f); + tservers.forEach(t -> results.add(createServerId(type, t))); break; default: + results = new HashSet<>(); break; } diff --git a/core/src/main/java/org/apache/accumulo/core/clientImpl/OfflineIterator.java b/core/src/main/java/org/apache/accumulo/core/clientImpl/OfflineIterator.java index 8a6e019d75e..3750098ed9f 100644 --- a/core/src/main/java/org/apache/accumulo/core/clientImpl/OfflineIterator.java +++ b/core/src/main/java/org/apache/accumulo/core/clientImpl/OfflineIterator.java @@ -233,6 +233,7 @@ private SortedKeyValueIterator createIterator(KeyExtent extent, if (scannerSamplerConfigImpl != null && !scannerSamplerConfigImpl.equals(samplerConfImpl)) { throw new SampleNotPresentException(); } + readers.ensureCapacity(absFiles.size()); for (StoredTabletFile file : absFiles) { var cs = CryptoFactoryLoader.getServiceForClientWithTable(systemConf, tableConf, tableId); FileSystem fs = VolumeConfiguration.fileSystemForPath(file.getNormalizedPathStr(), conf); diff --git a/core/src/main/java/org/apache/accumulo/core/clientImpl/RootClientTabletCache.java b/core/src/main/java/org/apache/accumulo/core/clientImpl/RootClientTabletCache.java index f2197870aa4..47fccc4c679 100644 --- a/core/src/main/java/org/apache/accumulo/core/clientImpl/RootClientTabletCache.java +++ b/core/src/main/java/org/apache/accumulo/core/clientImpl/RootClientTabletCache.java @@ -22,6 +22,7 @@ import static java.nio.charset.StandardCharsets.UTF_8; import static java.util.concurrent.TimeUnit.MILLISECONDS; +import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.List; @@ -67,7 +68,7 @@ public class RootClientTabletCache extends ClientTabletCache { @Override public void binMutations(ClientContext context, List mutations, - Map> binnedMutations, List failures) { + Map> binnedMutations, ArrayList failures) { CachedTablet rootCachedTablet = getRootTabletLocation(context); if (rootCachedTablet != null && rootCachedTablet.getTserverLocation().isPresent()) { var tsm = new TabletServerMutations(rootCachedTablet.getTserverSession().orElseThrow()); diff --git a/core/src/main/java/org/apache/accumulo/core/clientImpl/SyncingClientTabletCache.java b/core/src/main/java/org/apache/accumulo/core/clientImpl/SyncingClientTabletCache.java index ffc2c0c5485..8c11ad2851e 100644 --- a/core/src/main/java/org/apache/accumulo/core/clientImpl/SyncingClientTabletCache.java +++ b/core/src/main/java/org/apache/accumulo/core/clientImpl/SyncingClientTabletCache.java @@ -18,6 +18,7 @@ */ package org.apache.accumulo.core.clientImpl; +import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Map; @@ -76,7 +77,7 @@ public CachedTablet findTablet(ClientContext context, Text row, boolean skipRow, @Override public void binMutations(ClientContext context, List mutations, - Map> binnedMutations, List failures) + Map> binnedMutations, ArrayList failures) throws AccumuloException, AccumuloSecurityException, TableNotFoundException, InvalidTabletHostingRequestException { syncLocator().binMutations(context, mutations, binnedMutations, failures); diff --git a/core/src/main/java/org/apache/accumulo/core/clientImpl/TableOperationsImpl.java b/core/src/main/java/org/apache/accumulo/core/clientImpl/TableOperationsImpl.java index d9f3659eef9..67ff4e8d94d 100644 --- a/core/src/main/java/org/apache/accumulo/core/clientImpl/TableOperationsImpl.java +++ b/core/src/main/java/org/apache/accumulo/core/clientImpl/TableOperationsImpl.java @@ -509,7 +509,7 @@ public void putSplits(String tableName, SortedMap split Map> tabletSplits = splitsToTablets.newSplits; Map existingSplits = splitsToTablets.existingSplits; - List> futures = new ArrayList<>(); + List> futures = new ArrayList<>(existingSplits.size()); // Handle existing updates if (!existingSplits.isEmpty()) { @@ -881,7 +881,7 @@ public void flush(String tableName, Text start, Text end, boolean wait) @Override public void compact(String tableName, Text start, Text end, boolean flush, boolean wait) throws AccumuloSecurityException, TableNotFoundException, AccumuloException { - compact(tableName, start, end, new ArrayList<>(), flush, wait); + compact(tableName, start, end, List.of(), flush, wait); } @Override @@ -1616,7 +1616,7 @@ public List getDiskUsage(Set tableNames) } } - List finalUsages = new ArrayList<>(); + List finalUsages = new ArrayList<>(diskUsages.size()); for (TDiskUsage diskUsage : diskUsages) { finalUsages.add(new DiskUsage(new TreeSet<>(diskUsage.getTables()), diskUsage.getUsage())); } diff --git a/core/src/main/java/org/apache/accumulo/core/clientImpl/TabletInformationCollector.java b/core/src/main/java/org/apache/accumulo/core/clientImpl/TabletInformationCollector.java index 5e29b52c6b6..96243226554 100644 --- a/core/src/main/java/org/apache/accumulo/core/clientImpl/TabletInformationCollector.java +++ b/core/src/main/java/org/apache/accumulo/core/clientImpl/TabletInformationCollector.java @@ -77,7 +77,7 @@ public static Stream getTabletInformation(ClientContext conte } }); - List> tabletStreams = new ArrayList<>(); + List> tabletStreams = new ArrayList<>(mergedRanges.size()); for (RowRange rowRange : mergedRanges) { Text startRow = rowRange.getLowerBound(); diff --git a/core/src/main/java/org/apache/accumulo/core/clientImpl/TabletServerBatchReaderIterator.java b/core/src/main/java/org/apache/accumulo/core/clientImpl/TabletServerBatchReaderIterator.java index a5803471257..26435463727 100644 --- a/core/src/main/java/org/apache/accumulo/core/clientImpl/TabletServerBatchReaderIterator.java +++ b/core/src/main/java/org/apache/accumulo/core/clientImpl/TabletServerBatchReaderIterator.java @@ -323,9 +323,9 @@ private ScanServerData binRanges(ClientTabletCache clientTabletCache, List>> binnedRanges2 = new HashMap<>(); + Map>> binnedRanges2 = new HashMap<>(binnedRanges.size(), 1.0f); for (Entry>> entry : binnedRanges.entrySet()) { - Map> tabletMap = new HashMap<>(); + Map> tabletMap = new HashMap<>(entry.getValue().size(), 1.0f); binnedRanges2.put(entry.getKey(), tabletMap); for (Entry> tabletRanges : entry.getValue().entrySet()) { Range tabletRange = tabletRanges.getKey().toDataRange(); @@ -663,10 +663,10 @@ private ScanServerData binRangesForScanServers(ClientTabletCache clientTabletCac AccumuloSecurityException, InvalidTabletHostingRequestException { ScanServerSelector ecsm = context.getScanServerSelector(); - Map extentToTserverMap = new HashMap<>(); - Map> extentToRangesMap = new HashMap<>(); + Map extentToTserverMap = new HashMap<>(ranges.size()); + Map> extentToRangesMap = new HashMap<>(ranges.size()); - Set tabletIds = new HashSet<>(); + Set tabletIds = new HashSet<>(ranges.size()); List failures = clientTabletCache.findTablets(context, ranges, (cachedTablet, range) -> { if (cachedTablet.getTserverLocation().isPresent()) { @@ -712,7 +712,7 @@ public Optional waitUntil(Supplier> condition, Duration maxWa var actions = ecsm.selectServers(params); - Map reporters = new HashMap<>(); + Map reporters = new HashMap<>(tabletIds.size()); failures = new ArrayList<>(); diff --git a/core/src/main/java/org/apache/accumulo/core/clientImpl/ThriftTransportPool.java b/core/src/main/java/org/apache/accumulo/core/clientImpl/ThriftTransportPool.java index 0841fbc2ea0..8d174422980 100644 --- a/core/src/main/java/org/apache/accumulo/core/clientImpl/ThriftTransportPool.java +++ b/core/src/main/java/org/apache/accumulo/core/clientImpl/ThriftTransportPool.java @@ -144,9 +144,9 @@ public TTransport getTransport(ThriftClientTypes type, HostAndPort location, public Pair getAnyCachedTransport(ThriftClientTypes type) { - final List serversSet = new ArrayList<>(); - - for (ThriftTransportKey ttk : connectionPool.getThriftTransportKeys()) { + var keys = connectionPool.getThriftTransportKeys(); + final List serversSet = new ArrayList<>(keys.size()); + for (ThriftTransportKey ttk : keys) { if (ttk.getType().equals(type)) { serversSet.add(ttk); } diff --git a/core/src/main/java/org/apache/accumulo/core/clientImpl/TimeoutClientTabletCache.java b/core/src/main/java/org/apache/accumulo/core/clientImpl/TimeoutClientTabletCache.java index 77c93de7d4c..498849c0a94 100644 --- a/core/src/main/java/org/apache/accumulo/core/clientImpl/TimeoutClientTabletCache.java +++ b/core/src/main/java/org/apache/accumulo/core/clientImpl/TimeoutClientTabletCache.java @@ -18,6 +18,7 @@ */ package org.apache.accumulo.core.clientImpl; +import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -84,7 +85,7 @@ public CachedTablet findTablet(ClientContext context, Text row, boolean skipRow, @Override public void binMutations(ClientContext context, List mutations, - Map> binnedMutations, List failures) + Map> binnedMutations, ArrayList failures) throws AccumuloException, AccumuloSecurityException, TableNotFoundException, InvalidTabletHostingRequestException { try { diff --git a/core/src/main/java/org/apache/accumulo/core/clientImpl/bulk/Bulk.java b/core/src/main/java/org/apache/accumulo/core/clientImpl/bulk/Bulk.java index 08969712037..f592be2e906 100644 --- a/core/src/main/java/org/apache/accumulo/core/clientImpl/bulk/Bulk.java +++ b/core/src/main/java/org/apache/accumulo/core/clientImpl/bulk/Bulk.java @@ -167,13 +167,16 @@ public int hashCode() { } public static class Files implements Iterable { - final Map files = new HashMap<>(); + final Map files; public Files(Collection files) { + this.files = new HashMap<>(files.size(), 1.0f); files.forEach(this::add); } - public Files() {} + public Files() { + this.files = new HashMap<>(); + } public void add(FileInfo fi) { if (files.putIfAbsent(fi.name, fi) != null) { diff --git a/core/src/main/java/org/apache/accumulo/core/clientImpl/bulk/BulkImport.java b/core/src/main/java/org/apache/accumulo/core/clientImpl/bulk/BulkImport.java index 3bc807f0d49..9a925de345e 100644 --- a/core/src/main/java/org/apache/accumulo/core/clientImpl/bulk/BulkImport.java +++ b/core/src/main/java/org/apache/accumulo/core/clientImpl/bulk/BulkImport.java @@ -373,7 +373,7 @@ public static List findOverlappingTablets(ClientContext context, } private static Map getFileLenMap(List statuses) { - HashMap fileLens = new HashMap<>(); + HashMap fileLens = new HashMap<>(statuses.size(), 1.0f); for (FileStatus status : statuses) { fileLens.put(status.getPath().getName(), status.getLen()); } @@ -385,7 +385,7 @@ private static Cache getPopulatedFileLenCache(ClientContext ctx, Pa List statuses) { Map fileLens = getFileLenMap(statuses); - Map absFileLens = new HashMap<>(); + Map absFileLens = new HashMap<>(fileLens.size(), 1.0f); fileLens.forEach((k, v) -> absFileLens.put(pathToCacheId(new Path(dir, k)), v)); Cache fileLenCache = @@ -548,7 +548,7 @@ public SortedMap computeFileToTabletMappings(FileSystem fs // trips to the namenode Cache fileLensCache = getPopulatedFileLenCache(context, dirPath, files); - List>> futures = new ArrayList<>(); + List>> futures = new ArrayList<>(files.size()); CryptoService cs = CryptoFactoryLoader.getServiceForClientWithTable( context.instanceOperations().getSystemConfiguration(), tableProps, tableId); @@ -564,7 +564,7 @@ public SortedMap computeFileToTabletMappings(FileSystem fs checkTabletCount(maxTablets, extents.size(), file.toString()); Map estSizes = estimateSizes(context.getConfiguration(), file, fileStatus.getLen(), extents, fs, fileLensCache, cs); - Map pathLocations = new HashMap<>(); + Map pathLocations = new HashMap<>(extents.size(), 1.0f); for (KeyExtent ke : extents) { pathLocations.put(ke, new Bulk.FileInfo(file.getPath(), estSizes.getOrDefault(ke, 0L))); } diff --git a/core/src/main/java/org/apache/accumulo/core/lock/ServiceLockPaths.java b/core/src/main/java/org/apache/accumulo/core/lock/ServiceLockPaths.java index d197ef22569..cd9c3cab6d8 100644 --- a/core/src/main/java/org/apache/accumulo/core/lock/ServiceLockPaths.java +++ b/core/src/main/java/org/apache/accumulo/core/lock/ServiceLockPaths.java @@ -464,7 +464,7 @@ private Set get(final String serverType, // thread. Executor executor = servers.size() > 64 ? fetchExectuor : MoreExecutors.directExecutor(); - List> futures = new ArrayList<>(); + List> futures = new ArrayList<>(servers.size()); for (final String server : servers) { if (addressPredicate.test(server)) { diff --git a/core/src/main/java/org/apache/accumulo/core/manager/balancer/BalanceParamsImpl.java b/core/src/main/java/org/apache/accumulo/core/manager/balancer/BalanceParamsImpl.java index c259ccfe9a4..14099464514 100644 --- a/core/src/main/java/org/apache/accumulo/core/manager/balancer/BalanceParamsImpl.java +++ b/core/src/main/java/org/apache/accumulo/core/manager/balancer/BalanceParamsImpl.java @@ -60,7 +60,7 @@ public static BalanceParamsImpl fromThrift(SortedMap> tserverGroups = new HashMap<>(); currentTServerGrouping.forEach((k, v) -> { - Set servers = new HashSet<>(); + Set servers = new HashSet<>(v.size()); v.forEach(tsi -> servers.add(TabletServerIdImpl.fromThrift(tsi))); tserverGroups.put(k, servers); }); diff --git a/core/src/main/java/org/apache/accumulo/core/spi/compaction/RatioBasedCompactionPlanner.java b/core/src/main/java/org/apache/accumulo/core/spi/compaction/RatioBasedCompactionPlanner.java index 0f4cc10c5ef..630f3a5bb7e 100644 --- a/core/src/main/java/org/apache/accumulo/core/spi/compaction/RatioBasedCompactionPlanner.java +++ b/core/src/main/java/org/apache/accumulo/core/spi/compaction/RatioBasedCompactionPlanner.java @@ -493,7 +493,7 @@ private CompactableFile getExpected(Collection files, int batches = sortedFiles.size() / maxFilesToCompact - 1; if (batches > 0) { - ArrayList> jobs = new ArrayList<>(); + ArrayList> jobs = new ArrayList<>(batches); for (int i = 0; i < batches; i++) { jobs.add(sortedFiles.subList(i * maxFilesToCompact, (i + 1) * maxFilesToCompact)); } diff --git a/core/src/main/java/org/apache/accumulo/core/spi/scan/ScanServersSnapshot.java b/core/src/main/java/org/apache/accumulo/core/spi/scan/ScanServersSnapshot.java index 61721f2e04b..6926cfee069 100644 --- a/core/src/main/java/org/apache/accumulo/core/spi/scan/ScanServersSnapshot.java +++ b/core/src/main/java/org/apache/accumulo/core/spi/scan/ScanServersSnapshot.java @@ -47,7 +47,7 @@ private static class PerHostInfo { final Map> serversByHost; PerHostInfo(Collection servers) { - this.serversByHost = new HashMap<>(); + this.serversByHost = new HashMap<>(servers.size()); servers.forEach(server -> { var hp = HostAndPort.fromString(server); diff --git a/core/src/main/java/org/apache/accumulo/core/util/compaction/ExternalCompactionUtil.java b/core/src/main/java/org/apache/accumulo/core/util/compaction/ExternalCompactionUtil.java index 7c8e878531c..54cd5d0ced9 100644 --- a/core/src/main/java/org/apache/accumulo/core/util/compaction/ExternalCompactionUtil.java +++ b/core/src/main/java/org/apache/accumulo/core/util/compaction/ExternalCompactionUtil.java @@ -215,11 +215,12 @@ public static List getCompactionsRunningOnCompactors(ClientContext con ExecutorService executor, Consumer consumer) throws InterruptedException { - final List> rcFutures = new ArrayList<>(); final List failures = new ArrayList<>(); + final Set compactors = + context.instanceOperations().getServers(ServerId.Type.COMPACTOR); + final List> rcFutures = new ArrayList<>(compactors.size()); try { - Set compactors = context.instanceOperations().getServers(ServerId.Type.COMPACTOR); compactors.forEach(s -> { final HostAndPort address = HostAndPort.fromParts(s.getHost(), s.getPort()); Future future = diff --git a/core/src/test/java/org/apache/accumulo/core/clientImpl/ClientTabletCacheImplTest.java b/core/src/test/java/org/apache/accumulo/core/clientImpl/ClientTabletCacheImplTest.java index cf4bd0aa0aa..a2cf16c176b 100644 --- a/core/src/test/java/org/apache/accumulo/core/clientImpl/ClientTabletCacheImplTest.java +++ b/core/src/test/java/org/apache/accumulo/core/clientImpl/ClientTabletCacheImplTest.java @@ -297,7 +297,7 @@ static List createNewMutationList(Mutation... ma) { private void runTest(ClientTabletCacheImpl metaCache, List ml, Map>> emb, String... efailures) throws Exception { Map> binnedMutations = new HashMap<>(); - List afailures = new ArrayList<>(); + ArrayList afailures = new ArrayList<>(); metaCache.binMutations(context, ml, binnedMutations, afailures); verify(emb, binnedMutations); @@ -1819,7 +1819,7 @@ public void testLookupCounts() throws Exception { ml.add(createNewMutation("" + c, "cf1:cq1=v3", "cf1:cq2=v4")); } Map> binnedMutations = new HashMap<>(); - List afailures = new ArrayList<>(); + ArrayList afailures = new ArrayList<>(); assertEquals(List.of(), lookups); metaCache.binMutations(context, ml, binnedMutations, afailures); assertTrue(binnedMutations.isEmpty()); diff --git a/server/base/src/main/java/org/apache/accumulo/server/fs/FileManager.java b/server/base/src/main/java/org/apache/accumulo/server/fs/FileManager.java index d6972b90fac..c85dd5d6eab 100644 --- a/server/base/src/main/java/org/apache/accumulo/server/fs/FileManager.java +++ b/server/base/src/main/java/org/apache/accumulo/server/fs/FileManager.java @@ -115,7 +115,7 @@ public void run() { long curTime = System.currentTimeMillis(); - ArrayList filesToClose = new ArrayList<>(); + ArrayList filesToClose = new ArrayList<>(openFiles.size()); // determine which files to close in a sync block, and then close the // files outside of the sync block diff --git a/server/base/src/main/java/org/apache/accumulo/server/manager/LiveTServerSet.java b/server/base/src/main/java/org/apache/accumulo/server/manager/LiveTServerSet.java index 3e86c0441d4..f8b14875b14 100644 --- a/server/base/src/main/java/org/apache/accumulo/server/manager/LiveTServerSet.java +++ b/server/base/src/main/java/org/apache/accumulo/server/manager/LiveTServerSet.java @@ -418,7 +418,7 @@ public LiveTServersSnapshot(Set currentServers, Map> serverGroups) { this.tserversInfo = null; this.tservers = Set.copyOf(currentServers); - Map> copy = new HashMap<>(); + Map> copy = new HashMap<>(serverGroups.size(), 1.0f); serverGroups.forEach((k, v) -> copy.put(k, Set.copyOf(v))); this.tserverGroups = Collections.unmodifiableMap(copy); } @@ -427,7 +427,7 @@ public LiveTServersSnapshot(Map currentServers, Map> serverGroups) { this.tserversInfo = Map.copyOf(currentServers); this.tservers = this.tserversInfo.keySet(); - Map> copy = new HashMap<>(); + Map> copy = new HashMap<>(serverGroups.size(), 1.0f); serverGroups.forEach((k, v) -> copy.put(k, Set.copyOf(v))); this.tserverGroups = Collections.unmodifiableMap(copy); } @@ -443,7 +443,8 @@ public Map> getTserverGroups() { public synchronized LiveTServersSnapshot getSnapshot() { if (tServersSnapshot == null) { - HashMap tServerInstances = new HashMap<>(); + HashMap tServerInstances = + new HashMap<>(current.values().size()); Map> tserversGroups = new HashMap<>(); current.values().forEach(tServerInfo -> { tServerInstances.put(tServerInfo.instance, tServerInfo); diff --git a/server/base/src/main/java/org/apache/accumulo/server/metadata/ConditionalTabletsMutatorImpl.java b/server/base/src/main/java/org/apache/accumulo/server/metadata/ConditionalTabletsMutatorImpl.java index b4435f1fb1a..c6d20e5c3be 100644 --- a/server/base/src/main/java/org/apache/accumulo/server/metadata/ConditionalTabletsMutatorImpl.java +++ b/server/base/src/main/java/org/apache/accumulo/server/metadata/ConditionalTabletsMutatorImpl.java @@ -177,7 +177,7 @@ protected Retry createUnknownRetry() { .logInterval(Duration.ofMinutes(3)).createRetry(); } - private Iterator writeMutations(ConditionalWriter conditionalWriter) { + private List writeMutations(ConditionalWriter conditionalWriter) { var results = conditionalWriter.write(mutations.iterator()); List resultsList = new ArrayList<>(); @@ -206,7 +206,7 @@ private Iterator writeMutations(ConditionalWriter cond partitionResults(results, resultsList, unknownResults); } - return resultsList.iterator(); + return resultsList; } private Ample.ConditionalResult.Status mapStatus(KeyExtent extent, @@ -251,10 +251,11 @@ public Map process() { var results = writeMutations(conditionalWriter); - var resultsMap = new HashMap(); + var resultsMap = new HashMap(results.size(), 1.0f); - while (results.hasNext()) { - var result = results.next(); + var resultsIter = results.iterator(); + while (resultsIter.hasNext()) { + var result = resultsIter.next(); var row = new Text(result.getMutation().getRow()); resultsMap.put(extents.get(row), result); } diff --git a/server/base/src/main/java/org/apache/accumulo/server/security/AuditedSecurityOperation.java b/server/base/src/main/java/org/apache/accumulo/server/security/AuditedSecurityOperation.java index c0687b53ccd..70039a2fab8 100644 --- a/server/base/src/main/java/org/apache/accumulo/server/security/AuditedSecurityOperation.java +++ b/server/base/src/main/java/org/apache/accumulo/server/security/AuditedSecurityOperation.java @@ -129,7 +129,8 @@ private void audit(TCredentials credentials, boolean permitted, String template, private static final int MAX_ELEMENTS_TO_LOG = 10; private static List truncate(Collection list) { - List result = new ArrayList<>(); + List result = + new ArrayList<>(list.size() > MAX_ELEMENTS_TO_LOG ? MAX_ELEMENTS_TO_LOG + 1 : list.size()); int i = 0; for (Object obj : list) { if (i++ > MAX_ELEMENTS_TO_LOG) { diff --git a/server/base/src/main/java/org/apache/accumulo/server/split/SplitUtils.java b/server/base/src/main/java/org/apache/accumulo/server/split/SplitUtils.java index ac4d03a53eb..dd1c3127548 100644 --- a/server/base/src/main/java/org/apache/accumulo/server/split/SplitUtils.java +++ b/server/base/src/main/java/org/apache/accumulo/server/split/SplitUtils.java @@ -110,7 +110,7 @@ public Key next() { private static ArrayList openIndexes(ServerContext context, TableConfiguration tableConf, Collection files) throws IOException { - ArrayList readers = new ArrayList<>(); + ArrayList readers = new ArrayList<>(files.size()); try { for (TabletFile file : files) { diff --git a/server/manager/src/main/java/org/apache/accumulo/manager/Manager.java b/server/manager/src/main/java/org/apache/accumulo/manager/Manager.java index c7c1a3cc051..ed20d3e0ffc 100644 --- a/server/manager/src/main/java/org/apache/accumulo/manager/Manager.java +++ b/server/manager/src/main/java/org/apache/accumulo/manager/Manager.java @@ -799,7 +799,7 @@ private void checkForHeldServer(SortedMap ts long start = System.currentTimeMillis(); final SortedMap result = new ConcurrentSkipListMap<>(); final RateLimiter shutdownServerRateLimiter = RateLimiter.create(MAX_SHUTDOWNS_PER_SEC); - final ArrayList> tasks = new ArrayList<>(); + final ArrayList> tasks = new ArrayList<>(currentServers.size()); for (TServerInstance serverInstance : currentServers) { final TServerInstance server = serverInstance; if (threads == 0) { diff --git a/server/manager/src/main/java/org/apache/accumulo/manager/ManagerClientServiceHandler.java b/server/manager/src/main/java/org/apache/accumulo/manager/ManagerClientServiceHandler.java index 19aaaa1bd0c..90b78baa13c 100644 --- a/server/manager/src/main/java/org/apache/accumulo/manager/ManagerClientServiceHandler.java +++ b/server/manager/src/main/java/org/apache/accumulo/manager/ManagerClientServiceHandler.java @@ -786,7 +786,7 @@ public List updateTabletMergeability(TInfo tinfo, TCredentials crede } var results = tabletsMutator.process(); - List updated = new ArrayList<>(); + List updated = new ArrayList<>(results.size()); results.forEach((key, result) -> { if (result.getStatus() == Status.ACCEPTED) { updated.add(result.getExtent().toThrift()); diff --git a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/bulkVer2/BulkImportMove.java b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/bulkVer2/BulkImportMove.java index 4537cf3cd28..dd1d78faacf 100644 --- a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/bulkVer2/BulkImportMove.java +++ b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/bulkVer2/BulkImportMove.java @@ -95,7 +95,7 @@ private void moveFiles(FateId fateId, Path sourceDir, Path bulkDir, FateEnv env, final VolumeManager fs, Map renames) throws Exception { env.getContext().getAmple().addBulkLoadInProgressFlag( "/" + bulkDir.getParent().getName() + "/" + bulkDir.getName(), fateId); - Map oldToNewMap = new HashMap<>(); + Map oldToNewMap = new HashMap<>(renames.size(), 1.0f); for (Map.Entry renameEntry : renames.entrySet()) { final Path originalPath = new Path(sourceDir, renameEntry.getKey()); diff --git a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/bulkVer2/LoadFiles.java b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/bulkVer2/LoadFiles.java index 75c71f02229..61f11c19507 100644 --- a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/bulkVer2/LoadFiles.java +++ b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/bulkVer2/LoadFiles.java @@ -165,7 +165,7 @@ void start(Path bulkDir, TableId tableId, FateId fateId, boolean setTime) throws void load(List tablets, Files files) { - Map toLoad = new HashMap<>(); + Map toLoad = new HashMap<>(files.getSize(), 1.0f); for (var fileInfo : files) { toLoad.put(new ReferencedTabletFile(new Path(bulkDir, fileInfo.getFileName())), fileInfo); } @@ -223,7 +223,7 @@ void load(List tablets, Files files) { continue; } - Map filesToLoad = new HashMap<>(); + Map filesToLoad = new HashMap<>(toLoad.size(), 1.0f); var tabletTime = TabletTime.getInstance(tablet.getTime()); @@ -283,10 +283,7 @@ void load(List tablets, Files files) { private Map allocateTimestamps(List tablets, int numStamps) { - Map> serversToAsk = new HashMap<>(); - - Map allTimestamps = new HashMap<>(); - + Map> serversToAsk = new HashMap<>(tablets.size()); for (var tablet : tablets) { if (tablet.getLocation() != null && tablet.getLocation().getType() == CURRENT) { var location = tablet.getLocation().getHostAndPort(); @@ -295,6 +292,7 @@ private Map allocateTimestamps(List tablets, int } } + Map allTimestamps = new HashMap<>(serversToAsk.size()); for (var entry : serversToAsk.entrySet()) { HostAndPort server = entry.getKey(); List extents = entry.getValue(); @@ -326,7 +324,7 @@ private Map allocateTimestamps(HostAndPort server, List(); + var converted = new HashMap(timestamps.size(), 1.0f); timestamps.forEach((k, v) -> converted.put(KeyExtent.fromThrift(k), v)); return converted; } catch (TException ex) { diff --git a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/bulkVer2/TabletRefresher.java b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/bulkVer2/TabletRefresher.java index f6295502317..5d45b0c212d 100644 --- a/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/bulkVer2/TabletRefresher.java +++ b/server/manager/src/main/java/org/apache/accumulo/manager/tableOps/bulkVer2/TabletRefresher.java @@ -102,7 +102,8 @@ public static void refreshTablets(ExecutorService threadPool, String logId, Serv while (!refreshesNeeded.isEmpty()) { - Map>> futures = new HashMap<>(); + Map>> futures = + new HashMap<>(refreshesNeeded.size(), 1.0f); for (Map.Entry> entry : refreshesNeeded.entrySet()) { diff --git a/server/tserver/src/main/java/org/apache/accumulo/tserver/RowLocks.java b/server/tserver/src/main/java/org/apache/accumulo/tserver/RowLocks.java index baa20300af7..900cbe5b8d4 100644 --- a/server/tserver/src/main/java/org/apache/accumulo/tserver/RowLocks.java +++ b/server/tserver/src/main/java/org/apache/accumulo/tserver/RowLocks.java @@ -90,6 +90,7 @@ List acquireRowlocks(Map> upd ArrayList locks = new ArrayList<>(); for (List scml : updates.values()) { + locks.ensureCapacity(locks.size() + scml.size()); for (ServerConditionalMutation scm : scml) { locks.add(getRowLock(new ArrayByteSequence(scm.getRow()))); } diff --git a/server/tserver/src/main/java/org/apache/accumulo/tserver/ScanServer.java b/server/tserver/src/main/java/org/apache/accumulo/tserver/ScanServer.java index ce043e0e6b0..0d3363c302c 100644 --- a/server/tserver/src/main/java/org/apache/accumulo/tserver/ScanServer.java +++ b/server/tserver/src/main/java/org/apache/accumulo/tserver/ScanServer.java @@ -695,7 +695,7 @@ private Map reserveFilesInner(Collection ex } } - Map allFiles = new HashMap<>(); + Map allFiles = new HashMap<>(extents.size()); tabletsMetadata.forEach((extent, tm) -> { tm.getFiles().forEach(file -> allFiles.put(file, extent)); @@ -856,7 +856,7 @@ protected ScanReservation reserveFiles(Map> extents) } // Convert failures - Map> failures = new HashMap<>(); + Map> failures = new HashMap<>(failedReservations.size(), 1.0f); failedReservations.forEach(extent -> { failures.put(extent.toThrift(), extents.get(extent)); }); @@ -1134,7 +1134,7 @@ public InitialMultiScan startMultiScan(TInfo tinfo, TCredentials credentials, throw new TException("Scan Server batch must include at least one extent"); } - final Map> batch = new HashMap<>(); + final Map> batch = new HashMap<>(tbatch.size(), 1.0f); for (Entry> entry : tbatch.entrySet()) { KeyExtent extent = getKeyExtent(entry.getKey()); @@ -1150,8 +1150,9 @@ public InitialMultiScan startMultiScan(TInfo tinfo, TCredentials credentials, try (ScanReservation reservation = reserveFilesInstrumented(batch)) { - HashMap tablets = new HashMap<>(); - reservation.getTabletMetadataExtents().forEach(extent -> { + var extents = reservation.getTabletMetadataExtents(); + HashMap tablets = new HashMap<>(extents.size(), 1.0f); + extents.forEach(extent -> { try { tablets.put(extent, reservation.newTablet(this, extent)); } catch (IOException e) { diff --git a/server/tserver/src/main/java/org/apache/accumulo/tserver/TabletClientHandler.java b/server/tserver/src/main/java/org/apache/accumulo/tserver/TabletClientHandler.java index 00372ac2675..c571c667878 100644 --- a/server/tserver/src/main/java/org/apache/accumulo/tserver/TabletClientHandler.java +++ b/server/tserver/src/main/java/org/apache/accumulo/tserver/TabletClientHandler.java @@ -584,6 +584,7 @@ private void checkConditions(Map> upda final Tablet tablet = server.getOnlineTablet(entry.getKey()); if (tablet == null || tablet.isClosed()) { + results.ensureCapacity(results.size() + entry.getValue().size()); for (ServerConditionalMutation scm : entry.getValue()) { results.add(new TCMResult(scm.getID(), TCMStatus.IGNORED)); } @@ -607,6 +608,7 @@ private void checkConditions(Map> upda // clear anything added while checking conditions. resultsSubList.clear(); + results.ensureCapacity(results.size() + entry.getValue().size()); for (ServerConditionalMutation scm : entry.getValue()) { results.add(new TCMResult(scm.getID(), TCMStatus.IGNORED)); } @@ -1201,11 +1203,12 @@ public List refreshTablets(TInfo tinfo, TCredentials credentials, // handle that more expensive case if needed. var tabletsSnapshot = server.getOnlineTablets(); - Map refreshSessions = new HashMap<>(); + Map refreshSessions = new HashMap<>(refreshes.size(), 1.0f); // Created this as synchronized list because it's passed to a lambda that could possibly run in // another thread. - List unableToRefresh = Collections.synchronizedList(new ArrayList<>()); + List unableToRefresh = + Collections.synchronizedList(new ArrayList<>(refreshes.size())); for (var tkextent : refreshes) { var extent = KeyExtent.fromThrift(tkextent); @@ -1254,7 +1257,7 @@ public Map allocateTimestamps(TInfo tinfo, TCredentials credent var tabletsSnapshot = server.getOnlineTablets(); - Map timestamps = new HashMap<>(); + Map timestamps = new HashMap<>(extents.size(), 1.0f); for (var textent : extents) { var extent = KeyExtent.fromThrift(textent); diff --git a/server/tserver/src/main/java/org/apache/accumulo/tserver/log/DfsLogger.java b/server/tserver/src/main/java/org/apache/accumulo/tserver/log/DfsLogger.java index dba90916ef2..392c347ddae 100644 --- a/server/tserver/src/main/java/org/apache/accumulo/tserver/log/DfsLogger.java +++ b/server/tserver/src/main/java/org/apache/accumulo/tserver/log/DfsLogger.java @@ -155,6 +155,7 @@ public void run() { Thread.currentThread().interrupt(); continue; } + work.ensureCapacity(work.size() + workQueue.size()); workQueue.drainTo(work); Optional shouldHSync = Optional.empty(); @@ -604,7 +605,7 @@ private LoggerOperation logFileData(List> keys, public LoggerOperation logManyTablets(Collection mutations) throws IOException { Durability durability = Durability.NONE; - List> data = new ArrayList<>(); + List> data = new ArrayList<>(mutations.size()); for (TabletMutations tabletMutations : mutations) { LogFileKey key = new LogFileKey(); key.setEvent(MANY_MUTATIONS);