This is an automated email from the ASF dual-hosted git repository.

ddanielr pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/accumulo.git


The following commit(s) were added to refs/heads/main by this push:
     new 756e17c5f3 Adds support for starting multiple managers per host (#6228)
756e17c5f3 is described below

commit 756e17c5f31e703cb29726071f6cb895a8e950d5
Author: Daniel Roberts <[email protected]>
AuthorDate: Fri Mar 20 21:17:20 2026 -0400

    Adds support for starting multiple managers per host (#6228)
    
    * Adds support for multiple managers per host
    
    Updates the cluster.yaml format to support running multiple managers on
    the same host.
    
    Updates the --manager flags to --managers
    Also updates -manager to -managers in ZooZap
    
    Moves stream into try-with-resources loop
---
 assemble/bin/accumulo-cluster                      | 19 +++++-----
 .../core/conf/cluster/ClusterConfigParser.java     | 34 +++++++++++++-----
 .../core/conf/cluster/ClusterConfigParserTest.java | 42 ++++++++++++++++++++--
 .../accumulo/core/conf/cluster/bad-group-name.yaml |  4 ++-
 .../core/conf/cluster/bad-group-suffix.yaml        |  4 ++-
 ...ad-group-name.yaml => bad-manager-section.yaml} |  9 +++--
 .../core/conf/cluster/bad-server-name.yaml         |  6 ++--
 .../cluster/cluster-missing-compactor-group.yaml   |  6 ++--
 .../cluster/cluster-missing-tserver-group.yaml     |  6 ++--
 .../apache/accumulo/core/conf/cluster/cluster.yaml |  6 ++--
 ...up-suffix.yaml => missing-manager-section.yaml} |  7 ++--
 .../core/conf/cluster/too-many-levels.yaml         |  4 ++-
 .../MiniAccumuloClusterControl.java                |  2 +-
 .../miniclusterImpl/MiniAccumuloClusterImpl.java   |  2 +-
 .../apache/accumulo/server/util/UpgradeUtil.java   |  2 +-
 .../org/apache/accumulo/server/util/ZooZap.java    |  8 ++---
 .../org/apache/accumulo/test/cluster.yaml          |  6 ++--
 17 files changed, 117 insertions(+), 50 deletions(-)

diff --git a/assemble/bin/accumulo-cluster b/assemble/bin/accumulo-cluster
index 8612613c92..c7e3c8e775 100755
--- a/assemble/bin/accumulo-cluster
+++ b/assemble/bin/accumulo-cluster
@@ -36,7 +36,7 @@ $(cyan Options):
     $(green --local)                  Operates on matching local services only 
(no SSH)
 
   $(cyan 'Service type selection options (if none are used, all service types 
are selected)'):
-    $(green --manager)                Selects the manager service (oversees 
cluster operations)
+    $(green --managers)               Selects the manager services (oversees 
cluster operations)
     $(green --gc)                     Selects the gc service (cleans up unused 
files)
     $(green --monitor)                Selects the monitor web service (shows 
cluster information)
     $(green --tservers)[$(yellow '=group')]       Selects the tablet server 
services (read/write operations on tablets)
@@ -58,11 +58,11 @@ $(cyan Examples):
   $(purple 'accumulo-cluster start')                                           
  $(blue '# start all servers')
   $(purple 'accumulo-cluster start --dry-run')                                 
  $(blue '# print debug information and commands to be executed')
   $(purple 'accumulo-cluster start --local')                                   
  $(blue '# start all local services')
-  $(purple 'accumulo-cluster start --local --manager')                         
  $(blue '# start local manager services')
+  $(purple 'accumulo-cluster start --local --managers')                        
  $(blue '# start local manager services')
   $(purple 'accumulo-cluster start --tservers')                                
  $(blue '# start all tservers')
   $(purple 'accumulo-cluster start --sservers=group1')                         
  $(blue '# start all group1 sservers')
   $(purple 'accumulo-cluster start --sservers="group1 group2"')                
  $(blue '# start all group1 and group2 sservers')
-  $(purple 'accumulo-cluster start --local --manager --tservers')              
  $(blue '# Start the local manager and local tservers')
+  $(purple 'accumulo-cluster start --local --managers --tservers')             
  $(blue '# Start the local managers and local tservers')
   $(purple 'accumulo-cluster prune --compactors')                              
  $(blue '# prune all extra compactors across all groups')
   $(purple 'accumulo-cluster prune --compactors="group1"')                     
  $(blue '# prune extra compactors running in group1')
 
@@ -144,7 +144,7 @@ function parse_args() {
         ARG_LOCAL=1
         shift 1
         ;;
-      --manager)
+      --managers)
         ARG_ALL=0
         ARG_MANAGER=1
         shift 1
@@ -614,7 +614,7 @@ function control_services() {
 
   if [[ $ARG_LOCAL == 0 && $ARG_ALL == 1 && ($operation == "stop" || 
$operation == "kill") ]]; then
     debug "Cleaning all server entries in ZooKeeper"
-    debugOrRunAsync "$accumulo_cmd" proc zoo-zap -verbose -manager -tservers 
-compactors -sservers --gc --monitor
+    debugOrRunAsync "$accumulo_cmd" proc zoo-zap -verbose -managers -tservers 
-compactors -sservers --gc --monitor
   fi
 
   wait
@@ -647,7 +647,7 @@ function prune_group() {
   local lockTypeOpt
   case $service_type in
     manager)
-      lockTypeOpt="-manager"
+      lockTypeOpt="-managers"
       ;;
     compaction-coordinator)
       lockTypeOpt="-compaction-coordinators"
@@ -728,7 +728,8 @@ function prune() {
 
   local manager
   if [[ $ARG_ALL == 1 || $ARG_MANAGER == 1 ]]; then
-    prune_group "manager" "default" "1" "$MANAGER_HOSTS"
+    local expected=${MANAGERS_PER_HOST_default:-1}
+    prune_group "manager" "default" "$expected" "$MANAGER_HOSTS"
   fi
 
   if [[ $ARG_ALL == 1 || $ARG_GC == 1 ]]; then
@@ -826,7 +827,9 @@ function main() {
       fi
       cat <<EOF >"$conf"/cluster.yaml
 manager:
-  - localhost
+  servers_per_host: 1
+  hosts:
+    - localhost
 
 monitor:
   - localhost
diff --git 
a/core/src/main/java/org/apache/accumulo/core/conf/cluster/ClusterConfigParser.java
 
b/core/src/main/java/org/apache/accumulo/core/conf/cluster/ClusterConfigParser.java
index 0adc56da29..0fa1c7cfc0 100644
--- 
a/core/src/main/java/org/apache/accumulo/core/conf/cluster/ClusterConfigParser.java
+++ 
b/core/src/main/java/org/apache/accumulo/core/conf/cluster/ClusterConfigParser.java
@@ -18,6 +18,8 @@
  */
 package org.apache.accumulo.core.conf.cluster;
 
+import static org.apache.accumulo.core.Constants.DEFAULT_RESOURCE_GROUP_NAME;
+
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
@@ -47,7 +49,7 @@ public class ClusterConfigParser {
   private static final String PROPERTY_FORMAT = "%s=\"%s\"%n";
   private static final String COMPACTOR_PREFIX = "compactor.";
   private static final String GC_KEY = "gc";
-  private static final String MANAGER_KEY = "manager";
+  private static final String MANAGER_PREFIX = "manager";
   private static final String MONITOR_KEY = "monitor";
   private static final String SSERVER_PREFIX = "sserver.";
   private static final String TSERVER_PREFIX = "tserver.";
@@ -55,13 +57,12 @@ public class ClusterConfigParser {
   private static final String HOSTS_SUFFIX = ".hosts";
   private static final String SERVERS_PER_HOST_SUFFIX = ".servers_per_host";
 
-  private static final String[] UNGROUPED_SECTIONS =
-      new String[] {MANAGER_KEY, MONITOR_KEY, GC_KEY};
+  private static final String[] UNGROUPED_SECTIONS = new String[] 
{MONITOR_KEY, GC_KEY};
 
-  private static final Set<String> VALID_CONFIG_KEYS = Set.of(MANAGER_KEY, 
MONITOR_KEY, GC_KEY);
+  private static final Set<String> VALID_CONFIG_KEYS = Set.of(MONITOR_KEY, 
GC_KEY);
 
   private static final Set<String> VALID_CONFIG_PREFIXES =
-      Set.of(COMPACTOR_PREFIX, SSERVER_PREFIX, TSERVER_PREFIX);
+      Set.of(MANAGER_PREFIX, COMPACTOR_PREFIX, SSERVER_PREFIX, TSERVER_PREFIX);
 
   private static final Predicate<String> VALID_CONFIG_SECTIONS =
       section -> VALID_CONFIG_KEYS.contains(section)
@@ -143,11 +144,26 @@ public class ClusterConfigParser {
     for (String section : UNGROUPED_SECTIONS) {
       if (config.containsKey(section)) {
         out.printf(PROPERTY_FORMAT, section.toUpperCase() + "_HOSTS", 
config.get(section));
+      }
+    }
+
+    // Manager doesn't use resource groups so it's handled separately
+    var managerSection = config.keySet().stream().filter(k -> 
k.startsWith(MANAGER_PREFIX))
+        .collect(Collectors.toSet());
+    if (managerSection.isEmpty()) {
+      throw new IllegalStateException("Manager is required in the 
configuration");
+    }
+
+    for (String k : managerSection) {
+      if (k.equals(MANAGER_PREFIX + HOSTS_SUFFIX)) {
+        out.printf(PROPERTY_FORMAT, "MANAGER_HOSTS", config.get(k));
+      } else if (k.equals(MANAGER_PREFIX + SERVERS_PER_HOST_SUFFIX)) {
+        out.printf(PROPERTY_FORMAT, "MANAGERS_PER_HOST_" + 
DEFAULT_RESOURCE_GROUP_NAME,
+            config.getOrDefault(k, "1"));
       } else {
-        if (section.equals(MANAGER_KEY)) {
-          throw new IllegalStateException("Manager is required in the 
configuration");
-        }
-        System.err.println("WARN: " + section + " is missing");
+        throw new IllegalArgumentException("Unknown manager entry for: " + k + 
". Only "
+            + MANAGER_PREFIX + HOSTS_SUFFIX + " or " + MANAGER_PREFIX + 
SERVERS_PER_HOST_SUFFIX
+            + " are allowed. Check the format of your cluster.yaml file.");
       }
     }
 
diff --git 
a/core/src/test/java/org/apache/accumulo/core/conf/cluster/ClusterConfigParserTest.java
 
b/core/src/test/java/org/apache/accumulo/core/conf/cluster/ClusterConfigParserTest.java
index 6c45f5d8cd..fac6a50a3a 100644
--- 
a/core/src/test/java/org/apache/accumulo/core/conf/cluster/ClusterConfigParserTest.java
+++ 
b/core/src/test/java/org/apache/accumulo/core/conf/cluster/ClusterConfigParserTest.java
@@ -58,9 +58,11 @@ public class ClusterConfigParserTest extends WithTestNames {
 
     Map<String,String> contents =
         ClusterConfigParser.parseConfiguration(Path.of(configFile.toURI()));
-    assertEquals(14, contents.size());
-    assertTrue(contents.containsKey("manager"));
-    assertEquals("localhost1 localhost2", contents.get("manager"));
+    assertEquals(15, contents.size());
+    assertTrue(contents.containsKey("manager.hosts"));
+    assertEquals("localhost1 localhost2", contents.get("manager.hosts"));
+    assertTrue(contents.containsKey("manager.servers_per_host"));
+    assertEquals("2", contents.get("manager.servers_per_host"));
     assertTrue(contents.containsKey("monitor"));
     assertEquals("localhost1 localhost2", contents.get("monitor"));
     assertTrue(contents.containsKey("gc"));
@@ -156,6 +158,7 @@ public class ClusterConfigParserTest extends WithTestNames {
     final Path f = outputConfigFunction.apply(configFile);
 
     Map<String,String> expected = new TreeMap<>();
+    expected.put("MANAGERS_PER_HOST_default", "2");
     expected.put("MANAGER_HOSTS", "localhost1 localhost2");
     expected.put("MONITOR_HOSTS", "localhost1 localhost2");
     expected.put("GC_HOSTS", "localhost");
@@ -303,4 +306,37 @@ public class ClusterConfigParserTest extends WithTestNames 
{
     }
   }
 
+  @Test
+  public void testFileMissingManagerSection() throws Exception {
+    URL configFile = ClusterConfigParserTest.class
+        
.getResource("/org/apache/accumulo/core/conf/cluster/missing-manager-section.yaml");
+    assertNotNull(configFile);
+
+    Map<String,String> contents =
+        ClusterConfigParser.parseConfiguration(Path.of(configFile.toURI()));
+
+    try (var baos = new ByteArrayOutputStream(); var ps = new 
PrintStream(baos)) {
+      var exception = assertThrows(IllegalStateException.class,
+          () -> ClusterConfigParser.outputShellVariables(contents, ps));
+      assertTrue(exception.getMessage().contains("Manager is required in the 
configuration"));
+    }
+  }
+
+  @Test
+  public void testFileBadManagerSection() throws Exception {
+    URL configFile = ClusterConfigParserTest.class
+        
.getResource("/org/apache/accumulo/core/conf/cluster/bad-manager-section.yaml");
+    assertNotNull(configFile);
+
+    Map<String,String> contents =
+        ClusterConfigParser.parseConfiguration(Path.of(configFile.toURI()));
+
+    try (var baos = new ByteArrayOutputStream(); var ps = new 
PrintStream(baos)) {
+      var exception = assertThrows(IllegalArgumentException.class,
+          () -> ClusterConfigParser.outputShellVariables(contents, ps));
+      assertTrue(
+          exception.getMessage().contains("Unknown manager entry for: 
manager.extra_broken"));
+    }
+  }
+
 }
diff --git 
a/core/src/test/resources/org/apache/accumulo/core/conf/cluster/bad-group-name.yaml
 
b/core/src/test/resources/org/apache/accumulo/core/conf/cluster/bad-group-name.yaml
index 3fb979d040..2ced2b50b1 100644
--- 
a/core/src/test/resources/org/apache/accumulo/core/conf/cluster/bad-group-name.yaml
+++ 
b/core/src/test/resources/org/apache/accumulo/core/conf/cluster/bad-group-name.yaml
@@ -18,7 +18,9 @@
 #
 
 manager:
-  - localhost
+  servers_per_host: 1
+  hosts:
+    - localhost
 
 monitor:
   - localhost
diff --git 
a/core/src/test/resources/org/apache/accumulo/core/conf/cluster/bad-group-suffix.yaml
 
b/core/src/test/resources/org/apache/accumulo/core/conf/cluster/bad-group-suffix.yaml
index 20bd98d65f..5464c93f1a 100644
--- 
a/core/src/test/resources/org/apache/accumulo/core/conf/cluster/bad-group-suffix.yaml
+++ 
b/core/src/test/resources/org/apache/accumulo/core/conf/cluster/bad-group-suffix.yaml
@@ -18,7 +18,9 @@
 #
 
 manager:
-  - localhost
+  servers_per_host: 1
+  hosts:
+    - localhost
 
 monitor:
   - localhost
diff --git 
a/core/src/test/resources/org/apache/accumulo/core/conf/cluster/bad-group-name.yaml
 
b/core/src/test/resources/org/apache/accumulo/core/conf/cluster/bad-manager-section.yaml
similarity index 92%
copy from 
core/src/test/resources/org/apache/accumulo/core/conf/cluster/bad-group-name.yaml
copy to 
core/src/test/resources/org/apache/accumulo/core/conf/cluster/bad-manager-section.yaml
index 3fb979d040..8b3545fdee 100644
--- 
a/core/src/test/resources/org/apache/accumulo/core/conf/cluster/bad-group-name.yaml
+++ 
b/core/src/test/resources/org/apache/accumulo/core/conf/cluster/bad-manager-section.yaml
@@ -18,7 +18,10 @@
 #
 
 manager:
-  - localhost
+  servers_per_host: 1
+  extra_broken: 2
+  hosts:
+    - localhost
 
 monitor:
   - localhost
@@ -37,10 +40,6 @@ sserver:
     servers_per_host: 1
     hosts:
       - localhost
-  bad-group-name:
-    servers_per_host: 1        
-    hosts:
-      - localhost
 
 tserver:
   default:
diff --git 
a/core/src/test/resources/org/apache/accumulo/core/conf/cluster/bad-server-name.yaml
 
b/core/src/test/resources/org/apache/accumulo/core/conf/cluster/bad-server-name.yaml
index c805df7393..f55a8f372c 100644
--- 
a/core/src/test/resources/org/apache/accumulo/core/conf/cluster/bad-server-name.yaml
+++ 
b/core/src/test/resources/org/apache/accumulo/core/conf/cluster/bad-server-name.yaml
@@ -18,8 +18,10 @@
 #
 
 manager:
-  - localhost1
-  - localhost2
+  servers_per_host: 1
+  hosts:
+    - localhost1
+    - localhost2
 
 monitor:
   - localhost1
diff --git 
a/core/src/test/resources/org/apache/accumulo/core/conf/cluster/cluster-missing-compactor-group.yaml
 
b/core/src/test/resources/org/apache/accumulo/core/conf/cluster/cluster-missing-compactor-group.yaml
index a64c6a517c..55e8ed471e 100644
--- 
a/core/src/test/resources/org/apache/accumulo/core/conf/cluster/cluster-missing-compactor-group.yaml
+++ 
b/core/src/test/resources/org/apache/accumulo/core/conf/cluster/cluster-missing-compactor-group.yaml
@@ -18,8 +18,10 @@
 #
 
 manager:
-  - localhost1
-  - localhost2
+  servers_per_host: 2
+  hosts:
+    - localhost1
+    - localhost2
 
 monitor:
   - localhost1
diff --git 
a/core/src/test/resources/org/apache/accumulo/core/conf/cluster/cluster-missing-tserver-group.yaml
 
b/core/src/test/resources/org/apache/accumulo/core/conf/cluster/cluster-missing-tserver-group.yaml
index 12e5bce913..74c0d72c18 100644
--- 
a/core/src/test/resources/org/apache/accumulo/core/conf/cluster/cluster-missing-tserver-group.yaml
+++ 
b/core/src/test/resources/org/apache/accumulo/core/conf/cluster/cluster-missing-tserver-group.yaml
@@ -18,8 +18,10 @@
 #
 
 manager:
-  - localhost1
-  - localhost2
+  servers_per_host: 2
+  hosts:
+    - localhost1
+    - localhost2
 
 monitor:
   - localhost1
diff --git 
a/core/src/test/resources/org/apache/accumulo/core/conf/cluster/cluster.yaml 
b/core/src/test/resources/org/apache/accumulo/core/conf/cluster/cluster.yaml
index 21eafe7627..d452a26163 100644
--- a/core/src/test/resources/org/apache/accumulo/core/conf/cluster/cluster.yaml
+++ b/core/src/test/resources/org/apache/accumulo/core/conf/cluster/cluster.yaml
@@ -18,8 +18,10 @@
 #
 
 manager:
-  - localhost1
-  - localhost2
+  servers_per_host: 2
+  hosts:
+   - localhost1
+   - localhost2
 
 monitor:
   - localhost1
diff --git 
a/core/src/test/resources/org/apache/accumulo/core/conf/cluster/bad-group-suffix.yaml
 
b/core/src/test/resources/org/apache/accumulo/core/conf/cluster/missing-manager-section.yaml
similarity index 93%
copy from 
core/src/test/resources/org/apache/accumulo/core/conf/cluster/bad-group-suffix.yaml
copy to 
core/src/test/resources/org/apache/accumulo/core/conf/cluster/missing-manager-section.yaml
index 20bd98d65f..e57e47c729 100644
--- 
a/core/src/test/resources/org/apache/accumulo/core/conf/cluster/bad-group-suffix.yaml
+++ 
b/core/src/test/resources/org/apache/accumulo/core/conf/cluster/missing-manager-section.yaml
@@ -17,9 +17,6 @@
 # under the License.
 #
 
-manager:
-  - localhost
-
 monitor:
   - localhost
 
@@ -34,7 +31,7 @@ compactor:
 
 sserver:
   default:
-    servers_per_hosts: 1
+    servers_per_host: 1
     hosts:
       - localhost
 
@@ -42,4 +39,4 @@ tserver:
   default:
     servers_per_host: 1
     hosts:
-      - localhost
+      - localhost
\ No newline at end of file
diff --git 
a/core/src/test/resources/org/apache/accumulo/core/conf/cluster/too-many-levels.yaml
 
b/core/src/test/resources/org/apache/accumulo/core/conf/cluster/too-many-levels.yaml
index 30270e1011..a655a2e4c8 100644
--- 
a/core/src/test/resources/org/apache/accumulo/core/conf/cluster/too-many-levels.yaml
+++ 
b/core/src/test/resources/org/apache/accumulo/core/conf/cluster/too-many-levels.yaml
@@ -18,7 +18,9 @@
 #
 
 manager:
-  - localhost
+  servers_per_host: 2
+  hosts:
+    - localhost1
 
 monitor:
   - localhost
diff --git 
a/minicluster/src/main/java/org/apache/accumulo/miniclusterImpl/MiniAccumuloClusterControl.java
 
b/minicluster/src/main/java/org/apache/accumulo/miniclusterImpl/MiniAccumuloClusterControl.java
index b075dba7ae..f45c4fcb87 100644
--- 
a/minicluster/src/main/java/org/apache/accumulo/miniclusterImpl/MiniAccumuloClusterControl.java
+++ 
b/minicluster/src/main/java/org/apache/accumulo/miniclusterImpl/MiniAccumuloClusterControl.java
@@ -317,7 +317,7 @@ public class MiniAccumuloClusterControl implements 
ClusterControl {
             cluster.stopProcessesWithTimeout(ServerType.MANAGER, 
managerProcesses, 30,
                 TimeUnit.SECONDS);
             try {
-              new ZooZap().execute(new String[] {"-manager"});
+              new ZooZap().execute(new String[] {"-managers"});
             } catch (Exception e) {
               log.error("Error zapping Manager zookeeper lock", e);
             }
diff --git 
a/minicluster/src/main/java/org/apache/accumulo/miniclusterImpl/MiniAccumuloClusterImpl.java
 
b/minicluster/src/main/java/org/apache/accumulo/miniclusterImpl/MiniAccumuloClusterImpl.java
index 3d9103985e..77f7571fba 100644
--- 
a/minicluster/src/main/java/org/apache/accumulo/miniclusterImpl/MiniAccumuloClusterImpl.java
+++ 
b/minicluster/src/main/java/org/apache/accumulo/miniclusterImpl/MiniAccumuloClusterImpl.java
@@ -1031,7 +1031,7 @@ public class MiniAccumuloClusterImpl implements 
AccumuloCluster {
     // and not wait for the old locks to be cleaned up.
     try {
       new ZooZap()
-          .execute(new String[] {"-manager", "-tservers", "-compactors", 
"-sservers", "--gc"});
+          .execute(new String[] {"-managers", "-tservers", "-compactors", 
"-sservers", "--gc"});
     } catch (Exception e) {
       if (!e.getMessage().startsWith("Accumulo not initialized")) {
         log.error("Error zapping zookeeper locks", e);
diff --git 
a/server/base/src/main/java/org/apache/accumulo/server/util/UpgradeUtil.java 
b/server/base/src/main/java/org/apache/accumulo/server/util/UpgradeUtil.java
index 6154a42409..515a5fa7cb 100644
--- a/server/base/src/main/java/org/apache/accumulo/server/util/UpgradeUtil.java
+++ b/server/base/src/main/java/org/apache/accumulo/server/util/UpgradeUtil.java
@@ -202,7 +202,7 @@ public class UpgradeUtil implements KeywordExecutable {
     try {
       LOG.info("Forcing removal of all server locks");
       new ZooZap().execute(
-          new String[] {"-manager", "-tservers", "-compactors", "-sservers", 
"--monitor", "--gc"});
+          new String[] {"-managers", "-tservers", "-compactors", "-sservers", 
"--monitor", "--gc"});
     } catch (Exception e) {
       throw new IllegalStateException("Error deleting server locks", e);
     }
diff --git 
a/server/base/src/main/java/org/apache/accumulo/server/util/ZooZap.java 
b/server/base/src/main/java/org/apache/accumulo/server/util/ZooZap.java
index b6e36ae692..fb0ad2210d 100644
--- a/server/base/src/main/java/org/apache/accumulo/server/util/ZooZap.java
+++ b/server/base/src/main/java/org/apache/accumulo/server/util/ZooZap.java
@@ -79,7 +79,7 @@ public class ZooZap extends ServerKeywordExecutable<ZapOpts> {
   }
 
   static class ZapOpts extends ServerOpts {
-    @Parameter(names = "-manager", description = "remove manager locks")
+    @Parameter(names = "-managers", description = "remove manager locks")
     boolean zapManager = false;
     @Parameter(names = "-tservers", description = "remove tablet server locks")
     boolean zapTservers = false;
@@ -109,9 +109,9 @@ public class ZooZap extends 
ServerKeywordExecutable<ZapOpts> {
     final AddressSelector addressSelector;
 
     if (opts.hostPortExcludeFile != null) {
-      try {
-        var hostPorts = 
Files.lines(java.nio.file.Path.of(opts.hostPortExcludeFile))
-            
.map(String::trim).map(HostAndPort::fromString).collect(Collectors.toSet());
+      try (var exclusions = 
Files.lines(java.nio.file.Path.of(opts.hostPortExcludeFile))) {
+        var hostPorts =
+            
exclusions.map(String::trim).map(HostAndPort::fromString).collect(Collectors.toSet());
         addressSelector =
             AddressSelector.matching(hp -> 
!hostPorts.contains(HostAndPort.fromString(hp)));
       } catch (IOException e) {
diff --git a/test/src/main/resources/org/apache/accumulo/test/cluster.yaml 
b/test/src/main/resources/org/apache/accumulo/test/cluster.yaml
index 21eafe7627..cb36cf484d 100644
--- a/test/src/main/resources/org/apache/accumulo/test/cluster.yaml
+++ b/test/src/main/resources/org/apache/accumulo/test/cluster.yaml
@@ -18,8 +18,10 @@
 #
 
 manager:
-  - localhost1
-  - localhost2
+  servers_per_host: 1
+  hosts:
+    - localhost1
+    - localhost2
 
 monitor:
   - localhost1

Reply via email to