From c495cdae27d73dd05131eec5b516b6ea9a33b9b4 Mon Sep 17 00:00:00 2001 From: Dave Marion Date: Mon, 29 Jun 2026 16:38:04 +0000 Subject: [PATCH 1/2] Create ArrayList with initial sizes where possible Where possible set the initial size of the ArrayList when creating it to avoid the expense of the resize operation (new list creation and copy). --- .../accumulo/core/client/IsolatedScanner.java | 20 +++++++++++-------- .../clientImpl/InstanceOperationsImpl.java | 16 ++++++++------- .../TabletServerBatchReaderIterator.java | 8 ++++---- .../apache/accumulo/core/data/Mutation.java | 4 ++-- .../core/file/rfile/MultiLevelIndex.java | 2 +- .../iteratorsImpl/IteratorConfigUtil.java | 4 ++-- .../system/SystemIteratorUtil.java | 4 ++-- .../core/rpc/clients/TServerClient.java | 5 ++--- .../core/spi/balancer/GroupBalancer.java | 3 ++- .../core/spi/balancer/SimpleLoadBalancer.java | 6 +++--- .../compaction/DefaultCompactionPlanner.java | 2 +- .../accumulo/core/summary/Gatherer.java | 6 +++--- .../accumulo/core/util/ByteArraySet.java | 2 +- .../accumulo/core/util/ByteBufferUtil.java | 2 +- .../server/compaction/FileCompactor.java | 2 +- .../accumulo/server/fs/FileManager.java | 6 +++--- .../accumulo/server/fs/VolumeManagerImpl.java | 2 +- .../server/util/MetadataTableUtil.java | 3 +-- .../coordinator/CompactionFinalizer.java | 5 +++-- .../coordinator/SharedBatchWriter.java | 2 +- .../manager/ManagerClientServiceHandler.java | 2 +- .../accumulo/tserver/log/LogSorter.java | 7 ++++--- .../tserver/session/SessionManager.java | 3 ++- .../tserver/tablet/CompactableImpl.java | 3 ++- .../tserver/tablet/ScanDataSource.java | 3 +-- .../accumulo/tserver/tablet/Scanner.java | 4 ++-- .../accumulo/tserver/tablet/Tablet.java | 9 +++++---- 27 files changed, 72 insertions(+), 63 deletions(-) diff --git a/core/src/main/java/org/apache/accumulo/core/client/IsolatedScanner.java b/core/src/main/java/org/apache/accumulo/core/client/IsolatedScanner.java index 5a7328a5f26..db619a10de4 100644 --- a/core/src/main/java/org/apache/accumulo/core/client/IsolatedScanner.java +++ b/core/src/main/java/org/apache/accumulo/core/client/IsolatedScanner.java @@ -143,7 +143,7 @@ public RowBufferingIterator(Scanner scanner, ScannerOptions opts, Range range, l this.batchSize = batchSize; this.readaheadThreshold = readaheadThreshold; - buffer = bufferFactory.newBuffer(); + buffer = bufferFactory.newBuffer(this.batchSize); this.source = newIterator(range); @@ -172,11 +172,11 @@ public void remove() { } - public interface RowBufferFactory { - RowBuffer newBuffer(); + private interface RowBufferFactory { + RowBuffer newBuffer(int initialSize); } - public interface RowBuffer extends Iterable> { + private interface RowBuffer extends Iterable> { void add(Entry entry); @Override @@ -185,17 +185,21 @@ public interface RowBuffer extends Iterable> { void clear(); } - public static class MemoryRowBufferFactory implements RowBufferFactory { + private static class MemoryRowBufferFactory implements RowBufferFactory { @Override - public RowBuffer newBuffer() { - return new MemoryRowBuffer(); + public RowBuffer newBuffer(int initialSize) { + return new MemoryRowBuffer(initialSize); } } public static class MemoryRowBuffer implements RowBuffer { - private final ArrayList> buffer = new ArrayList<>(); + private final ArrayList> buffer; + + private MemoryRowBuffer(int initialSize) { + buffer = new ArrayList<>(initialSize); + } @Override public void add(Entry entry) { 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 c11b6f3c210..a5583552cea 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 @@ -229,9 +229,10 @@ public Set getScanServers() { @Override public List getTabletServers() { ZooCache cache = context.getZooCache(); - String path = context.getZooKeeperRoot() + Constants.ZTSERVERS; - List results = new ArrayList<>(); - for (String candidate : cache.getChildren(path)) { + final String path = context.getZooKeeperRoot() + Constants.ZTSERVERS; + final List candidates = cache.getChildren(path); + final List results = new ArrayList<>(candidates.size()); + for (String candidate : candidates) { var children = cache.getChildren(path + "/" + candidate); if (children != null && !children.isEmpty()) { var copy = new ArrayList<>(children); @@ -253,8 +254,9 @@ public List getActiveScans(String tserver) try { client = getClient(ThriftClientTypes.TABLET_SCAN, parsedTserver, context); - List as = new ArrayList<>(); - for (var activeScan : client.getActiveScans(TraceUtil.traceInfo(), context.rpcCreds())) { + final var scans = client.getActiveScans(TraceUtil.traceInfo(), context.rpcCreds()); + List as = new ArrayList<>(scans.size()); + for (var activeScan : scans) { try { as.add(new ActiveScanImpl(context, activeScan)); } catch (TableNotFoundException e) { @@ -326,7 +328,7 @@ public List getActiveCompactions() var executorService = context.threadPools().getPoolBuilder(INSTANCE_OPS_COMPACTIONS_FINDER_POOL) .numCoreThreads(numThreads).build(); try { - List>> futures = new ArrayList<>(); + List>> futures = new ArrayList<>(tservers.size()); for (String tserver : tservers) { futures.add(executorService.submit(() -> getActiveCompactions(tserver))); @@ -344,7 +346,7 @@ public List getActiveCompactions() } }); - List ret = new ArrayList<>(); + List ret = new ArrayList<>(futures.size()); for (Future> future : futures) { try { ret.addAll(future.get()); 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 53a44dc0bf1..f2ebcba11c0 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 @@ -303,7 +303,7 @@ private void binRanges(TabletLocator tabletLocator, List ranges, binnedRanges2.put(entry.getKey(), tabletMap); for (Entry> tabletRanges : entry.getValue().entrySet()) { Range tabletRange = tabletRanges.getKey().toDataRange(); - List clippedRanges = new ArrayList<>(); + List clippedRanges = new ArrayList<>(tabletRanges.getValue().size()); tabletMap.put(tabletRanges.getKey(), clippedRanges); for (Range range : tabletRanges.getValue()) { clippedRanges.add(tabletRange.clip(range)); @@ -339,7 +339,7 @@ private void processFailures(Map> failures, ResultReceiver failSleepTime = Math.min(5000, failSleepTime * 2); Map>> binnedRanges = new HashMap<>(); - List allRanges = new ArrayList<>(); + List allRanges = new ArrayList<>(failures.values().stream().mapToInt(List::size).sum()); for (List ranges : failures.values()) { allRanges.addAll(ranges); @@ -562,7 +562,7 @@ private void doLookups(Map>> binnedRanges, List locations = new ArrayList<>(binnedRanges.keySet()); Collections.shuffle(locations); - List queryTasks = new ArrayList<>(); + List queryTasks = new ArrayList<>(locations.size()); for (final String tsLocation : locations) { @@ -828,7 +828,7 @@ static void doLookup(ClientContext context, String server, Map> entry : requested.entrySet()) { - ArrayList ranges = new ArrayList<>(); + ArrayList ranges = new ArrayList<>(entry.getValue().size()); for (Range range : entry.getValue()) { ranges.add(new Range(range)); } diff --git a/core/src/main/java/org/apache/accumulo/core/data/Mutation.java b/core/src/main/java/org/apache/accumulo/core/data/Mutation.java index 53f834cedf9..25393a51bbf 100644 --- a/core/src/main/java/org/apache/accumulo/core/data/Mutation.java +++ b/core/src/main/java/org/apache/accumulo/core/data/Mutation.java @@ -1440,8 +1440,8 @@ public void readFields(DataInput in) throws IOException { boolean valuesPresent = (first & 0x01) == 0x01; if (valuesPresent) { - values = new ArrayList<>(); int numValues = WritableUtils.readVInt(in); + values = new ArrayList<>(numValues); for (int i = 0; i < numValues; i++) { len = WritableUtils.readVInt(in); byte[] val = new byte[len]; @@ -1480,8 +1480,8 @@ private void oldReadFields(byte first, DataInput in) throws IOException { List localValues; boolean valuesPresent = in.readBoolean(); if (valuesPresent) { - localValues = new ArrayList<>(); int numValues = in.readInt(); + localValues = new ArrayList<>(numValues); for (int i = 0; i < numValues; i++) { len = in.readInt(); byte[] val = new byte[len]; diff --git a/core/src/main/java/org/apache/accumulo/core/file/rfile/MultiLevelIndex.java b/core/src/main/java/org/apache/accumulo/core/file/rfile/MultiLevelIndex.java index 9c7b249fff4..69e3c3ba3a0 100644 --- a/core/src/main/java/org/apache/accumulo/core/file/rfile/MultiLevelIndex.java +++ b/core/src/main/java/org/apache/accumulo/core/file/rfile/MultiLevelIndex.java @@ -361,7 +361,7 @@ public void readFields(DataInput in, int version) throws IOException { ByteArrayOutputStream baos = new ByteArrayOutputStream(); DataOutputStream dos = new DataOutputStream(baos); - ArrayList oal = new ArrayList<>(); + ArrayList oal = new ArrayList<>(size); for (int i = 0; i < size; i++) { IndexEntry ie = new IndexEntry(false); diff --git a/core/src/main/java/org/apache/accumulo/core/iteratorsImpl/IteratorConfigUtil.java b/core/src/main/java/org/apache/accumulo/core/iteratorsImpl/IteratorConfigUtil.java index 5fb0afdca9a..1c6ea1577cb 100644 --- a/core/src/main/java/org/apache/accumulo/core/iteratorsImpl/IteratorConfigUtil.java +++ b/core/src/main/java/org/apache/accumulo/core/iteratorsImpl/IteratorConfigUtil.java @@ -196,8 +196,8 @@ public static SortedKeyValueIterator convertItersAndLoad(IteratorScop List iterators, IteratorEnvironment env) throws IOException, ReflectiveOperationException { - List ssiList = new ArrayList<>(); - Map> ssio = new HashMap<>(); + List ssiList = new ArrayList<>(iterators.size()); + Map> ssio = new HashMap<>(iterators.size()); for (IteratorSetting is : iterators) { ssiList.add(new IterInfo(is.getPriority(), is.getIteratorClass(), is.getName())); diff --git a/core/src/main/java/org/apache/accumulo/core/iteratorsImpl/system/SystemIteratorUtil.java b/core/src/main/java/org/apache/accumulo/core/iteratorsImpl/system/SystemIteratorUtil.java index bac1d31ef19..339c2dad2fe 100644 --- a/core/src/main/java/org/apache/accumulo/core/iteratorsImpl/system/SystemIteratorUtil.java +++ b/core/src/main/java/org/apache/accumulo/core/iteratorsImpl/system/SystemIteratorUtil.java @@ -53,7 +53,7 @@ public static IteratorSetting toIteratorSetting(TIteratorSetting tis) { } public static IteratorConfig toIteratorConfig(List iterators) { - ArrayList tisList = new ArrayList<>(); + ArrayList tisList = new ArrayList<>(iterators.size()); for (IteratorSetting iteratorSetting : iterators) { tisList.add(toTIteratorSetting(iteratorSetting)); @@ -63,7 +63,7 @@ public static IteratorConfig toIteratorConfig(List iterators) { } public static List toIteratorSettings(IteratorConfig ic) { - List ret = new ArrayList<>(); + List ret = new ArrayList<>(ic.getIterators().size()); for (TIteratorSetting tIteratorSetting : ic.getIterators()) { ret.add(toIteratorSetting(tIteratorSetting)); } diff --git a/core/src/main/java/org/apache/accumulo/core/rpc/clients/TServerClient.java b/core/src/main/java/org/apache/accumulo/core/rpc/clients/TServerClient.java index 5f017668e9a..8e5553e09cd 100644 --- a/core/src/main/java/org/apache/accumulo/core/rpc/clients/TServerClient.java +++ b/core/src/main/java/org/apache/accumulo/core/rpc/clients/TServerClient.java @@ -72,9 +72,8 @@ default Pair getTabletServerConnection(Logger LOG, ThriftClientTypes tservers = new ArrayList<>(); - - tservers.addAll(zc.getChildren(context.getZooKeeperRoot() + Constants.ZTSERVERS)); + final List tservers = + new ArrayList<>(zc.getChildren(context.getZooKeeperRoot() + Constants.ZTSERVERS)); if (tservers.isEmpty()) { if (warned.compareAndSet(false, true)) { diff --git a/core/src/main/java/org/apache/accumulo/core/spi/balancer/GroupBalancer.java b/core/src/main/java/org/apache/accumulo/core/spi/balancer/GroupBalancer.java index 99e3c290d04..753980211f4 100644 --- a/core/src/main/java/org/apache/accumulo/core/spi/balancer/GroupBalancer.java +++ b/core/src/main/java/org/apache/accumulo/core/spi/balancer/GroupBalancer.java @@ -143,7 +143,8 @@ public void getAssignments(AssignmentParameters params) { Function partitioner = getLoggingPartitioner(); - List> tabletsByGroup = new ArrayList<>(); + List> tabletsByGroup = + new ArrayList<>(params.unassignedTablets().size()); for (Entry entry : params.unassignedTablets().entrySet()) { TabletServerId last = entry.getValue(); if (last != null) { diff --git a/core/src/main/java/org/apache/accumulo/core/spi/balancer/SimpleLoadBalancer.java b/core/src/main/java/org/apache/accumulo/core/spi/balancer/SimpleLoadBalancer.java index b593a104fe1..a40d0522060 100644 --- a/core/src/main/java/org/apache/accumulo/core/spi/balancer/SimpleLoadBalancer.java +++ b/core/src/main/java/org/apache/accumulo/core/spi/balancer/SimpleLoadBalancer.java @@ -168,7 +168,7 @@ public boolean getMigrations(Map current, // Sort by total number of online tablets, per server int total = 0; - ArrayList totals = new ArrayList<>(); + ArrayList totals = new ArrayList<>(current.size()); for (Entry entry : current.entrySet()) { int serverTotal = 0; if (entry.getValue() != null && entry.getValue().getTableMap() != null) { @@ -241,11 +241,11 @@ public boolean getMigrations(Map current, List move(ServerCounts tooMuch, ServerCounts tooLittle, int count, Map> donerTabletStats) { - if (count == 0) { + if (count <= 0) { return Collections.emptyList(); } - List result = new ArrayList<>(); + List result = new ArrayList<>(count); // Copy counts so we can update them as we propose migrations Map tooMuchMap = tabletCountsPerTable(tooMuch.status); Map tooLittleMap = tabletCountsPerTable(tooLittle.status); diff --git a/core/src/main/java/org/apache/accumulo/core/spi/compaction/DefaultCompactionPlanner.java b/core/src/main/java/org/apache/accumulo/core/spi/compaction/DefaultCompactionPlanner.java index 99bfd8472c2..0103243ef42 100644 --- a/core/src/main/java/org/apache/accumulo/core/spi/compaction/DefaultCompactionPlanner.java +++ b/core/src/main/java/org/apache/accumulo/core/spi/compaction/DefaultCompactionPlanner.java @@ -180,7 +180,7 @@ public void init(InitParameters params) { ExecutorConfig[] execConfigs = new Gson().fromJson(params.getOptions().get("executors"), ExecutorConfig[].class); - List tmpExec = new ArrayList<>(); + List tmpExec = new ArrayList<>(execConfigs.length); for (ExecutorConfig executorConfig : execConfigs) { Long maxSize = executorConfig.maxSize == null ? null diff --git a/core/src/main/java/org/apache/accumulo/core/summary/Gatherer.java b/core/src/main/java/org/apache/accumulo/core/summary/Gatherer.java index a917cdf7e76..850395d1aae 100644 --- a/core/src/main/java/org/apache/accumulo/core/summary/Gatherer.java +++ b/core/src/main/java/org/apache/accumulo/core/summary/Gatherer.java @@ -359,7 +359,7 @@ private class PartitionFuture implements Future { Map>> filesGBL; filesGBL = getFilesGroupedByLocation(fileSelector); - List> futures = new ArrayList<>(); + List> futures = new ArrayList<>(filesGBL.size() + 1); if (previousWork != null) { futures.add(CompletableFuture .completedFuture(new ProcessedFiles(previousWork.summaries, factory))); @@ -433,7 +433,7 @@ public interface FileSystemResolver { public Future processFiles(FileSystemResolver volMgr, Map> files, BlockCache summaryCache, BlockCache indexCache, Cache fileLenCache, ExecutorService srp) { - List> futures = new ArrayList<>(); + List> futures = new ArrayList<>(files.size()); for (Entry> entry : files.entrySet()) { futures.add(CompletableFuture.supplyAsync(() -> { List rrl = @@ -504,7 +504,7 @@ public Future gather(ExecutorService es) { // have each tablet server process ~100K files int numRequest = Math.max(numFiles / 100_000, 1); - List> futures = new ArrayList<>(); + List> futures = new ArrayList<>(numRequest); AtomicBoolean cancelFlag = new AtomicBoolean(false); diff --git a/core/src/main/java/org/apache/accumulo/core/util/ByteArraySet.java b/core/src/main/java/org/apache/accumulo/core/util/ByteArraySet.java index 9fb0edef9b2..e8828a91cee 100644 --- a/core/src/main/java/org/apache/accumulo/core/util/ByteArraySet.java +++ b/core/src/main/java/org/apache/accumulo/core/util/ByteArraySet.java @@ -40,7 +40,7 @@ public ByteArraySet(Collection c) { } public static ByteArraySet fromStrings(Collection c) { - List lst = new ArrayList<>(); + List lst = new ArrayList<>(c.size()); for (String s : c) { lst.add(s.getBytes(UTF_8)); } diff --git a/core/src/main/java/org/apache/accumulo/core/util/ByteBufferUtil.java b/core/src/main/java/org/apache/accumulo/core/util/ByteBufferUtil.java index a06d7ac745a..470d918d62f 100644 --- a/core/src/main/java/org/apache/accumulo/core/util/ByteBufferUtil.java +++ b/core/src/main/java/org/apache/accumulo/core/util/ByteBufferUtil.java @@ -56,7 +56,7 @@ public static List toByteBuffers(Collection bytesList) { if (bytesList == null) { return null; } - ArrayList result = new ArrayList<>(); + ArrayList result = new ArrayList<>(bytesList.size()); for (byte[] bytes : bytesList) { result.add(ByteBuffer.wrap(bytes)); } diff --git a/server/base/src/main/java/org/apache/accumulo/server/compaction/FileCompactor.java b/server/base/src/main/java/org/apache/accumulo/server/compaction/FileCompactor.java index 1045d13680f..91667826303 100644 --- a/server/base/src/main/java/org/apache/accumulo/server/compaction/FileCompactor.java +++ b/server/base/src/main/java/org/apache/accumulo/server/compaction/FileCompactor.java @@ -263,7 +263,7 @@ private static void updateTotalEntries() { Collections.synchronizedSet(new HashSet<>()); public static List getRunningCompactions() { - ArrayList compactions = new ArrayList<>(); + ArrayList compactions = new ArrayList<>(runningCompactions.size()); runningCompactions.forEach(compactor -> compactions.add(new CompactionInfo(compactor))); 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 9a3aad33c35..4e81899ed2f 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 @@ -187,7 +187,7 @@ private static int countReaders(Map> files) { private List takeLRUOpenFiles(int numToTake) { - ArrayList openReaders = new ArrayList<>(); + ArrayList openReaders = new ArrayList<>(openFiles.size()); for (Entry> entry : openFiles.entrySet()) { openReaders.addAll(entry.getValue()); @@ -195,7 +195,7 @@ private List takeLRUOpenFiles(int numToTake) { Collections.sort(openReaders); - ArrayList ret = new ArrayList<>(); + ArrayList ret = new ArrayList<>(openReaders.size()); for (int i = 0; i < numToTake && i < openReaders.size(); i++) { OpenReader or = openReaders.get(i); @@ -517,7 +517,7 @@ public synchronized List openFiles(Map newlyReservedReaders = openFiles( files.keySet().stream().map(TabletFile::getPathStr).collect(Collectors.toList())); - ArrayList iters = new ArrayList<>(); + ArrayList iters = new ArrayList<>(newlyReservedReaders.size()); boolean sawTimeSet = files.values().stream().anyMatch(DataFileValue::isTimeSet); diff --git a/server/base/src/main/java/org/apache/accumulo/server/fs/VolumeManagerImpl.java b/server/base/src/main/java/org/apache/accumulo/server/fs/VolumeManagerImpl.java index 0fa7d7b7d37..05f947e30c1 100644 --- a/server/base/src/main/java/org/apache/accumulo/server/fs/VolumeManagerImpl.java +++ b/server/base/src/main/java/org/apache/accumulo/server/fs/VolumeManagerImpl.java @@ -322,7 +322,7 @@ public boolean rename(Path path, Path newPath) throws IOException { @Override public void bulkRename(Map oldToNewPathMap, int poolSize, String poolName, String transactionId) throws IOException { - List> results = new ArrayList<>(); + List> results = new ArrayList<>(oldToNewPathMap.size()); ExecutorService workerPool = ThreadPools.getServerThreadPools().getPoolBuilder(poolName) .numCoreThreads(poolSize).build(); oldToNewPathMap.forEach((oldPath, newPath) -> results.add(workerPool.submit(() -> { diff --git a/server/base/src/main/java/org/apache/accumulo/server/util/MetadataTableUtil.java b/server/base/src/main/java/org/apache/accumulo/server/util/MetadataTableUtil.java index 360ca94a813..c28b0a0f8f5 100644 --- a/server/base/src/main/java/org/apache/accumulo/server/util/MetadataTableUtil.java +++ b/server/base/src/main/java/org/apache/accumulo/server/util/MetadataTableUtil.java @@ -375,7 +375,6 @@ public static void deleteTable(TableId tableId, boolean insertDeletes, ServerCon public static Pair,SortedMap> getFileAndLogEntries(ServerContext context, KeyExtent extent) throws IOException { - ArrayList result = new ArrayList<>(); TreeMap sizes = new TreeMap<>(); TabletMetadata tablet = context.getAmple().readTablet(extent, FILES, LOGS, PREV_ROW, DIR); @@ -384,7 +383,7 @@ public static void deleteTable(TableId tableId, boolean insertDeletes, ServerCon throw new RuntimeException("Tablet " + extent + " not found in metadata"); } - result.addAll(tablet.getLogs()); + ArrayList result = new ArrayList<>(tablet.getLogs()); tablet.getFilesMap().forEach(sizes::put); diff --git a/server/compaction-coordinator/src/main/java/org/apache/accumulo/coordinator/CompactionFinalizer.java b/server/compaction-coordinator/src/main/java/org/apache/accumulo/coordinator/CompactionFinalizer.java index f392d9e1cee..a64ec4413ba 100644 --- a/server/compaction-coordinator/src/main/java/org/apache/accumulo/coordinator/CompactionFinalizer.java +++ b/server/compaction-coordinator/src/main/java/org/apache/accumulo/coordinator/CompactionFinalizer.java @@ -193,13 +193,14 @@ private void processPending() { while (!Thread.interrupted()) { try { - ArrayList batch = new ArrayList<>(); + ArrayList batch = + new ArrayList<>(pendingNotifications.size()); batch.add(pendingNotifications.take()); pendingNotifications.drainTo(batch); LOG.trace("Processing pending of batch size {}", batch.size()); - List> futures = new ArrayList<>(); + List> futures = new ArrayList<>(batch.size()); List statusesToDelete = new ArrayList<>(); diff --git a/server/compaction-coordinator/src/main/java/org/apache/accumulo/coordinator/SharedBatchWriter.java b/server/compaction-coordinator/src/main/java/org/apache/accumulo/coordinator/SharedBatchWriter.java index baf21be1d3f..29c4a84f014 100644 --- a/server/compaction-coordinator/src/main/java/org/apache/accumulo/coordinator/SharedBatchWriter.java +++ b/server/compaction-coordinator/src/main/java/org/apache/accumulo/coordinator/SharedBatchWriter.java @@ -83,7 +83,7 @@ public void write(Mutation m) { private void processMutations() { Timer timer = Timer.startNew(); while (true) { - ArrayList batch = new ArrayList<>(); + ArrayList batch = new ArrayList<>(mutations.size()); try { batch.add(mutations.take()); } catch (InterruptedException e) { 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 11635facfdc..e15fe6d1e26 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 @@ -626,7 +626,7 @@ public List getActiveTservers(TInfo tinfo, TCredentials credentials) } Set tserverInstances = manager.onlineTabletServers(); - List servers = new ArrayList<>(); + List servers = new ArrayList<>(tserverInstances.size()); for (TServerInstance tserverInstance : tserverInstances) { servers.add(tserverInstance.getHostPort()); } diff --git a/server/tserver/src/main/java/org/apache/accumulo/tserver/log/LogSorter.java b/server/tserver/src/main/java/org/apache/accumulo/tserver/log/LogSorter.java index c1ad0fd54c4..d77f67301d2 100644 --- a/server/tserver/src/main/java/org/apache/accumulo/tserver/log/LogSorter.java +++ b/server/tserver/src/main/java/org/apache/accumulo/tserver/log/LogSorter.java @@ -174,7 +174,7 @@ public void sort(VolumeManager fs, String name, Path srcPath, String destPath) final long bufferSize = sortedLogConf.getAsBytes(prop); Thread.currentThread().setName("Sorting " + name + " for recovery"); while (true) { - final ArrayList> buffer = new ArrayList<>(); + final ArrayList> buffer = new ArrayList<>(512); try { long start = input.getPos(); while (input.getPos() - start < bufferSize) { @@ -274,7 +274,8 @@ void writeBuffer(String destPath, List> buffer, in var logFileKey = pair.getFirst(); var logFileValue = pair.getSecond(); Key k = logFileKey.toKey(); - keyListMap.computeIfAbsent(k, (key) -> new ArrayList<>()).addAll(logFileValue.getMutations()); + keyListMap.computeIfAbsent(k, (key) -> new ArrayList<>(logFileValue.getMutations().size())) + .addAll(logFileValue.getMutations()); } try (var writer = FileOperations.getInstance().newWriterBuilder() @@ -302,8 +303,8 @@ public void startWatchingForRecoveryLogs(AbstractServer server) } public List getLogSorts() { - List result = new ArrayList<>(); synchronized (currentWork) { + List result = new ArrayList<>(currentWork.size()); for (Entry entries : currentWork.entrySet()) { RecoveryStatus status = new RecoveryStatus(); status.name = entries.getKey(); diff --git a/server/tserver/src/main/java/org/apache/accumulo/tserver/session/SessionManager.java b/server/tserver/src/main/java/org/apache/accumulo/tserver/session/SessionManager.java index 0726c1997cb..8db43d5869b 100644 --- a/server/tserver/src/main/java/org/apache/accumulo/tserver/session/SessionManager.java +++ b/server/tserver/src/main/java/org/apache/accumulo/tserver/session/SessionManager.java @@ -444,7 +444,8 @@ public Map> getActiveScansPerTable() { public List getActiveScans() { - final List activeScans = new ArrayList<>(); + final List activeScans = + new ArrayList<>(sessions.size() + deferredCleanupQueue.size()); final long ct = System.currentTimeMillis(); final Set> copiedIdleSessions = new HashSet<>(); diff --git a/server/tserver/src/main/java/org/apache/accumulo/tserver/tablet/CompactableImpl.java b/server/tserver/src/main/java/org/apache/accumulo/tserver/tablet/CompactableImpl.java index 181ccfbbc9f..93da60b68dc 100644 --- a/server/tserver/src/main/java/org/apache/accumulo/tserver/tablet/CompactableImpl.java +++ b/server/tserver/src/main/java/org/apache/accumulo/tserver/tablet/CompactableImpl.java @@ -697,7 +697,8 @@ public CompactableImpl(Tablet tablet, CompactionManager manager, tabletMutator.mutate(); } - ArrayList extCompactingFiles = new ArrayList<>(); + ArrayList extCompactingFiles = new ArrayList<>( + extCompactions.values().stream().mapToInt(ecm -> ecm.getJobFiles().size()).sum()); extCompactions.forEach((ecid, ecMeta) -> { if (!extCompactionsToRemove.containsKey(ecid)) { diff --git a/server/tserver/src/main/java/org/apache/accumulo/tserver/tablet/ScanDataSource.java b/server/tserver/src/main/java/org/apache/accumulo/tserver/tablet/ScanDataSource.java index c53dd825edf..602f61c8456 100644 --- a/server/tserver/src/main/java/org/apache/accumulo/tserver/tablet/ScanDataSource.java +++ b/server/tserver/src/main/java/org/apache/accumulo/tserver/tablet/ScanDataSource.java @@ -216,8 +216,7 @@ private SortedKeyValueIterator createIterator() } var builder = new SystemIteratorEnvironmentImpl.Builder(tablet.getContext()) - .withTopLevelIterators(new ArrayList<>()).withScope(IteratorScope.scan) - .withTableId(tablet.getExtent().tableId()) + .withScope(IteratorScope.scan).withTableId(tablet.getExtent().tableId()) .withAuthorizations(scanParams.getAuthorizations()); if (samplerConfig != null) { builder.withSamplingEnabled(); diff --git a/server/tserver/src/main/java/org/apache/accumulo/tserver/tablet/Scanner.java b/server/tserver/src/main/java/org/apache/accumulo/tserver/tablet/Scanner.java index 9e2a7c7af03..06dbca07b4e 100644 --- a/server/tserver/src/main/java/org/apache/accumulo/tserver/tablet/Scanner.java +++ b/server/tserver/src/main/java/org/apache/accumulo/tserver/tablet/Scanner.java @@ -19,7 +19,7 @@ package org.apache.accumulo.tserver.tablet; import java.io.IOException; -import java.util.ArrayList; +import java.util.List; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.locks.ReentrantLock; @@ -142,7 +142,7 @@ private Pair readInternal() throws IOException, Tablet if (results.getResults() == null) { range = null; - return new Pair<>(new ScanBatch(new ArrayList<>(), false), dataSource); + return new Pair<>(new ScanBatch(List.of(), false), dataSource); } else if (results.getContinueKey() == null) { return new Pair<>(new ScanBatch(results.getResults(), false), dataSource); } else { diff --git a/server/tserver/src/main/java/org/apache/accumulo/tserver/tablet/Tablet.java b/server/tserver/src/main/java/org/apache/accumulo/tserver/tablet/Tablet.java index 8798abde4c4..d8ecce2da38 100644 --- a/server/tserver/src/main/java/org/apache/accumulo/tserver/tablet/Tablet.java +++ b/server/tserver/src/main/java/org/apache/accumulo/tserver/tablet/Tablet.java @@ -1819,7 +1819,7 @@ public long getSplitCreationTime() { public void importMapFiles(long tid, Map fileMap, boolean setTime) throws IOException { Map entries = new HashMap<>(fileMap.size()); - List files = new ArrayList<>(); + List files = new ArrayList<>(fileMap.size()); for (Entry entry : fileMap.entrySet()) { entries.put(entry.getKey(), new DataFileValue(entry.getValue().estimatedSize, 0L)); @@ -1891,7 +1891,8 @@ public void importMapFiles(long tid, Map fileMap, boolea synchronized (this) { // only mark the bulk import a success if no exception was thrown - bulkImported.computeIfAbsent(tid, k -> new ArrayList<>()).addAll(fileMap.keySet()); + bulkImported.computeIfAbsent(tid, k -> new ArrayList<>(fileMap.size())) + .addAll(fileMap.keySet()); } if (isSplitPossible()) { @@ -1996,8 +1997,8 @@ Set beginClearingUnusedLogs() { Preconditions.checkState(logLock.isHeldByCurrentThread()); Set unusedLogs = new HashSet<>(); - ArrayList otherLogsCopy = new ArrayList<>(); - ArrayList currentLogsCopy = new ArrayList<>(); + ArrayList otherLogsCopy = new ArrayList<>(otherLogs.size()); + ArrayList currentLogsCopy = new ArrayList<>(currentLogs.size()); synchronized (this) { if (removingLogs) { From e70fd50797f19287595f879a221d0c5299092203 Mon Sep 17 00:00:00 2001 From: Dave Marion Date: Mon, 29 Jun 2026 17:39:43 +0000 Subject: [PATCH 2/2] Revert method modifier changes to IsolatedScanner --- .../org/apache/accumulo/core/client/IsolatedScanner.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core/src/main/java/org/apache/accumulo/core/client/IsolatedScanner.java b/core/src/main/java/org/apache/accumulo/core/client/IsolatedScanner.java index db619a10de4..91fba468423 100644 --- a/core/src/main/java/org/apache/accumulo/core/client/IsolatedScanner.java +++ b/core/src/main/java/org/apache/accumulo/core/client/IsolatedScanner.java @@ -172,11 +172,11 @@ public void remove() { } - private interface RowBufferFactory { + public interface RowBufferFactory { RowBuffer newBuffer(int initialSize); } - private interface RowBuffer extends Iterable> { + public interface RowBuffer extends Iterable> { void add(Entry entry); @Override @@ -185,7 +185,7 @@ private interface RowBuffer extends Iterable> { void clear(); } - private static class MemoryRowBufferFactory implements RowBufferFactory { + public static class MemoryRowBufferFactory implements RowBufferFactory { @Override public RowBuffer newBuffer(int initialSize) {