This is an automated email from the ASF dual-hosted git repository. dlmarion pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/accumulo.git
commit 0466e7421bcdfc18b78c05cbde8678a840ee6d4d Merge: 6293e0cc1b de83b942f0 Author: Dave Marion <[email protected]> AuthorDate: Tue Jul 7 15:57:01 2026 +0000 Merge branch '2.1' .../accumulo/core/client/MutationsRejectedException.java | 4 ++-- .../apache/accumulo/core/client/rfile/RFileWriter.java | 6 +++--- .../accumulo/core/clientImpl/TableOperationsImpl.java | 8 ++++---- .../java/org/apache/accumulo/core/data/Condition.java | 4 ++-- .../core/data/constraints/VisibilityConstraint.java | 2 +- .../java/org/apache/accumulo/core/file/rfile/RFile.java | 2 +- .../system/ColumnFamilySkippingIterator.java | 3 +-- .../accumulo/core/metadata/schema/TabletMetadata.java | 7 ++++--- .../org/apache/accumulo/core/util/LocalityGroupUtil.java | 2 +- .../core/util/compaction/ExternalCompactionUtil.java | 15 ++++++++------- server/gc/src/main/java/org/apache/accumulo/gc/GCRun.java | 10 ++++++---- .../apache/accumulo/gc/GarbageCollectionAlgorithm.java | 2 +- .../org/apache/accumulo/tserver/TabletClientHandler.java | 4 +++- .../apache/accumulo/tserver/ThriftScanClientHandler.java | 4 ++-- .../java/org/apache/accumulo/tserver/tablet/Tablet.java | 7 ++++--- 15 files changed, 43 insertions(+), 37 deletions(-) diff --cc core/src/main/java/org/apache/accumulo/core/data/constraints/VisibilityConstraint.java index c9fcdc235b,e814782f2e..c4ec58dcda --- a/core/src/main/java/org/apache/accumulo/core/data/constraints/VisibilityConstraint.java +++ b/core/src/main/java/org/apache/accumulo/core/data/constraints/VisibilityConstraint.java @@@ -60,10 -64,10 +60,10 @@@ public class VisibilityConstraint imple HashSet<String> ok = null; if (updates.size() > 1) { - ok = new HashSet<>(); + ok = new HashSet<>(updates.size()); } - VisibilityEvaluator ve = null; + BytesAccess.BytesEvaluator ve = null; for (ColumnUpdate update : updates) { diff --cc core/src/main/java/org/apache/accumulo/core/metadata/schema/TabletMetadata.java index 3ae83c4eca,dd11a95df8..4977d4cf35 --- a/core/src/main/java/org/apache/accumulo/core/metadata/schema/TabletMetadata.java +++ b/core/src/main/java/org/apache/accumulo/core/metadata/schema/TabletMetadata.java @@@ -828,14 -535,15 +828,15 @@@ public class TabletMetadata * pulled from org.apache.accumulo.server.manager.LiveTServerSet */ public static synchronized Set<TServerInstance> getLiveTServers(ClientContext context) { - final Set<TServerInstance> liveServers = new HashSet<>(); - for (ServiceLockPath slp : context.getServerPaths().getTabletServer(ResourceGroupPredicate.ANY, - AddressSelector.all(), true)) { - final String path = context.getZooKeeperRoot() + Constants.ZTSERVERS; - final List<String> children = context.getZooCache().getChildren(path); - final Set<TServerInstance> liveServers = new HashSet<>(children.size()); ++ Set<ServiceLockPath> locks = context.getServerPaths() ++ .getTabletServer(ResourceGroupPredicate.ANY, AddressSelector.all(), true); ++ final Set<TServerInstance> liveServers = new HashSet<>(locks.size()); ++ for (ServiceLockPath slp : locks) { - for (String child : children) { - checkServer(context, path, child).ifPresent(liveServers::add); + checkTabletServer(context, slp).ifPresent(liveServers::add); } - log.trace("Found {} live tservers at ZK path: {}", liveServers.size(), path); + log.trace("Found {} live tservers in ZooKeeper", liveServers.size()); return liveServers; } diff --cc core/src/main/java/org/apache/accumulo/core/util/compaction/ExternalCompactionUtil.java index bffee1f518,c6be864ce8..7c8e878531 --- 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 @@@ -266,16 -257,18 +266,17 @@@ public class ExternalCompactionUtil getCompactionIdsRunningOnCompactors(ClientContext context) { final ExecutorService executor = ThreadPools.getServerThreadPools() .getPoolBuilder(COMPACTOR_RUNNING_COMPACTION_IDS_POOL).numCoreThreads(16).build(); - List<Future<ExternalCompactionId>> futures = new ArrayList<>(); - context.getServerPaths().getCompactor(ResourceGroupPredicate.ANY, AddressSelector.all(), true) - .forEach(slp -> { - final HostAndPort hp = HostAndPort.fromString(slp.getServer()); - futures.add(executor.submit(() -> getRunningCompactionId(hp, context))); - }); - var compactors = getCompactorAddrs(context); ++ Set<ServiceLockPath> compactors = context.getServerPaths() ++ .getCompactor(ResourceGroupPredicate.ANY, AddressSelector.all(), true); + List<Future<ExternalCompactionId>> futures = new ArrayList<>(compactors.size()); - - compactors.forEach((q, hp) -> { - hp.forEach(hostAndPort -> { - futures.add(executor.submit(() -> getRunningCompactionId(hostAndPort, context))); - }); ++ compactors.forEach(slp -> { ++ final HostAndPort hp = HostAndPort.fromString(slp.getServer()); ++ futures.add(executor.submit(() -> getRunningCompactionId(hp, context))); + }); executor.shutdown(); - HashSet<ExternalCompactionId> runningIds = new HashSet<>(); + HashSet<ExternalCompactionId> runningIds = new HashSet<>(compactors.size() / 4); futures.forEach(future -> { try { diff --cc server/gc/src/main/java/org/apache/accumulo/gc/GCRun.java index dbef6f904b,cbd968245e..0fe140ce33 --- a/server/gc/src/main/java/org/apache/accumulo/gc/GCRun.java +++ b/server/gc/src/main/java/org/apache/accumulo/gc/GCRun.java @@@ -233,12 -243,14 +233,13 @@@ public class GCRun implements GarbageCo IllegalStateException ioe = null; while (retries <= 10) { try { - zr.sync(tablesPath); - var tables = zr.getChildren(tablesPath); + zr.sync(Constants.ZTABLES); - final Map<TableId,TableState> tids = new HashMap<>(); - for (String table : zr.getChildren(Constants.ZTABLES)) { ++ var tables = zr.getChildren(Constants.ZTABLES); + final Map<TableId,TableState> tids = new HashMap<>(tables.size(), 1.0f); + for (String table : tables) { TableId tableId = TableId.of(table); TableState tableState = null; - String statePath = context.getZooKeeperRoot() + Constants.ZTABLES + "/" - + tableId.canonical() + Constants.ZTABLE_STATE; + String statePath = Constants.ZTABLES + "/" + tableId.canonical() + Constants.ZTABLE_STATE; try { byte[] state = zr.getData(statePath); if (state == null) { @@@ -552,12 -605,13 +553,13 @@@ @Override public Set<TableId> getCandidateTableIDs() throws InterruptedException { if (level == DataLevel.ROOT) { - return Set.of(RootTable.ID); + return Set.of(SystemTables.ROOT.tableId()); } else if (level == DataLevel.METADATA) { - return Set.of(MetadataTable.ID); + return Set.of(SystemTables.METADATA.tableId()); } else if (level == DataLevel.USER) { - Set<TableId> tableIds = new HashSet<>(); - getTableIDs().forEach((k, v) -> { + var tids = getTableIDs(); + Set<TableId> tableIds = new HashSet<>(tids.size(), 1.0f); + tids.forEach((k, v) -> { if (v == TableState.ONLINE || v == TableState.OFFLINE) { // Don't return tables that are NEW, DELETING, or in an // UNKNOWN state. diff --cc server/gc/src/main/java/org/apache/accumulo/gc/GarbageCollectionAlgorithm.java index 7a8610a17b,1d5863ca9e..462d593cf4 --- a/server/gc/src/main/java/org/apache/accumulo/gc/GarbageCollectionAlgorithm.java +++ b/server/gc/src/main/java/org/apache/accumulo/gc/GarbageCollectionAlgorithm.java @@@ -141,57 -145,55 +141,57 @@@ public class GarbageCollectionAlgorith List<GcCandidate> candidateEntriesToBeDeleted = new ArrayList<>(); Set<TableId> tableIdsBefore = gce.getCandidateTableIDs(); - Set<TableId> tableIdsSeen = new HashSet<>(); + Set<TableId> tableIdsSeen = new HashSet<>(tableIdsBefore.size()); - Iterator<Reference> iter = gce.getReferences().iterator(); - while (iter.hasNext()) { - Reference ref = iter.next(); - tableIdsSeen.add(ref.getTableId()); + try (Stream<Reference> references = gce.getReferences()) { + references.forEach(ref -> { + tableIdsSeen.add(ref.getTableId()); - if (ref.isDirectory()) { - ServerColumnFamily.validateDirCol(ref.getMetadataEntry()); + if (ref.isDirectory()) { + ServerColumnFamily.validateDirCol(ref.getMetadataPath()); - String dir = "/" + ref.getTableId() + "/" + ref.getMetadataEntry(); + String dir = "/" + ref.getTableId() + "/" + ref.getMetadataPath(); - dir = makeRelative(dir, 2); + dir = makeRelative(dir, 2); - GcCandidate gcTemp = candidateMap.remove(dir); - if (gcTemp != null) { - log.debug("Directory Candidate was still in use by dir ref: {}", dir); - // Do not add dir candidates to candidateEntriesToBeDeleted as they are only created once. - } - } else { - String reference = ref.getMetadataEntry(); - if (reference.startsWith("/")) { - log.debug("Candidate {} has a relative path, prepend tableId {}", reference, - ref.getTableId()); - reference = "/" + ref.getTableId() + ref.getMetadataEntry(); - } else if (!reference.contains(":") && !reference.startsWith("../")) { - throw new RuntimeException("Bad file reference " + reference); - } + GcCandidate gcTemp = candidateMap.remove(dir); + if (gcTemp != null) { + log.debug("Directory Candidate was still in use by dir ref: {}", dir); + // Do not add dir candidates to candidateEntriesToBeDeleted as they are only created + // once. + } + } else { + String reference = ref.getMetadataPath(); + if (reference.startsWith("/")) { + log.debug("Candidate {} has a relative path, prepend tableId {}", reference, + ref.getTableId()); + reference = "/" + ref.getTableId() + ref.getMetadataPath(); + } else if (!reference.contains(":") && !reference.startsWith("../")) { + throw new RuntimeException("Bad file reference " + reference); + } - String relativePath = makeRelative(reference, 3); - - // WARNING: This line is EXTREMELY IMPORTANT. - // You MUST REMOVE candidates that are still in use - GcCandidate gcTemp = candidateMap.remove(relativePath); - if (gcTemp != null) { - log.debug("File Candidate was still in use: {}", relativePath); - // Prevent deletion of candidates that are still in use by scans, because they won't be - // recreated once the scan is finished. - if (!ref.isScan()) { - candidateEntriesToBeDeleted.add(gcTemp); + String relativePath = makeRelative(reference, 3); + + // WARNING: This line is EXTREMELY IMPORTANT. + // You MUST REMOVE candidates that are still in use + GcCandidate gcTemp = candidateMap.remove(relativePath); + if (gcTemp != null) { + log.debug("File Candidate was still in use: {}", relativePath); + // Prevent deletion of candidates that are still in use by scans, because they won't be + // recreated once the scan is finished. + if (!ref.isScan()) { + candidateEntriesToBeDeleted.add(gcTemp); + } } - } - String dir = relativePath.substring(0, relativePath.lastIndexOf('/')); - GcCandidate gcT = candidateMap.remove(dir); - if (gcT != null) { - log.debug("Directory Candidate was still in use by file ref: {}", relativePath); - // Do not add dir candidates to candidateEntriesToBeDeleted as they are only created once. + String dir = relativePath.substring(0, relativePath.lastIndexOf('/')); + GcCandidate gcT = candidateMap.remove(dir); + if (gcT != null) { + log.debug("Directory Candidate was still in use by file ref: {}", relativePath); + // Do not add dir candidates to candidateEntriesToBeDeleted as they are only created + // once. + } } - } + }); } Set<TableId> tableIdsAfter = gce.getCandidateTableIDs(); ensureAllTablesChecked(Collections.unmodifiableSet(tableIdsBefore), diff --cc server/tserver/src/main/java/org/apache/accumulo/tserver/tablet/Tablet.java index 64f7a4f302,63b3d95866..c1a4b5675a --- 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 @@@ -277,9 -341,9 +277,10 @@@ public class Tablet extends TabletBase final AtomicLong maxTime = new AtomicLong(Long.MIN_VALUE); final CommitSession commitSession = getTabletMemory().getCommitSession(); try { - Set<String> absPaths = new HashSet<>(); - for (StoredTabletFile ref : metadata.getFiles()) { - Set<String> absPaths = new HashSet<>(datafiles.size()); - for (TabletFile ref : datafiles.keySet()) { - absPaths.add(ref.getPathStr()); ++ Set<StoredTabletFile> files = metadata.getFiles(); ++ Set<String> absPaths = new HashSet<>(files.size()); ++ for (StoredTabletFile ref : files) { + absPaths.add(ref.getNormalizedPathStr()); } tabletServer.recover(this.getTabletServer().getVolumeManager(), extent, logEntries, @@@ -335,9 -395,10 +336,9 @@@ } } // make some closed references that represent the recovered logs - currentLogs = new HashSet<>(); + currentLogs = new HashSet<>(logEntries.size(), 1.0f); for (LogEntry logEntry : logEntries) { - currentLogs.add(new DfsLogger(tabletServer.getContext(), tabletServer.getServerConfig(), - logEntry.filename, logEntry.getColumnQualifier().toString())); + currentLogs.add(DfsLogger.fromLogEntry(logEntry)); } rebuildReferencedLogs();
