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


The following commit(s) were added to refs/heads/main by this push:
     new e725cfed7d Modified ServiceLockPaths.get method to return paths with 
or w/out lock (#4891)
e725cfed7d is described below

commit e725cfed7d98af4941775fa5ae5b92dd3229e11d
Author: Dave Marion <dlmar...@apache.org>
AuthorDate: Tue Oct 1 10:47:27 2024 -0400

    Modified ServiceLockPaths.get method to return paths with or w/out lock 
(#4891)
    
    Closes #4883
---
 .../accumulo/core/clientImpl/ClientContext.java    |   4 +-
 .../core/clientImpl/InstanceOperationsImpl.java    |   2 +-
 .../core/clientImpl/ZookeeperLockChecker.java      |  13 +-
 .../accumulo/core/lock/ServiceLockPaths.java       |  67 +++--
 .../core/metadata/schema/TabletMetadata.java       |   2 +-
 .../accumulo/core/rpc/clients/TServerClient.java   |   8 +-
 .../util/compaction/ExternalCompactionUtil.java    |   6 +-
 .../core/clientImpl/ZookeeperLockCheckerTest.java  |  15 +-
 .../accumulo/core/lock/ServiceLockPathsTest.java   | 284 ++++++++++++++++-----
 .../miniclusterImpl/MiniAccumuloClusterImpl.java   |  10 +-
 .../accumulo/server/manager/LiveTServerSet.java    |  16 +-
 .../server/manager/state/DeadServerList.java       |   2 +-
 .../accumulo/server/util/AccumuloStatus.java       |   8 +-
 .../org/apache/accumulo/server/util/Admin.java     |   2 +-
 .../accumulo/server/util/ServiceStatusCmd.java     |   6 +-
 .../accumulo/server/util/TabletServerLocks.java    |   4 +-
 .../org/apache/accumulo/server/util/ZooZap.java    |   6 +-
 .../java/org/apache/accumulo/manager/Manager.java  |   4 +-
 .../test/ScanServerConcurrentTabletScanIT.java     |   2 +-
 .../test/ScanServerGroupConfigurationIT.java       |   6 +-
 .../org/apache/accumulo/test/ScanServerIT.java     |   2 +-
 .../accumulo/test/ScanServerMetadataEntriesIT.java |   2 +-
 .../accumulo/test/ScanServerMultipleScansIT.java   |   2 +-
 .../apache/accumulo/test/ScanServerShutdownIT.java |   4 +-
 .../ThriftServerBindsBeforeZooKeeperLockIT.java    |   4 +-
 .../test/functional/MemoryStarvedScanIT.java       |   2 +-
 .../functional/TabletManagementIteratorIT.java     |   2 +-
 .../functional/TabletResourceGroupBalanceIT.java   |   2 +-
 .../accumulo/test/lock/ServiceLockPathsIT.java     |  67 ++---
 29 files changed, 368 insertions(+), 186 deletions(-)

diff --git 
a/core/src/main/java/org/apache/accumulo/core/clientImpl/ClientContext.java 
b/core/src/main/java/org/apache/accumulo/core/clientImpl/ClientContext.java
index cbe3b6fc41..83fdd4a0c9 100644
--- a/core/src/main/java/org/apache/accumulo/core/clientImpl/ClientContext.java
+++ b/core/src/main/java/org/apache/accumulo/core/clientImpl/ClientContext.java
@@ -406,7 +406,7 @@ public class ClientContext implements AccumuloClient {
   public Map<String,Pair<UUID,String>> getScanServers() {
     Map<String,Pair<UUID,String>> liveScanServers = new HashMap<>();
     Set<ServiceLockPath> scanServerPaths =
-        getServerPaths().getScanServer(Optional.empty(), Optional.empty());
+        getServerPaths().getScanServer(Optional.empty(), Optional.empty(), 
true);
     for (ServiceLockPath path : scanServerPaths) {
       try {
         ZcStat stat = new ZcStat();
@@ -483,7 +483,7 @@ public class ClientContext implements AccumuloClient {
    */
   public List<String> getManagerLocations() {
     ensureOpen();
-    var zLockManagerPath = getServerPaths().getManager();
+    var zLockManagerPath = getServerPaths().getManager(true);
 
     Timer timer = null;
 
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 23483d4a54..a6e7d25fbc 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
@@ -236,7 +236,7 @@ public class InstanceOperationsImpl implements 
InstanceOperations {
   @Override
   public List<String> getTabletServers() {
     Set<ServiceLockPath> paths =
-        context.getServerPaths().getTabletServer(Optional.empty(), 
Optional.empty());
+        context.getServerPaths().getTabletServer(Optional.empty(), 
Optional.empty(), true);
     List<String> results = new ArrayList<>();
     paths.forEach(p -> {
       if (!p.getServer().equals("manager")) {
diff --git 
a/core/src/main/java/org/apache/accumulo/core/clientImpl/ZookeeperLockChecker.java
 
b/core/src/main/java/org/apache/accumulo/core/clientImpl/ZookeeperLockChecker.java
index ab9ee142ea..e91b64ea4b 100644
--- 
a/core/src/main/java/org/apache/accumulo/core/clientImpl/ZookeeperLockChecker.java
+++ 
b/core/src/main/java/org/apache/accumulo/core/clientImpl/ZookeeperLockChecker.java
@@ -21,7 +21,6 @@ package org.apache.accumulo.core.clientImpl;
 import java.util.Optional;
 import java.util.Set;
 
-import org.apache.accumulo.core.Constants;
 import 
org.apache.accumulo.core.clientImpl.ClientTabletCacheImpl.TabletServerLockChecker;
 import org.apache.accumulo.core.lock.ServiceLock;
 import org.apache.accumulo.core.lock.ServiceLockPaths.ServiceLockPath;
@@ -31,17 +30,15 @@ import com.google.common.net.HostAndPort;
 public class ZookeeperLockChecker implements TabletServerLockChecker {
 
   private final ClientContext ctx;
-  private final String root;
 
   ZookeeperLockChecker(ClientContext context) {
     this.ctx = context;
-    this.root = context.getZooKeeperRoot() + Constants.ZTSERVERS;
   }
 
   public boolean doesTabletServerLockExist(String server) {
     // ServiceLockPaths only returns items that have a lock
     Set<ServiceLockPath> tservers = 
ctx.getServerPaths().getTabletServer(Optional.empty(),
-        Optional.of(HostAndPort.fromString(server)));
+        Optional.of(HostAndPort.fromString(server)), true);
     return !tservers.isEmpty();
   }
 
@@ -49,7 +46,7 @@ public class ZookeeperLockChecker implements 
TabletServerLockChecker {
   public boolean isLockHeld(String server, String session) {
     // ServiceLockPaths only returns items that have a lock
     Set<ServiceLockPath> tservers = 
ctx.getServerPaths().getTabletServer(Optional.empty(),
-        Optional.of(HostAndPort.fromString(server)));
+        Optional.of(HostAndPort.fromString(server)), true);
     for (ServiceLockPath slp : tservers) {
       if (ServiceLock.getSessionId(ctx.getZooCache(), slp) == 
Long.parseLong(session, 16)) {
         return true;
@@ -60,7 +57,11 @@ public class ZookeeperLockChecker implements 
TabletServerLockChecker {
 
   @Override
   public void invalidateCache(String tserver) {
-    ctx.getZooCache().clear(root + "/" + tserver);
+    ctx.getServerPaths()
+        .getTabletServer(Optional.empty(), 
Optional.of(HostAndPort.fromString(tserver)), false)
+        .forEach(slp -> {
+          ctx.getZooCache().clear(slp.toString());
+        });
   }
 
 }
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 5acdb9ef4e..62da673356 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
@@ -283,12 +283,13 @@ public class ServiceLockPaths {
   }
 
   public Set<ServiceLockPath> getCompactor(Optional<String> resourceGroup,
-      Optional<HostAndPort> address) {
-    return get(Constants.ZCOMPACTORS, resourceGroup, address);
+      Optional<HostAndPort> address, boolean withLock) {
+    return get(Constants.ZCOMPACTORS, resourceGroup, address, withLock);
   }
 
-  public ServiceLockPath getGarbageCollector() {
-    Set<ServiceLockPath> results = get(Constants.ZGC_LOCK, Optional.empty(), 
Optional.empty());
+  public ServiceLockPath getGarbageCollector(boolean withLock) {
+    Set<ServiceLockPath> results =
+        get(Constants.ZGC_LOCK, Optional.empty(), Optional.empty(), withLock);
     if (results.isEmpty()) {
       return null;
     } else {
@@ -296,8 +297,9 @@ public class ServiceLockPaths {
     }
   }
 
-  public ServiceLockPath getManager() {
-    Set<ServiceLockPath> results = get(Constants.ZMANAGER_LOCK, 
Optional.empty(), Optional.empty());
+  public ServiceLockPath getManager(boolean withLock) {
+    Set<ServiceLockPath> results =
+        get(Constants.ZMANAGER_LOCK, Optional.empty(), Optional.empty(), 
withLock);
     if (results.isEmpty()) {
       return null;
     } else {
@@ -305,8 +307,9 @@ public class ServiceLockPaths {
     }
   }
 
-  public ServiceLockPath getMonitor() {
-    Set<ServiceLockPath> results = get(Constants.ZMONITOR_LOCK, 
Optional.empty(), Optional.empty());
+  public ServiceLockPath getMonitor(boolean withLock) {
+    Set<ServiceLockPath> results =
+        get(Constants.ZMONITOR_LOCK, Optional.empty(), Optional.empty(), 
withLock);
     if (results.isEmpty()) {
       return null;
     } else {
@@ -315,26 +318,34 @@ public class ServiceLockPaths {
   }
 
   public Set<ServiceLockPath> getScanServer(Optional<String> resourceGroup,
-      Optional<HostAndPort> address) {
-    return get(Constants.ZSSERVERS, resourceGroup, address);
+      Optional<HostAndPort> address, boolean withLock) {
+    return get(Constants.ZSSERVERS, resourceGroup, address, withLock);
   }
 
   public Set<ServiceLockPath> getTabletServer(Optional<String> resourceGroup,
-      Optional<HostAndPort> address) {
-    return get(Constants.ZTSERVERS, resourceGroup, address);
+      Optional<HostAndPort> address, boolean withLock) {
+    return get(Constants.ZTSERVERS, resourceGroup, address, withLock);
   }
 
   public Set<ServiceLockPath> getDeadTabletServer(Optional<String> 
resourceGroup,
-      Optional<HostAndPort> address) {
-    return get(Constants.ZDEADTSERVERS, resourceGroup, address);
+      Optional<HostAndPort> address, boolean withLock) {
+    return get(Constants.ZDEADTSERVERS, resourceGroup, address, withLock);
   }
 
   /**
    * Find paths in ZooKeeper based on the input arguments and return a set of 
ServiceLockPath
-   * objects at those paths that have valid locks.
+   * objects.
+   *
+   * @param serverType type of lock, should be something like 
Constants.ZTSERVERS or
+   *        Constants.ZMANAGER_LOCK
+   * @param resourceGroup name of resource group, if empty will return all 
resource groups
+   * @param address address of server (host:port), if empty will return all 
addresses
+   * @param withLock supply true if you only want to return servers that have 
an active lock. Not
+   *        applicable for types that don't use a lock (e.g. dead tservers)
+   * @return set of ServiceLockPath objects for the paths found based on the 
search criteria
    */
   private Set<ServiceLockPath> get(final String serverType, Optional<String> 
resourceGroup,
-      Optional<HostAndPort> address) {
+      Optional<HostAndPort> address, boolean withLock) {
 
     Objects.requireNonNull(serverType);
     Objects.requireNonNull(resourceGroup);
@@ -348,9 +359,13 @@ public class ServiceLockPaths {
         || serverType.equals(Constants.ZMONITOR_LOCK)) {
       final ZcStat stat = new ZcStat();
       final ServiceLockPath slp = parse(Optional.of(serverType), typePath);
-      Optional<ServiceLockData> sld = ServiceLock.getLockData(cache, slp, 
stat);
-      if (!sld.isEmpty()) {
+      if (!withLock) {
         results.add(slp);
+      } else {
+        Optional<ServiceLockData> sld = ServiceLock.getLockData(cache, slp, 
stat);
+        if (!sld.isEmpty()) {
+          results.add(slp);
+        }
       }
     } else if (serverType.equals(Constants.ZCOMPACTORS) || 
serverType.equals(Constants.ZSSERVERS)
         || serverType.equals(Constants.ZTSERVERS) || 
serverType.equals(Constants.ZDEADTSERVERS)) {
@@ -362,15 +377,15 @@ public class ServiceLockPaths {
             final ZcStat stat = new ZcStat();
             final ServiceLockPath slp =
                 parse(Optional.of(serverType), typePath + "/" + group + "/" + 
server);
-            if (slp.getType().equals(Constants.ZDEADTSERVERS)
-                && (address.isEmpty() || 
address.orElseThrow().toString().equals(server))) {
-              // Dead TServers don't have lock data
-              results.add(slp);
-            } else {
-              Optional<ServiceLockData> sld = ServiceLock.getLockData(cache, 
slp, stat);
-              if (!sld.isEmpty()
-                  && (address.isEmpty() || 
address.orElseThrow().toString().equals(server))) {
+            if (address.isEmpty() || 
address.orElseThrow().toString().equals(server)) {
+              if (!withLock || slp.getType().equals(Constants.ZDEADTSERVERS)) {
+                // Dead TServers don't have lock data
                 results.add(slp);
+              } else {
+                Optional<ServiceLockData> sld = ServiceLock.getLockData(cache, 
slp, stat);
+                if (!sld.isEmpty()) {
+                  results.add(slp);
+                }
               }
             }
           }
diff --git 
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
index 2fdef63f9c..f3e61aadd1 100644
--- 
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
@@ -634,7 +634,7 @@ public class TabletMetadata {
     final Set<TServerInstance> liveServers = new HashSet<>();
 
     for (ServiceLockPath slp : 
context.getServerPaths().getTabletServer(Optional.empty(),
-        Optional.empty())) {
+        Optional.empty(), true)) {
 
       checkTabletServer(context, slp).ifPresent(liveServers::add);
     }
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 7107a5a71a..2c70796095 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
@@ -74,10 +74,12 @@ public interface TServerClient<C extends TServiceClient> {
     final long rpcTimeout = context.getClientTimeoutInMillis();
     final ZooCache zc = context.getZooCache();
     final List<ServiceLockPath> serverPaths = new ArrayList<>();
-    serverPaths.addAll(context.getServerPaths().getCompactor(Optional.empty(), 
Optional.empty()));
-    
serverPaths.addAll(context.getServerPaths().getScanServer(Optional.empty(), 
Optional.empty()));
     serverPaths
-        .addAll(context.getServerPaths().getTabletServer(Optional.empty(), 
Optional.empty()));
+        .addAll(context.getServerPaths().getCompactor(Optional.empty(), 
Optional.empty(), true));
+    serverPaths
+        .addAll(context.getServerPaths().getScanServer(Optional.empty(), 
Optional.empty(), true));
+    serverPaths
+        .addAll(context.getServerPaths().getTabletServer(Optional.empty(), 
Optional.empty(), true));
     if (serverPaths.isEmpty()) {
       if (warned.compareAndSet(false, true)) {
         LOG.warn(
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 8b8fd6ac39..72a70ce106 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
@@ -115,7 +115,7 @@ public class ExternalCompactionUtil {
    */
   public static Map<String,Set<HostAndPort>> getCompactorAddrs(ClientContext 
context) {
     final Map<String,Set<HostAndPort>> groupsAndAddresses = new HashMap<>();
-    context.getServerPaths().getCompactor(Optional.empty(), 
Optional.empty()).forEach(slp -> {
+    context.getServerPaths().getCompactor(Optional.empty(), Optional.empty(), 
true).forEach(slp -> {
       groupsAndAddresses.computeIfAbsent(slp.getResourceGroup(), (k) -> new 
HashSet<>())
           .add(HostAndPort.fromString(slp.getServer()));
     });
@@ -256,8 +256,8 @@ public class ExternalCompactionUtil {
 
   public static int countCompactors(String groupName, ClientContext context) {
     var start = Timer.startNew();
-    int count =
-        context.getServerPaths().getCompactor(Optional.of(groupName), 
Optional.empty()).size();
+    int count = context.getServerPaths()
+        .getCompactor(Optional.of(groupName), Optional.empty(), true).size();
     long elapsed = start.elapsed(MILLISECONDS);
     if (elapsed > 100) {
       LOG.debug("Took {} ms to count {} compactors for {}", elapsed, count, 
groupName);
diff --git 
a/core/src/test/java/org/apache/accumulo/core/clientImpl/ZookeeperLockCheckerTest.java
 
b/core/src/test/java/org/apache/accumulo/core/clientImpl/ZookeeperLockCheckerTest.java
index 7776a55aa1..ed2b6aa3e4 100644
--- 
a/core/src/test/java/org/apache/accumulo/core/clientImpl/ZookeeperLockCheckerTest.java
+++ 
b/core/src/test/java/org/apache/accumulo/core/clientImpl/ZookeeperLockCheckerTest.java
@@ -23,8 +23,11 @@ import static org.easymock.EasyMock.expect;
 import static org.easymock.EasyMock.replay;
 import static org.easymock.EasyMock.verify;
 
+import java.util.List;
+
 import org.apache.accumulo.core.Constants;
 import org.apache.accumulo.core.fate.zookeeper.ZooCache;
+import org.apache.accumulo.core.lock.ServiceLockPaths;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 
@@ -39,13 +42,23 @@ public class ZookeeperLockCheckerTest {
     expect(context.getZooKeeperRoot()).andReturn("/accumulo/iid").anyTimes();
     zc = createMock(ZooCache.class);
     expect(context.getZooCache()).andReturn(zc).anyTimes();
+    expect(context.getServerPaths()).andReturn(new 
ServiceLockPaths(context)).anyTimes();
     replay(context);
     zklc = new ZookeeperLockChecker(context);
   }
 
   @Test
   public void testInvalidateCache() {
-    zc.clear(context.getZooKeeperRoot() + Constants.ZTSERVERS + "/server");
+    
expect(zc.getChildren(context.getZooKeeperRoot())).andReturn(List.of(Constants.ZTSERVERS))
+        .anyTimes();
+    expect(zc.getChildren(context.getZooKeeperRoot() + Constants.ZTSERVERS))
+        .andReturn(List.of(Constants.DEFAULT_RESOURCE_GROUP_NAME)).anyTimes();
+    expect(zc.getChildren(context.getZooKeeperRoot() + Constants.ZTSERVERS + 
"/"
+        + 
Constants.DEFAULT_RESOURCE_GROUP_NAME)).andReturn(List.of("server")).anyTimes();
+    expect(zc.getChildren(context.getZooKeeperRoot() + Constants.ZTSERVERS + 
"/"
+        + Constants.DEFAULT_RESOURCE_GROUP_NAME + 
"/server")).andReturn(List.of()).anyTimes();
+    zc.clear(context.getZooKeeperRoot() + Constants.ZTSERVERS + "/"
+        + Constants.DEFAULT_RESOURCE_GROUP_NAME + "/server");
     replay(zc);
     zklc.invalidateCache("server");
     verify(zc);
diff --git 
a/core/src/test/java/org/apache/accumulo/core/lock/ServiceLockPathsTest.java 
b/core/src/test/java/org/apache/accumulo/core/lock/ServiceLockPathsTest.java
index 255a6c4356..51da0571d1 100644
--- a/core/src/test/java/org/apache/accumulo/core/lock/ServiceLockPathsTest.java
+++ b/core/src/test/java/org/apache/accumulo/core/lock/ServiceLockPathsTest.java
@@ -56,6 +56,7 @@ public class ServiceLockPathsTest {
   private static final String ROOT = "/accumulo/instance_id";
   private static final String TEST_RESOURCE_GROUP = "TEST_RG";
   private static final String HOSTNAME = "localhost:9876";
+  private static final String HOSTNAME_NO_LOCK = "localhost:9877";
   private static final HostAndPort hp = HostAndPort.fromString(HOSTNAME);
 
   @Test
@@ -146,13 +147,37 @@ public class ServiceLockPathsTest {
     EasyMock.expect(ctx.getServerPaths()).andReturn(new 
ServiceLockPaths(ctx)).anyTimes();
     EasyMock.replay(ctx, zc);
 
-    ServiceLockPath slp = ctx.getServerPaths().getGarbageCollector();
+    ServiceLockPath slp = ctx.getServerPaths().getGarbageCollector(true);
     assertNull(slp);
 
     EasyMock.verify(ctx, zc);
 
   }
 
+  @Test
+  public void testGetGarbageCollectorNoLock() {
+
+    ClientContext ctx = EasyMock.createMock(ClientContext.class);
+    ZooCache zc = EasyMock.createMock(ZooCache.class);
+
+    EasyMock.expect(ctx.getZooKeeperRoot()).andReturn(ROOT).anyTimes();
+    EasyMock.expect(ctx.getZooCache()).andReturn(zc).anyTimes();
+    EasyMock.expect(zc.getChildren(ROOT + 
ZGC_LOCK)).andReturn(List.of(HOSTNAME_NO_LOCK))
+        .anyTimes();
+    EasyMock.expect(ctx.getServerPaths()).andReturn(new 
ServiceLockPaths(ctx)).anyTimes();
+    EasyMock.replay(ctx, zc);
+
+    ServiceLockPath slp = ctx.getServerPaths().getGarbageCollector(false);
+    assertNotNull(slp);
+    assertNull(slp.getServer());
+    assertNull(slp.getResourceGroup());
+    assertEquals(ZGC_LOCK, slp.getType());
+    assertEquals(ROOT + ZGC_LOCK, slp.toString());
+
+    EasyMock.verify(ctx, zc);
+
+  }
+
   @Test
   public void testGetGarbageCollector() {
 
@@ -175,7 +200,7 @@ public class ServiceLockPathsTest {
     EasyMock.expect(ctx.getServerPaths()).andReturn(new 
ServiceLockPaths(ctx)).anyTimes();
     EasyMock.replay(ctx, zc);
 
-    ServiceLockPath slp = ctx.getServerPaths().getGarbageCollector();
+    ServiceLockPath slp = ctx.getServerPaths().getGarbageCollector(true);
     assertNotNull(slp);
     assertNull(slp.getServer());
     assertNull(slp.getResourceGroup());
@@ -198,13 +223,37 @@ public class ServiceLockPathsTest {
     EasyMock.expect(ctx.getServerPaths()).andReturn(new 
ServiceLockPaths(ctx)).anyTimes();
     EasyMock.replay(ctx, zc);
 
-    ServiceLockPath slp = ctx.getServerPaths().getManager();
+    ServiceLockPath slp = ctx.getServerPaths().getManager(true);
     assertNull(slp);
 
     EasyMock.verify(ctx, zc);
 
   }
 
+  @Test
+  public void testGetManagerNoLock() {
+
+    ClientContext ctx = EasyMock.createMock(ClientContext.class);
+    ZooCache zc = EasyMock.createMock(ZooCache.class);
+
+    EasyMock.expect(ctx.getZooKeeperRoot()).andReturn(ROOT).anyTimes();
+    EasyMock.expect(ctx.getZooCache()).andReturn(zc).anyTimes();
+    EasyMock.expect(zc.getChildren(ROOT + 
ZMANAGER_LOCK)).andReturn(List.of(HOSTNAME_NO_LOCK))
+        .anyTimes();
+    EasyMock.expect(ctx.getServerPaths()).andReturn(new 
ServiceLockPaths(ctx)).anyTimes();
+    EasyMock.replay(ctx, zc);
+
+    ServiceLockPath slp = ctx.getServerPaths().getManager(false);
+    assertNotNull(slp);
+    assertNull(slp.getServer());
+    assertNull(slp.getResourceGroup());
+    assertEquals(ZMANAGER_LOCK, slp.getType());
+    assertEquals(ROOT + ZMANAGER_LOCK, slp.toString());
+
+    EasyMock.verify(ctx, zc);
+
+  }
+
   @Test
   public void testGetManager() {
 
@@ -228,7 +277,7 @@ public class ServiceLockPathsTest {
     EasyMock.expect(ctx.getServerPaths()).andReturn(new 
ServiceLockPaths(ctx)).anyTimes();
     EasyMock.replay(ctx, zc);
 
-    ServiceLockPath slp = ctx.getServerPaths().getManager();
+    ServiceLockPath slp = ctx.getServerPaths().getManager(true);
     assertNotNull(slp);
     assertNull(slp.getServer());
     assertNull(slp.getResourceGroup());
@@ -251,13 +300,37 @@ public class ServiceLockPathsTest {
     EasyMock.expect(ctx.getServerPaths()).andReturn(new 
ServiceLockPaths(ctx)).anyTimes();
     EasyMock.replay(ctx, zc);
 
-    ServiceLockPath slp = ctx.getServerPaths().getMonitor();
+    ServiceLockPath slp = ctx.getServerPaths().getMonitor(true);
     assertNull(slp);
 
     EasyMock.verify(ctx, zc);
 
   }
 
+  @Test
+  public void testGetMonitorNoLock() {
+
+    ClientContext ctx = EasyMock.createMock(ClientContext.class);
+    ZooCache zc = EasyMock.createMock(ZooCache.class);
+
+    EasyMock.expect(ctx.getZooKeeperRoot()).andReturn(ROOT).anyTimes();
+    EasyMock.expect(ctx.getZooCache()).andReturn(zc).anyTimes();
+    EasyMock.expect(zc.getChildren(ROOT + 
ZMONITOR_LOCK)).andReturn(List.of(HOSTNAME_NO_LOCK))
+        .anyTimes();
+    EasyMock.expect(ctx.getServerPaths()).andReturn(new 
ServiceLockPaths(ctx)).anyTimes();
+    EasyMock.replay(ctx, zc);
+
+    ServiceLockPath slp = ctx.getServerPaths().getMonitor(false);
+    assertNotNull(slp);
+    assertNull(slp.getServer());
+    assertNull(slp.getResourceGroup());
+    assertEquals(ZMONITOR_LOCK, slp.getType());
+    assertEquals(ROOT + ZMONITOR_LOCK, slp.toString());
+
+    EasyMock.verify(ctx, zc);
+
+  }
+
   @Test
   public void testGetMonitor() {
 
@@ -281,7 +354,7 @@ public class ServiceLockPathsTest {
     EasyMock.expect(ctx.getServerPaths()).andReturn(new 
ServiceLockPaths(ctx)).anyTimes();
     EasyMock.replay(ctx, zc);
 
-    ServiceLockPath slp = ctx.getServerPaths().getMonitor();
+    ServiceLockPath slp = ctx.getServerPaths().getMonitor(true);
     assertNotNull(slp);
     assertNull(slp.getServer());
     assertNull(slp.getResourceGroup());
@@ -304,14 +377,16 @@ public class ServiceLockPathsTest {
     EasyMock.expect(ctx.getServerPaths()).andReturn(new 
ServiceLockPaths(ctx)).anyTimes();
     EasyMock.replay(ctx, zc);
 
-    assertThrows(NullPointerException.class, () -> 
ctx.getServerPaths().getCompactor(null, null));
     assertThrows(NullPointerException.class,
-        () -> 
ctx.getServerPaths().getCompactor(Optional.of(TEST_RESOURCE_GROUP), null));
-    assertTrue(ctx.getServerPaths().getCompactor(Optional.empty(), 
Optional.empty()).isEmpty());
-    
assertTrue(ctx.getServerPaths().getCompactor(Optional.of(TEST_RESOURCE_GROUP), 
Optional.empty())
-        .isEmpty());
-    
assertTrue(ctx.getServerPaths().getCompactor(Optional.of(TEST_RESOURCE_GROUP), 
Optional.of(hp))
-        .isEmpty());
+        () -> ctx.getServerPaths().getCompactor(null, null, true));
+    assertThrows(NullPointerException.class,
+        () -> 
ctx.getServerPaths().getCompactor(Optional.of(TEST_RESOURCE_GROUP), null, 
true));
+    assertTrue(
+        ctx.getServerPaths().getCompactor(Optional.empty(), Optional.empty(), 
true).isEmpty());
+    assertTrue(ctx.getServerPaths()
+        .getCompactor(Optional.of(TEST_RESOURCE_GROUP), Optional.empty(), 
true).isEmpty());
+    assertTrue(ctx.getServerPaths()
+        .getCompactor(Optional.of(TEST_RESOURCE_GROUP), Optional.of(hp), 
true).isEmpty());
 
     EasyMock.verify(ctx, zc);
 
@@ -336,9 +411,17 @@ public class ServiceLockPathsTest {
     EasyMock.expect(zc.getChildren(ROOT + ZCOMPACTORS))
         .andReturn(List.of(TEST_RESOURCE_GROUP, 
DEFAULT_RESOURCE_GROUP_NAME)).anyTimes();
     EasyMock.expect(zc.getChildren(ROOT + ZCOMPACTORS + "/" + 
TEST_RESOURCE_GROUP))
-        .andReturn(List.of(HOSTNAME)).anyTimes();
+        .andReturn(List.of(HOSTNAME, HOSTNAME_NO_LOCK)).anyTimes();
     EasyMock.expect(zc.getChildren(ROOT + ZCOMPACTORS + "/" + 
DEFAULT_RESOURCE_GROUP_NAME))
-        .andReturn(List.of(HOSTNAME)).anyTimes();
+        .andReturn(List.of(HOSTNAME, HOSTNAME_NO_LOCK)).anyTimes();
+    EasyMock
+        .expect(
+            zc.getChildren(ROOT + ZCOMPACTORS + "/" + TEST_RESOURCE_GROUP + 
"/" + HOSTNAME_NO_LOCK))
+        .andReturn(List.of()).anyTimes();
+    EasyMock
+        .expect(zc.getChildren(
+            ROOT + ZCOMPACTORS + "/" + DEFAULT_RESOURCE_GROUP_NAME + "/" + 
HOSTNAME_NO_LOCK))
+        .andReturn(List.of()).anyTimes();
     EasyMock.expect(zc.getChildren(ROOT + ZCOMPACTORS + "/" + 
TEST_RESOURCE_GROUP + "/" + HOSTNAME))
         .andReturn(List.of(svcLock1, svcLock2)).anyTimes();
     EasyMock
@@ -358,7 +441,24 @@ public class ServiceLockPathsTest {
 
     // query for all
     Set<ServiceLockPath> results =
-        ctx.getServerPaths().getCompactor(Optional.empty(), Optional.empty());
+        ctx.getServerPaths().getCompactor(Optional.empty(), Optional.empty(), 
false);
+    assertEquals(4, results.size());
+    for (ServiceLockPath path : results) {
+      assertEquals(ZCOMPACTORS, path.getType());
+      assertTrue(path.getServer().equals(HOSTNAME) || 
path.getServer().equals(HOSTNAME_NO_LOCK));
+      assertTrue(path.getResourceGroup().equals(DEFAULT_RESOURCE_GROUP_NAME)
+          || path.getResourceGroup().equals(TEST_RESOURCE_GROUP));
+      assertTrue(path.toString()
+          .equals(ROOT + ZCOMPACTORS + "/" + DEFAULT_RESOURCE_GROUP_NAME + "/" 
+ HOSTNAME)
+          || path.toString().equals(
+              ROOT + ZCOMPACTORS + "/" + DEFAULT_RESOURCE_GROUP_NAME + "/" + 
HOSTNAME_NO_LOCK)
+          || path.toString().equals(ROOT + ZCOMPACTORS + "/" + 
TEST_RESOURCE_GROUP + "/" + HOSTNAME)
+          || path.toString()
+              .equals(ROOT + ZCOMPACTORS + "/" + TEST_RESOURCE_GROUP + "/" + 
HOSTNAME_NO_LOCK));
+    }
+
+    // query for all with locks
+    results = ctx.getServerPaths().getCompactor(Optional.empty(), 
Optional.empty(), true);
     assertEquals(2, results.size());
     Iterator<ServiceLockPath> iter = results.iterator();
     ServiceLockPath slp1 = iter.next();
@@ -387,12 +487,13 @@ public class ServiceLockPathsTest {
     }
 
     // query for all in non-existent resource group
-    results =
-        ctx.getServerPaths().getCompactor(Optional.of("FAKE_RESOURCE_GROUP"), 
Optional.empty());
+    results = 
ctx.getServerPaths().getCompactor(Optional.of("FAKE_RESOURCE_GROUP"),
+        Optional.empty(), true);
     assertEquals(0, results.size());
 
     // query for all in test resource group
-    results = 
ctx.getServerPaths().getCompactor(Optional.of(TEST_RESOURCE_GROUP), 
Optional.empty());
+    results =
+        ctx.getServerPaths().getCompactor(Optional.of(TEST_RESOURCE_GROUP), 
Optional.empty(), true);
     assertEquals(1, results.size());
     iter = results.iterator();
     slp1 = iter.next();
@@ -402,7 +503,8 @@ public class ServiceLockPathsTest {
     assertEquals(ROOT + ZCOMPACTORS + "/" + TEST_RESOURCE_GROUP + "/" + 
HOSTNAME, slp1.toString());
 
     // query for a specific server
-    results = 
ctx.getServerPaths().getCompactor(Optional.of(TEST_RESOURCE_GROUP), 
Optional.of(hp));
+    results =
+        ctx.getServerPaths().getCompactor(Optional.of(TEST_RESOURCE_GROUP), 
Optional.of(hp), true);
     assertEquals(1, results.size());
     iter = results.iterator();
     slp1 = iter.next();
@@ -413,7 +515,7 @@ public class ServiceLockPathsTest {
 
     // query for a wrong server
     results = 
ctx.getServerPaths().getCompactor(Optional.of(TEST_RESOURCE_GROUP),
-        Optional.of(HostAndPort.fromString("localhost:1234")));
+        Optional.of(HostAndPort.fromString("localhost:1234")), true);
     assertEquals(0, results.size());
 
     EasyMock.verify(ctx, zc);
@@ -432,14 +534,16 @@ public class ServiceLockPathsTest {
     EasyMock.expect(ctx.getServerPaths()).andReturn(new 
ServiceLockPaths(ctx)).anyTimes();
     EasyMock.replay(ctx, zc);
 
-    assertThrows(NullPointerException.class, () -> 
ctx.getServerPaths().getScanServer(null, null));
     assertThrows(NullPointerException.class,
-        () -> 
ctx.getServerPaths().getScanServer(Optional.of(TEST_RESOURCE_GROUP), null));
-    assertTrue(ctx.getServerPaths().getScanServer(Optional.empty(), 
Optional.empty()).isEmpty());
+        () -> ctx.getServerPaths().getScanServer(null, null, true));
+    assertThrows(NullPointerException.class,
+        () -> 
ctx.getServerPaths().getScanServer(Optional.of(TEST_RESOURCE_GROUP), null, 
true));
+    assertTrue(
+        ctx.getServerPaths().getScanServer(Optional.empty(), Optional.empty(), 
true).isEmpty());
     assertTrue(ctx.getServerPaths()
-        .getScanServer(Optional.of(TEST_RESOURCE_GROUP), 
Optional.empty()).isEmpty());
-    
assertTrue(ctx.getServerPaths().getScanServer(Optional.of(TEST_RESOURCE_GROUP), 
Optional.of(hp))
-        .isEmpty());
+        .getScanServer(Optional.of(TEST_RESOURCE_GROUP), Optional.empty(), 
true).isEmpty());
+    assertTrue(ctx.getServerPaths()
+        .getScanServer(Optional.of(TEST_RESOURCE_GROUP), Optional.of(hp), 
true).isEmpty());
 
     EasyMock.verify(ctx, zc);
 
@@ -464,9 +568,17 @@ public class ServiceLockPathsTest {
     EasyMock.expect(zc.getChildren(ROOT + ZSSERVERS))
         .andReturn(List.of(TEST_RESOURCE_GROUP, 
DEFAULT_RESOURCE_GROUP_NAME)).anyTimes();
     EasyMock.expect(zc.getChildren(ROOT + ZSSERVERS + "/" + 
TEST_RESOURCE_GROUP))
-        .andReturn(List.of(HOSTNAME)).anyTimes();
+        .andReturn(List.of(HOSTNAME, HOSTNAME_NO_LOCK)).anyTimes();
     EasyMock.expect(zc.getChildren(ROOT + ZSSERVERS + "/" + 
DEFAULT_RESOURCE_GROUP_NAME))
-        .andReturn(List.of(HOSTNAME)).anyTimes();
+        .andReturn(List.of(HOSTNAME, HOSTNAME_NO_LOCK)).anyTimes();
+    EasyMock
+        .expect(
+            zc.getChildren(ROOT + ZSSERVERS + "/" + TEST_RESOURCE_GROUP + "/" 
+ HOSTNAME_NO_LOCK))
+        .andReturn(List.of()).anyTimes();
+    EasyMock
+        .expect(zc.getChildren(
+            ROOT + ZSSERVERS + "/" + DEFAULT_RESOURCE_GROUP_NAME + "/" + 
HOSTNAME_NO_LOCK))
+        .andReturn(List.of()).anyTimes();
     EasyMock.expect(zc.getChildren(ROOT + ZSSERVERS + "/" + 
TEST_RESOURCE_GROUP + "/" + HOSTNAME))
         .andReturn(List.of(svcLock1, svcLock2)).anyTimes();
     EasyMock
@@ -485,7 +597,24 @@ public class ServiceLockPathsTest {
 
     // query for all
     Set<ServiceLockPath> results =
-        ctx.getServerPaths().getScanServer(Optional.empty(), Optional.empty());
+        ctx.getServerPaths().getScanServer(Optional.empty(), Optional.empty(), 
false);
+    assertEquals(4, results.size());
+    for (ServiceLockPath path : results) {
+      assertEquals(ZSSERVERS, path.getType());
+      assertTrue(path.getServer().equals(HOSTNAME) || 
path.getServer().equals(HOSTNAME_NO_LOCK));
+      assertTrue(path.getResourceGroup().equals(DEFAULT_RESOURCE_GROUP_NAME)
+          || path.getResourceGroup().equals(TEST_RESOURCE_GROUP));
+      assertTrue(path.toString()
+          .equals(ROOT + ZSSERVERS + "/" + DEFAULT_RESOURCE_GROUP_NAME + "/" + 
HOSTNAME)
+          || path.toString()
+              .equals(ROOT + ZSSERVERS + "/" + DEFAULT_RESOURCE_GROUP_NAME + 
"/" + HOSTNAME_NO_LOCK)
+          || path.toString().equals(ROOT + ZSSERVERS + "/" + 
TEST_RESOURCE_GROUP + "/" + HOSTNAME)
+          || path.toString()
+              .equals(ROOT + ZSSERVERS + "/" + TEST_RESOURCE_GROUP + "/" + 
HOSTNAME_NO_LOCK));
+    }
+
+    // query for all with lock
+    results = ctx.getServerPaths().getScanServer(Optional.empty(), 
Optional.empty(), true);
     assertEquals(2, results.size());
     Iterator<ServiceLockPath> iter = results.iterator();
     ServiceLockPath slp1 = iter.next();
@@ -512,13 +641,13 @@ public class ServiceLockPathsTest {
     }
 
     // query for all in non-existent resource group
-    results =
-        ctx.getServerPaths().getScanServer(Optional.of("FAKE_RESOURCE_GROUP"), 
Optional.empty());
+    results = 
ctx.getServerPaths().getScanServer(Optional.of("FAKE_RESOURCE_GROUP"),
+        Optional.empty(), true);
     assertEquals(0, results.size());
 
     // query for all in test resource group
-    results =
-        ctx.getServerPaths().getScanServer(Optional.of(TEST_RESOURCE_GROUP), 
Optional.empty());
+    results = 
ctx.getServerPaths().getScanServer(Optional.of(TEST_RESOURCE_GROUP), 
Optional.empty(),
+        true);
     assertEquals(1, results.size());
     iter = results.iterator();
     slp1 = iter.next();
@@ -528,7 +657,8 @@ public class ServiceLockPathsTest {
     assertEquals(ROOT + ZSSERVERS + "/" + TEST_RESOURCE_GROUP + "/" + 
HOSTNAME, slp1.toString());
 
     // query for a specific server
-    results = 
ctx.getServerPaths().getScanServer(Optional.of(TEST_RESOURCE_GROUP), 
Optional.of(hp));
+    results =
+        ctx.getServerPaths().getScanServer(Optional.of(TEST_RESOURCE_GROUP), 
Optional.of(hp), true);
     assertEquals(1, results.size());
     iter = results.iterator();
     slp1 = iter.next();
@@ -539,7 +669,7 @@ public class ServiceLockPathsTest {
 
     // query for a wrong server
     results = 
ctx.getServerPaths().getScanServer(Optional.of(TEST_RESOURCE_GROUP),
-        Optional.of(HostAndPort.fromString("localhost:1234")));
+        Optional.of(HostAndPort.fromString("localhost:1234")), true);
     assertEquals(0, results.size());
 
     EasyMock.verify(ctx, zc);
@@ -559,14 +689,15 @@ public class ServiceLockPathsTest {
     EasyMock.replay(ctx, zc);
 
     assertThrows(NullPointerException.class,
-        () -> ctx.getServerPaths().getTabletServer(null, null));
+        () -> ctx.getServerPaths().getTabletServer(null, null, true));
     assertThrows(NullPointerException.class,
-        () -> 
ctx.getServerPaths().getTabletServer(Optional.of(TEST_RESOURCE_GROUP), null));
-    assertTrue(ctx.getServerPaths().getTabletServer(Optional.empty(), 
Optional.empty()).isEmpty());
+        () -> 
ctx.getServerPaths().getTabletServer(Optional.of(TEST_RESOURCE_GROUP), null, 
true));
+    assertTrue(
+        ctx.getServerPaths().getTabletServer(Optional.empty(), 
Optional.empty(), true).isEmpty());
     assertTrue(ctx.getServerPaths()
-        .getTabletServer(Optional.of(TEST_RESOURCE_GROUP), 
Optional.empty()).isEmpty());
+        .getTabletServer(Optional.of(TEST_RESOURCE_GROUP), Optional.empty(), 
true).isEmpty());
     assertTrue(ctx.getServerPaths()
-        .getTabletServer(Optional.of(TEST_RESOURCE_GROUP), 
Optional.of(hp)).isEmpty());
+        .getTabletServer(Optional.of(TEST_RESOURCE_GROUP), Optional.of(hp), 
true).isEmpty());
 
     EasyMock.verify(ctx, zc);
 
@@ -591,9 +722,17 @@ public class ServiceLockPathsTest {
     EasyMock.expect(zc.getChildren(ROOT + ZTSERVERS))
         .andReturn(List.of(TEST_RESOURCE_GROUP, 
DEFAULT_RESOURCE_GROUP_NAME)).anyTimes();
     EasyMock.expect(zc.getChildren(ROOT + ZTSERVERS + "/" + 
TEST_RESOURCE_GROUP))
-        .andReturn(List.of(HOSTNAME)).anyTimes();
+        .andReturn(List.of(HOSTNAME, HOSTNAME_NO_LOCK)).anyTimes();
     EasyMock.expect(zc.getChildren(ROOT + ZTSERVERS + "/" + 
DEFAULT_RESOURCE_GROUP_NAME))
-        .andReturn(List.of(HOSTNAME)).anyTimes();
+        .andReturn(List.of(HOSTNAME, HOSTNAME_NO_LOCK)).anyTimes();
+    EasyMock
+        .expect(
+            zc.getChildren(ROOT + ZTSERVERS + "/" + TEST_RESOURCE_GROUP + "/" 
+ HOSTNAME_NO_LOCK))
+        .andReturn(List.of()).anyTimes();
+    EasyMock
+        .expect(zc.getChildren(
+            ROOT + ZTSERVERS + "/" + DEFAULT_RESOURCE_GROUP_NAME + "/" + 
HOSTNAME_NO_LOCK))
+        .andReturn(List.of()).anyTimes();
     EasyMock.expect(zc.getChildren(ROOT + ZTSERVERS + "/" + 
TEST_RESOURCE_GROUP + "/" + HOSTNAME))
         .andReturn(List.of(svcLock1, svcLock2)).anyTimes();
     EasyMock
@@ -612,7 +751,24 @@ public class ServiceLockPathsTest {
 
     // query for all
     Set<ServiceLockPath> results =
-        ctx.getServerPaths().getTabletServer(Optional.empty(), 
Optional.empty());
+        ctx.getServerPaths().getTabletServer(Optional.empty(), 
Optional.empty(), false);
+    assertEquals(4, results.size());
+    for (ServiceLockPath path : results) {
+      assertEquals(ZTSERVERS, path.getType());
+      assertTrue(path.getServer().equals(HOSTNAME) || 
path.getServer().equals(HOSTNAME_NO_LOCK));
+      assertTrue(path.getResourceGroup().equals(DEFAULT_RESOURCE_GROUP_NAME)
+          || path.getResourceGroup().equals(TEST_RESOURCE_GROUP));
+      assertTrue(path.toString()
+          .equals(ROOT + ZTSERVERS + "/" + DEFAULT_RESOURCE_GROUP_NAME + "/" + 
HOSTNAME)
+          || path.toString()
+              .equals(ROOT + ZTSERVERS + "/" + DEFAULT_RESOURCE_GROUP_NAME + 
"/" + HOSTNAME_NO_LOCK)
+          || path.toString().equals(ROOT + ZTSERVERS + "/" + 
TEST_RESOURCE_GROUP + "/" + HOSTNAME)
+          || path.toString()
+              .equals(ROOT + ZTSERVERS + "/" + TEST_RESOURCE_GROUP + "/" + 
HOSTNAME_NO_LOCK));
+    }
+
+    // query for all with lock
+    results = ctx.getServerPaths().getTabletServer(Optional.empty(), 
Optional.empty(), true);
     assertEquals(2, results.size());
     Iterator<ServiceLockPath> iter = results.iterator();
     ServiceLockPath slp1 = iter.next();
@@ -639,13 +795,13 @@ public class ServiceLockPathsTest {
     }
 
     // query for all in non-existent resource group
-    results =
-        
ctx.getServerPaths().getTabletServer(Optional.of("FAKE_RESOURCE_GROUP"), 
Optional.empty());
+    results = 
ctx.getServerPaths().getTabletServer(Optional.of("FAKE_RESOURCE_GROUP"),
+        Optional.empty(), true);
     assertEquals(0, results.size());
 
     // query for all in test resource group
-    results =
-        ctx.getServerPaths().getTabletServer(Optional.of(TEST_RESOURCE_GROUP), 
Optional.empty());
+    results = 
ctx.getServerPaths().getTabletServer(Optional.of(TEST_RESOURCE_GROUP),
+        Optional.empty(), true);
     assertEquals(1, results.size());
     iter = results.iterator();
     slp1 = iter.next();
@@ -655,8 +811,8 @@ public class ServiceLockPathsTest {
     assertEquals(ROOT + ZTSERVERS + "/" + TEST_RESOURCE_GROUP + "/" + 
HOSTNAME, slp1.toString());
 
     // query for a specific server
-    results =
-        ctx.getServerPaths().getTabletServer(Optional.of(TEST_RESOURCE_GROUP), 
Optional.of(hp));
+    results = 
ctx.getServerPaths().getTabletServer(Optional.of(TEST_RESOURCE_GROUP),
+        Optional.of(hp), true);
     assertEquals(1, results.size());
     iter = results.iterator();
     slp1 = iter.next();
@@ -667,7 +823,7 @@ public class ServiceLockPathsTest {
 
     // query for a wrong server
     results = 
ctx.getServerPaths().getTabletServer(Optional.of(TEST_RESOURCE_GROUP),
-        Optional.of(HostAndPort.fromString("localhost:1234")));
+        Optional.of(HostAndPort.fromString("localhost:1234")), true);
     assertEquals(0, results.size());
 
     EasyMock.verify(ctx, zc);
@@ -687,15 +843,15 @@ public class ServiceLockPathsTest {
     EasyMock.replay(ctx, zc);
 
     assertThrows(NullPointerException.class,
-        () -> ctx.getServerPaths().getDeadTabletServer(null, null));
-    assertThrows(NullPointerException.class,
-        () -> 
ctx.getServerPaths().getDeadTabletServer(Optional.of(TEST_RESOURCE_GROUP), 
null));
-    assertTrue(
-        ctx.getServerPaths().getDeadTabletServer(Optional.empty(), 
Optional.empty()).isEmpty());
+        () -> ctx.getServerPaths().getDeadTabletServer(null, null, false));
+    assertThrows(NullPointerException.class, () -> ctx.getServerPaths()
+        .getDeadTabletServer(Optional.of(TEST_RESOURCE_GROUP), null, false));
+    assertTrue(ctx.getServerPaths().getDeadTabletServer(Optional.empty(), 
Optional.empty(), false)
+        .isEmpty());
     assertTrue(ctx.getServerPaths()
-        .getDeadTabletServer(Optional.of(TEST_RESOURCE_GROUP), 
Optional.empty()).isEmpty());
+        .getDeadTabletServer(Optional.of(TEST_RESOURCE_GROUP), 
Optional.empty(), false).isEmpty());
     assertTrue(ctx.getServerPaths()
-        .getDeadTabletServer(Optional.of(TEST_RESOURCE_GROUP), 
Optional.of(hp)).isEmpty());
+        .getDeadTabletServer(Optional.of(TEST_RESOURCE_GROUP), 
Optional.of(hp), false).isEmpty());
 
     EasyMock.verify(ctx, zc);
 
@@ -743,7 +899,7 @@ public class ServiceLockPathsTest {
 
     // query for all
     Set<ServiceLockPath> results =
-        ctx.getServerPaths().getDeadTabletServer(Optional.empty(), 
Optional.empty());
+        ctx.getServerPaths().getDeadTabletServer(Optional.empty(), 
Optional.empty(), false);
     assertEquals(2, results.size());
     Iterator<ServiceLockPath> iter = results.iterator();
     ServiceLockPath slp1 = iter.next();
@@ -773,12 +929,12 @@ public class ServiceLockPathsTest {
 
     // query for all in non-existent resource group
     results = 
ctx.getServerPaths().getDeadTabletServer(Optional.of("FAKE_RESOURCE_GROUP"),
-        Optional.empty());
+        Optional.empty(), false);
     assertEquals(0, results.size());
 
     // query for all in test resource group
     results = 
ctx.getServerPaths().getDeadTabletServer(Optional.of(TEST_RESOURCE_GROUP),
-        Optional.empty());
+        Optional.empty(), false);
     assertEquals(1, results.size());
     iter = results.iterator();
     slp1 = iter.next();
@@ -789,8 +945,8 @@ public class ServiceLockPathsTest {
         slp1.toString());
 
     // query for a specific server
-    results =
-        
ctx.getServerPaths().getDeadTabletServer(Optional.of(TEST_RESOURCE_GROUP), 
Optional.of(hp));
+    results = 
ctx.getServerPaths().getDeadTabletServer(Optional.of(TEST_RESOURCE_GROUP),
+        Optional.of(hp), false);
     assertEquals(1, results.size());
     iter = results.iterator();
     slp1 = iter.next();
@@ -802,7 +958,7 @@ public class ServiceLockPathsTest {
 
     // query for a wrong server
     results = 
ctx.getServerPaths().getDeadTabletServer(Optional.of(TEST_RESOURCE_GROUP),
-        Optional.of(HostAndPort.fromString("localhost:1234")));
+        Optional.of(HostAndPort.fromString("localhost:1234")), false);
     assertEquals(0, results.size());
 
     EasyMock.verify(ctx, zc);
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 f79b859cc9..9970fd387e 100644
--- 
a/minicluster/src/main/java/org/apache/accumulo/miniclusterImpl/MiniAccumuloClusterImpl.java
+++ 
b/minicluster/src/main/java/org/apache/accumulo/miniclusterImpl/MiniAccumuloClusterImpl.java
@@ -863,7 +863,7 @@ public class MiniAccumuloClusterImpl implements 
AccumuloCluster {
     int tsActualCount = 0;
     while (tsActualCount < tsExpectedCount) {
       Set<ServiceLockPath> tservers =
-          context.getServerPaths().getTabletServer(Optional.empty(), 
Optional.empty());
+          context.getServerPaths().getTabletServer(Optional.empty(), 
Optional.empty(), true);
       tsActualCount = tservers.size();
       log.info(tsActualCount + " of " + tsExpectedCount + " tablet servers 
present in ZooKeeper");
       Thread.sleep(500);
@@ -872,7 +872,7 @@ public class MiniAccumuloClusterImpl implements 
AccumuloCluster {
     int ssActualCount = 0;
     while (ssActualCount < ssExpectedCount) {
       Set<ServiceLockPath> tservers =
-          context.getServerPaths().getScanServer(Optional.empty(), 
Optional.empty());
+          context.getServerPaths().getScanServer(Optional.empty(), 
Optional.empty(), true);
       ssActualCount = tservers.size();
       log.info(ssActualCount + " of " + ssExpectedCount + " scan servers 
present in ZooKeeper");
       Thread.sleep(500);
@@ -881,18 +881,18 @@ public class MiniAccumuloClusterImpl implements 
AccumuloCluster {
     int ecActualCount = 0;
     while (ecActualCount < ecExpectedCount) {
       Set<ServiceLockPath> compactors =
-          context.getServerPaths().getCompactor(Optional.empty(), 
Optional.empty());
+          context.getServerPaths().getCompactor(Optional.empty(), 
Optional.empty(), true);
       ecActualCount = compactors.size();
       log.info(ecActualCount + " of " + ecExpectedCount + " compactors present 
in ZooKeeper");
       Thread.sleep(500);
     }
 
-    while (context.getServerPaths().getManager() == null) {
+    while (context.getServerPaths().getManager(true) == null) {
       log.info("Manager not yet present in ZooKeeper");
       Thread.sleep(500);
     }
 
-    while (context.getServerPaths().getGarbageCollector() == null) {
+    while (context.getServerPaths().getGarbageCollector(true) == null) {
       log.info("GC not yet present in ZooKeeper");
       Thread.sleep(500);
     }
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 9eb7b090f9..305b277bc2 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
@@ -229,17 +229,8 @@ public class LiveTServerSet implements Watcher {
     try {
       final Set<TServerInstance> updates = new HashSet<>();
       final Set<TServerInstance> doomed = new HashSet<>();
-      final ZooCache zc = getZooCache();
-      final String tserverRoot = context.getZooKeeperRoot() + 
Constants.ZTSERVERS;
-
-      Set<ServiceLockPath> tservers = new HashSet<>();
-
-      for (String resourceGroup : zc.getChildren(tserverRoot)) {
-        for (String host : zc.getChildren(tserverRoot + "/" + resourceGroup)) {
-          tservers.add(ServiceLockPaths.parse(Optional.of(Constants.ZTSERVERS),
-              tserverRoot + "/" + resourceGroup + "/" + host));
-        }
-      }
+      final Set<ServiceLockPath> tservers =
+          context.getServerPaths().getTabletServer(Optional.empty(), 
Optional.empty(), false);
 
       locklessServers.keySet().retainAll(tservers);
 
@@ -468,7 +459,8 @@ public class LiveTServerSet implements Watcher {
     }
     current.remove(address.orElseThrow().toString());
 
-    Set<ServiceLockPath> paths = 
context.getServerPaths().getTabletServer(resourceGroup, address);
+    Set<ServiceLockPath> paths =
+        context.getServerPaths().getTabletServer(resourceGroup, address, 
false);
     if (paths.isEmpty() || paths.size() > 1) {
       log.error("Zero or many zookeeper entries match input arguments.");
     } else {
diff --git 
a/server/base/src/main/java/org/apache/accumulo/server/manager/state/DeadServerList.java
 
b/server/base/src/main/java/org/apache/accumulo/server/manager/state/DeadServerList.java
index 0ef1f7777d..bc26293954 100644
--- 
a/server/base/src/main/java/org/apache/accumulo/server/manager/state/DeadServerList.java
+++ 
b/server/base/src/main/java/org/apache/accumulo/server/manager/state/DeadServerList.java
@@ -69,7 +69,7 @@ public class DeadServerList {
     List<DeadServer> result = new ArrayList<>();
     try {
       Set<ServiceLockPath> deadServers =
-          ctx.getServerPaths().getDeadTabletServer(Optional.empty(), 
Optional.empty());
+          ctx.getServerPaths().getDeadTabletServer(Optional.empty(), 
Optional.empty(), false);
       for (ServiceLockPath path : deadServers) {
         Stat stat = new Stat();
         byte[] data;
diff --git 
a/server/base/src/main/java/org/apache/accumulo/server/util/AccumuloStatus.java 
b/server/base/src/main/java/org/apache/accumulo/server/util/AccumuloStatus.java
index 8f20217689..24b75b89bc 100644
--- 
a/server/base/src/main/java/org/apache/accumulo/server/util/AccumuloStatus.java
+++ 
b/server/base/src/main/java/org/apache/accumulo/server/util/AccumuloStatus.java
@@ -33,17 +33,17 @@ public class AccumuloStatus {
    */
   public static boolean isAccumuloOffline(ClientContext context) {
     Set<ServiceLockPath> tservers =
-        context.getServerPaths().getTabletServer(Optional.empty(), 
Optional.empty());
+        context.getServerPaths().getTabletServer(Optional.empty(), 
Optional.empty(), true);
     if (!tservers.isEmpty()) {
       return false;
     }
-    if (context.getServerPaths().getManager() != null) {
+    if (context.getServerPaths().getManager(true) != null) {
       return false;
     }
-    if (context.getServerPaths().getMonitor() != null) {
+    if (context.getServerPaths().getMonitor(true) != null) {
       return false;
     }
-    if (context.getServerPaths().getGarbageCollector() != null) {
+    if (context.getServerPaths().getGarbageCollector(true) != null) {
       return false;
     }
     return true;
diff --git 
a/server/base/src/main/java/org/apache/accumulo/server/util/Admin.java 
b/server/base/src/main/java/org/apache/accumulo/server/util/Admin.java
index 34bf9818dd..6fa6341a8d 100644
--- a/server/base/src/main/java/org/apache/accumulo/server/util/Admin.java
+++ b/server/base/src/main/java/org/apache/accumulo/server/util/Admin.java
@@ -682,7 +682,7 @@ public class Admin implements KeywordExecutable {
   static String qualifyWithZooKeeperSessionId(ClientContext context, ZooCache 
zooCache,
       String hostAndPort) {
     Set<ServiceLockPath> paths = 
context.getServerPaths().getTabletServer(Optional.empty(),
-        Optional.of(HostAndPort.fromString(hostAndPort)));
+        Optional.of(HostAndPort.fromString(hostAndPort)), true);
     if (paths.size() != 1) {
       return hostAndPort;
     }
diff --git 
a/server/base/src/main/java/org/apache/accumulo/server/util/ServiceStatusCmd.java
 
b/server/base/src/main/java/org/apache/accumulo/server/util/ServiceStatusCmd.java
index 1b545d8b39..c14dfe42f4 100644
--- 
a/server/base/src/main/java/org/apache/accumulo/server/util/ServiceStatusCmd.java
+++ 
b/server/base/src/main/java/org/apache/accumulo/server/util/ServiceStatusCmd.java
@@ -112,7 +112,7 @@ public class ServiceStatusCmd {
     final AtomicInteger errors = new AtomicInteger(0);
     final Map<String,Set<String>> hostsByGroups = new TreeMap<>();
     final Set<ServiceLockPath> compactors =
-        context.getServerPaths().getTabletServer(Optional.empty(), 
Optional.empty());
+        context.getServerPaths().getTabletServer(Optional.empty(), 
Optional.empty(), true);
     compactors.forEach(c -> hostsByGroups
         .computeIfAbsent(c.getResourceGroup(), (k) -> new 
TreeSet<>()).add(c.getServer()));
     return new StatusSummary(ServiceStatusReport.ReportKey.T_SERVER, 
hostsByGroups.keySet(),
@@ -129,7 +129,7 @@ public class ServiceStatusCmd {
     final AtomicInteger errors = new AtomicInteger(0);
     final Map<String,Set<String>> hostsByGroups = new TreeMap<>();
     final Set<ServiceLockPath> scanServers =
-        context.getServerPaths().getScanServer(Optional.empty(), 
Optional.empty());
+        context.getServerPaths().getScanServer(Optional.empty(), 
Optional.empty(), true);
     scanServers.forEach(c -> hostsByGroups
         .computeIfAbsent(c.getResourceGroup(), (k) -> new 
TreeSet<>()).add(c.getServer()));
     return new StatusSummary(ServiceStatusReport.ReportKey.S_SERVER, 
hostsByGroups.keySet(),
@@ -156,7 +156,7 @@ public class ServiceStatusCmd {
     final AtomicInteger errors = new AtomicInteger(0);
     final Map<String,Set<String>> hostsByGroups = new TreeMap<>();
     final Set<ServiceLockPath> compactors =
-        context.getServerPaths().getCompactor(Optional.empty(), 
Optional.empty());
+        context.getServerPaths().getCompactor(Optional.empty(), 
Optional.empty(), true);
     compactors.forEach(c -> hostsByGroups
         .computeIfAbsent(c.getResourceGroup(), (k) -> new 
TreeSet<>()).add(c.getServer()));
     return new StatusSummary(ServiceStatusReport.ReportKey.COMPACTOR, 
hostsByGroups.keySet(),
diff --git 
a/server/base/src/main/java/org/apache/accumulo/server/util/TabletServerLocks.java
 
b/server/base/src/main/java/org/apache/accumulo/server/util/TabletServerLocks.java
index 71cb78d9d4..ab18fc13d0 100644
--- 
a/server/base/src/main/java/org/apache/accumulo/server/util/TabletServerLocks.java
+++ 
b/server/base/src/main/java/org/apache/accumulo/server/util/TabletServerLocks.java
@@ -42,7 +42,7 @@ public class TabletServerLocks {
 
     if (delete == null) {
       Set<ServiceLockPath> tabletServers =
-          context.getServerPaths().getTabletServer(Optional.empty(), 
Optional.empty());
+          context.getServerPaths().getTabletServer(Optional.empty(), 
Optional.empty(), false);
       if (tabletServers.isEmpty()) {
         System.err.println("No tservers found in ZK");
       }
@@ -63,7 +63,7 @@ public class TabletServerLocks {
         printUsage();
       } else {
         Set<ServiceLockPath> paths = 
context.getServerPaths().getTabletServer(Optional.empty(),
-            Optional.of(HostAndPort.fromString(lock)));
+            Optional.of(HostAndPort.fromString(lock)), true);
         Preconditions.checkArgument(paths.size() == 1,
             lock + " does not match a single ZooKeeper TabletServer lock. 
matches=" + paths);
         ServiceLockPath path = paths.iterator().next();
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 87d00c5e09..a24b873eb1 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
@@ -111,7 +111,7 @@ public class ZooZap implements KeywordExecutable {
         if (opts.zapTservers) {
           try {
             Set<ServiceLockPath> tserverLockPaths =
-                context.getServerPaths().getTabletServer(Optional.empty(), 
Optional.empty());
+                context.getServerPaths().getTabletServer(Optional.empty(), 
Optional.empty(), false);
             for (ServiceLockPath tserverPath : tserverLockPaths) {
 
               message("Deleting " + tserverPath + " from zookeeper", opts);
@@ -133,7 +133,7 @@ public class ZooZap implements KeywordExecutable {
 
         if (opts.zapCompactors) {
           Set<ServiceLockPath> compactorLockPaths =
-              context.getServerPaths().getCompactor(Optional.empty(), 
Optional.empty());
+              context.getServerPaths().getCompactor(Optional.empty(), 
Optional.empty(), false);
           Set<String> compactorResourceGroupPaths = new HashSet<>();
           compactorLockPaths.forEach(p -> compactorResourceGroupPaths
               .add(p.toString().substring(0, p.toString().lastIndexOf('/'))));
@@ -151,7 +151,7 @@ public class ZooZap implements KeywordExecutable {
         if (opts.zapScanServers) {
           try {
             Set<ServiceLockPath> sserverLockPaths =
-                context.getServerPaths().getScanServer(Optional.empty(), 
Optional.empty());
+                context.getServerPaths().getScanServer(Optional.empty(), 
Optional.empty(), false);
             for (ServiceLockPath sserverPath : sserverLockPaths) {
               message("Deleting " + sserverPath + " from zookeeper", opts);
               if (!zoo.getChildren(sserverPath.toString()).isEmpty()) {
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 d8874b0c6d..0af05eb5b7 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
@@ -644,8 +644,8 @@ public class Manager extends AbstractServer
 
       while (stillManager()) {
         try {
-          Set<ServiceLockPath> scanServerPaths =
-              getContext().getServerPaths().getScanServer(Optional.empty(), 
Optional.empty());
+          Set<ServiceLockPath> scanServerPaths = getContext().getServerPaths()
+              .getScanServer(Optional.empty(), Optional.empty(), false);
           for (ServiceLockPath path : scanServerPaths) {
 
             ZcStat stat = new ZcStat();
diff --git 
a/test/src/main/java/org/apache/accumulo/test/ScanServerConcurrentTabletScanIT.java
 
b/test/src/main/java/org/apache/accumulo/test/ScanServerConcurrentTabletScanIT.java
index 4c159db5d6..6022f53b62 100644
--- 
a/test/src/main/java/org/apache/accumulo/test/ScanServerConcurrentTabletScanIT.java
+++ 
b/test/src/main/java/org/apache/accumulo/test/ScanServerConcurrentTabletScanIT.java
@@ -93,7 +93,7 @@ public class ScanServerConcurrentTabletScanIT extends 
SharedMiniClusterBase {
         1, null);
 
     Wait.waitFor(() -> !getCluster().getServerContext().getServerPaths()
-        .getScanServer(Optional.empty(), Optional.empty()).isEmpty());
+        .getScanServer(Optional.empty(), Optional.empty(), true).isEmpty());
 
   }
 
diff --git 
a/test/src/main/java/org/apache/accumulo/test/ScanServerGroupConfigurationIT.java
 
b/test/src/main/java/org/apache/accumulo/test/ScanServerGroupConfigurationIT.java
index 27391c7719..54a641c7ac 100644
--- 
a/test/src/main/java/org/apache/accumulo/test/ScanServerGroupConfigurationIT.java
+++ 
b/test/src/main/java/org/apache/accumulo/test/ScanServerGroupConfigurationIT.java
@@ -126,7 +126,7 @@ public class ScanServerGroupConfigurationIT extends 
SharedMiniClusterBase {
 
     // Ensure no scan servers running
     Wait.waitFor(() -> getCluster().getServerContext().getServerPaths()
-        .getScanServer(Optional.empty(), Optional.empty()).isEmpty());
+        .getScanServer(Optional.empty(), Optional.empty(), true).isEmpty());
 
     try (AccumuloClient client = 
Accumulo.newClient().from(getClientProps()).build()) {
       final String tableName = getUniqueNames(1)[0];
@@ -148,7 +148,7 @@ public class ScanServerGroupConfigurationIT extends 
SharedMiniClusterBase {
         // Start a ScanServer. No group specified, should be in the default 
group.
         getCluster().getClusterControl().start(ServerType.SCAN_SERVER, 
"localhost");
         Wait.waitFor(() -> getCluster().getServerContext().getServerPaths()
-            .getScanServer(Optional.empty(), Optional.empty()).size() == 1, 
30_000);
+            .getScanServer(Optional.empty(), Optional.empty(), true).size() == 
1, 30_000);
         Wait.waitFor(() -> ((ClientContext) 
client).getScanServers().values().stream().anyMatch(
             (p) -> 
p.getSecond().equals(ScanServerSelector.DEFAULT_SCAN_SERVER_GROUP_NAME))
             == true);
@@ -166,7 +166,7 @@ public class ScanServerGroupConfigurationIT extends 
SharedMiniClusterBase {
             .addScanServerResourceGroup("GROUP1", 1);
         getCluster().getClusterControl().start(ServerType.SCAN_SERVER);
         Wait.waitFor(() -> getCluster().getServerContext().getServerPaths()
-            .getScanServer(Optional.empty(), Optional.empty()).size() == 2, 
30_000);
+            .getScanServer(Optional.empty(), Optional.empty(), true).size() == 
2, 30_000);
         Wait.waitFor(() -> ((ClientContext) 
client).getScanServers().values().stream().anyMatch(
             (p) -> 
p.getSecond().equals(ScanServerSelector.DEFAULT_SCAN_SERVER_GROUP_NAME))
             == true);
diff --git a/test/src/main/java/org/apache/accumulo/test/ScanServerIT.java 
b/test/src/main/java/org/apache/accumulo/test/ScanServerIT.java
index 77bdf491c8..3b12abaa59 100644
--- a/test/src/main/java/org/apache/accumulo/test/ScanServerIT.java
+++ b/test/src/main/java/org/apache/accumulo/test/ScanServerIT.java
@@ -116,7 +116,7 @@ public class ScanServerIT extends SharedMiniClusterBase {
         "localhost");
 
     Wait.waitFor(() -> !getCluster().getServerContext().getServerPaths()
-        .getScanServer(Optional.empty(), Optional.empty()).isEmpty());
+        .getScanServer(Optional.empty(), Optional.empty(), true).isEmpty());
   }
 
   @AfterAll
diff --git 
a/test/src/main/java/org/apache/accumulo/test/ScanServerMetadataEntriesIT.java 
b/test/src/main/java/org/apache/accumulo/test/ScanServerMetadataEntriesIT.java
index 58c985efd0..a6ea8d5648 100644
--- 
a/test/src/main/java/org/apache/accumulo/test/ScanServerMetadataEntriesIT.java
+++ 
b/test/src/main/java/org/apache/accumulo/test/ScanServerMetadataEntriesIT.java
@@ -92,7 +92,7 @@ public class ScanServerMetadataEntriesIT extends 
SharedMiniClusterBase {
         "localhost");
 
     Wait.waitFor(() -> !getCluster().getServerContext().getServerPaths()
-        .getScanServer(Optional.empty(), Optional.empty()).isEmpty());
+        .getScanServer(Optional.empty(), Optional.empty(), true).isEmpty());
 
   }
 
diff --git 
a/test/src/main/java/org/apache/accumulo/test/ScanServerMultipleScansIT.java 
b/test/src/main/java/org/apache/accumulo/test/ScanServerMultipleScansIT.java
index 7eb21b954f..4df1a4b8ad 100644
--- a/test/src/main/java/org/apache/accumulo/test/ScanServerMultipleScansIT.java
+++ b/test/src/main/java/org/apache/accumulo/test/ScanServerMultipleScansIT.java
@@ -90,7 +90,7 @@ public class ScanServerMultipleScansIT extends 
SharedMiniClusterBase {
         "localhost");
 
     Wait.waitFor(() -> !getCluster().getServerContext().getServerPaths()
-        .getScanServer(Optional.empty(), Optional.empty()).isEmpty());
+        .getScanServer(Optional.empty(), Optional.empty(), true).isEmpty());
   }
 
   @AfterAll
diff --git 
a/test/src/main/java/org/apache/accumulo/test/ScanServerShutdownIT.java 
b/test/src/main/java/org/apache/accumulo/test/ScanServerShutdownIT.java
index dbe5f3f442..7f53579b6d 100644
--- a/test/src/main/java/org/apache/accumulo/test/ScanServerShutdownIT.java
+++ b/test/src/main/java/org/apache/accumulo/test/ScanServerShutdownIT.java
@@ -86,8 +86,8 @@ public class ScanServerShutdownIT extends 
SharedMiniClusterBase {
 
     ServerContext ctx = getCluster().getServerContext();
 
-    Wait.waitFor(
-        () -> !ctx.getServerPaths().getScanServer(Optional.empty(), 
Optional.empty()).isEmpty());
+    Wait.waitFor(() -> !ctx.getServerPaths().getScanServer(Optional.empty(), 
Optional.empty(), true)
+        .isEmpty());
 
     try (AccumuloClient client = 
Accumulo.newClient().from(getClientProps()).build()) {
       final String tableName = getUniqueNames(1)[0];
diff --git 
a/test/src/main/java/org/apache/accumulo/test/ThriftServerBindsBeforeZooKeeperLockIT.java
 
b/test/src/main/java/org/apache/accumulo/test/ThriftServerBindsBeforeZooKeeperLockIT.java
index 186b07d064..1921ddc67b 100644
--- 
a/test/src/main/java/org/apache/accumulo/test/ThriftServerBindsBeforeZooKeeperLockIT.java
+++ 
b/test/src/main/java/org/apache/accumulo/test/ThriftServerBindsBeforeZooKeeperLockIT.java
@@ -137,7 +137,7 @@ public class ThriftServerBindsBeforeZooKeeperLockIT extends 
AccumuloClusterHarne
       // Wait for the Manager to grab its lock
       while (true) {
         try {
-          ServiceLockPath managerLockPath = 
getServerContext().getServerPaths().getManager();
+          ServiceLockPath managerLockPath = 
getServerContext().getServerPaths().getManager(true);
           if (managerLockPath != null) {
             break;
           }
@@ -194,7 +194,7 @@ public class ThriftServerBindsBeforeZooKeeperLockIT extends 
AccumuloClusterHarne
       // Wait for the Manager to grab its lock
       while (true) {
         try {
-          ServiceLockPath slp = 
getServerContext().getServerPaths().getGarbageCollector();
+          ServiceLockPath slp = 
getServerContext().getServerPaths().getGarbageCollector(true);
           if (slp != null) {
             break;
           }
diff --git 
a/test/src/main/java/org/apache/accumulo/test/functional/MemoryStarvedScanIT.java
 
b/test/src/main/java/org/apache/accumulo/test/functional/MemoryStarvedScanIT.java
index eaa8ed0414..ffef68465d 100644
--- 
a/test/src/main/java/org/apache/accumulo/test/functional/MemoryStarvedScanIT.java
+++ 
b/test/src/main/java/org/apache/accumulo/test/functional/MemoryStarvedScanIT.java
@@ -200,7 +200,7 @@ public class MemoryStarvedScanIT extends 
SharedMiniClusterBase {
     final ZooCache zc = context.getZooCache();
 
     Set<ServiceLockPath> servers =
-        context.getServerPaths().getTabletServer(Optional.empty(), 
Optional.empty());
+        context.getServerPaths().getTabletServer(Optional.empty(), 
Optional.empty(), true);
     for (ServiceLockPath server : servers) {
       Optional<ServiceLockData> data = zc.getLockData(server);
       if (data != null && data.isPresent()) {
diff --git 
a/test/src/main/java/org/apache/accumulo/test/functional/TabletManagementIteratorIT.java
 
b/test/src/main/java/org/apache/accumulo/test/functional/TabletManagementIteratorIT.java
index 69d2d4fa49..0364bcdcc6 100644
--- 
a/test/src/main/java/org/apache/accumulo/test/functional/TabletManagementIteratorIT.java
+++ 
b/test/src/main/java/org/apache/accumulo/test/functional/TabletManagementIteratorIT.java
@@ -577,7 +577,7 @@ public class TabletManagementIteratorIT extends 
AccumuloClusterHarness {
 
     HashSet<TServerInstance> tservers = new HashSet<>();
     for (ServiceLockPath tserver : 
context.getServerPaths().getTabletServer(Optional.empty(),
-        Optional.empty())) {
+        Optional.empty(), true)) {
       try {
         long sessionId = ServiceLock.getSessionId(context.getZooCache(), 
tserver);
         tservers.add(new TServerInstance(tserver.getServer(), sessionId));
diff --git 
a/test/src/main/java/org/apache/accumulo/test/functional/TabletResourceGroupBalanceIT.java
 
b/test/src/main/java/org/apache/accumulo/test/functional/TabletResourceGroupBalanceIT.java
index 81ecf4a128..36bceaa383 100644
--- 
a/test/src/main/java/org/apache/accumulo/test/functional/TabletResourceGroupBalanceIT.java
+++ 
b/test/src/main/java/org/apache/accumulo/test/functional/TabletResourceGroupBalanceIT.java
@@ -98,7 +98,7 @@ public class TabletResourceGroupBalanceIT extends 
SharedMiniClusterBase {
 
     Map<String,String> tservers = new HashMap<>();
     for (ServiceLockPath tserver : cluster.getServerContext().getServerPaths()
-        .getTabletServer(Optional.empty(), Optional.empty())) {
+        .getTabletServer(Optional.empty(), Optional.empty(), true)) {
       tservers.put(tserver.getServer(), tserver.getResourceGroup());
     }
     return tservers;
diff --git 
a/test/src/main/java/org/apache/accumulo/test/lock/ServiceLockPathsIT.java 
b/test/src/main/java/org/apache/accumulo/test/lock/ServiceLockPathsIT.java
index a90606adbf..a39b85466a 100644
--- a/test/src/main/java/org/apache/accumulo/test/lock/ServiceLockPathsIT.java
+++ b/test/src/main/java/org/apache/accumulo/test/lock/ServiceLockPathsIT.java
@@ -50,54 +50,57 @@ public class ServiceLockPathsIT extends 
AccumuloClusterHarness {
   @Test
   public void testPaths() throws Exception {
     ServiceLockPaths paths = getServerContext().getServerPaths();
-    assertNotNull(paths.getGarbageCollector());
-    assertNotNull(paths.getManager());
-    assertNull(paths.getMonitor()); // monitor not started
-    assertEquals(2, paths.getTabletServer(Optional.empty(), 
Optional.empty()).size());
-    assertEquals(1,
-        
paths.getTabletServer(Optional.of(Constants.DEFAULT_RESOURCE_GROUP_NAME), 
Optional.empty())
-            .size());
-    assertEquals(1, paths.getTabletServer(Optional.of("TTEST"), 
Optional.empty()).size());
-    assertEquals(0, paths.getTabletServer(Optional.of("FAKE"), 
Optional.empty()).size());
-    assertEquals(0, paths.getTabletServer(Optional.of("CTEST"), 
Optional.empty()).size());
-    assertEquals(0, paths.getTabletServer(Optional.of("STEST"), 
Optional.empty()).size());
-
-    assertEquals(4, paths.getCompactor(Optional.empty(), 
Optional.empty()).size());
+    assertNotNull(paths.getGarbageCollector(true));
+    assertNotNull(paths.getManager(true));
+    assertNull(paths.getMonitor(true)); // monitor not started
+    assertEquals(2, paths.getTabletServer(Optional.empty(), Optional.empty(), 
true).size());
     assertEquals(1, paths
-        .getCompactor(Optional.of(Constants.DEFAULT_RESOURCE_GROUP_NAME), 
Optional.empty()).size());
-    assertEquals(3, paths.getCompactor(Optional.of("CTEST"), 
Optional.empty()).size());
-    assertEquals(0, paths.getCompactor(Optional.of("FAKE"), 
Optional.empty()).size());
-    assertEquals(0, paths.getCompactor(Optional.of("TTEST"), 
Optional.empty()).size());
-    assertEquals(0, paths.getCompactor(Optional.of("STEST"), 
Optional.empty()).size());
-
-    assertEquals(3, paths.getScanServer(Optional.empty(), 
Optional.empty()).size());
-    assertEquals(1,
-        
paths.getScanServer(Optional.of(Constants.DEFAULT_RESOURCE_GROUP_NAME), 
Optional.empty())
-            .size());
-    assertEquals(2, paths.getScanServer(Optional.of("STEST"), 
Optional.empty()).size());
-    assertEquals(0, paths.getScanServer(Optional.of("FAKE"), 
Optional.empty()).size());
-    assertEquals(0, paths.getScanServer(Optional.of("CTEST"), 
Optional.empty()).size());
-    assertEquals(0, paths.getScanServer(Optional.of("TTEST"), 
Optional.empty()).size());
+        .getTabletServer(Optional.of(Constants.DEFAULT_RESOURCE_GROUP_NAME), 
Optional.empty(), true)
+        .size());
+    assertEquals(1, paths.getTabletServer(Optional.of("TTEST"), 
Optional.empty(), true).size());
+    assertEquals(0, paths.getTabletServer(Optional.of("FAKE"), 
Optional.empty(), true).size());
+    assertEquals(0, paths.getTabletServer(Optional.of("CTEST"), 
Optional.empty(), true).size());
+    assertEquals(0, paths.getTabletServer(Optional.of("STEST"), 
Optional.empty(), true).size());
+
+    assertEquals(4, paths.getCompactor(Optional.empty(), Optional.empty(), 
true).size());
+    assertEquals(1, paths
+        .getCompactor(Optional.of(Constants.DEFAULT_RESOURCE_GROUP_NAME), 
Optional.empty(), true)
+        .size());
+    assertEquals(3, paths.getCompactor(Optional.of("CTEST"), Optional.empty(), 
true).size());
+    assertEquals(0, paths.getCompactor(Optional.of("FAKE"), Optional.empty(), 
true).size());
+    assertEquals(0, paths.getCompactor(Optional.of("TTEST"), Optional.empty(), 
true).size());
+    assertEquals(0, paths.getCompactor(Optional.of("STEST"), Optional.empty(), 
true).size());
+
+    assertEquals(3, paths.getScanServer(Optional.empty(), Optional.empty(), 
true).size());
+    assertEquals(1, paths
+        .getScanServer(Optional.of(Constants.DEFAULT_RESOURCE_GROUP_NAME), 
Optional.empty(), true)
+        .size());
+    assertEquals(2, paths.getScanServer(Optional.of("STEST"), 
Optional.empty(), true).size());
+    assertEquals(0, paths.getScanServer(Optional.of("FAKE"), Optional.empty(), 
true).size());
+    assertEquals(0, paths.getScanServer(Optional.of("CTEST"), 
Optional.empty(), true).size());
+    assertEquals(0, paths.getScanServer(Optional.of("TTEST"), 
Optional.empty(), true).size());
 
     getCluster().getClusterControl().stopAllServers(ServerType.COMPACTOR);
 
-    Wait.waitFor(() -> paths.getCompactor(Optional.empty(), 
Optional.empty()).size() == 0);
+    Wait.waitFor(() -> paths.getCompactor(Optional.empty(), Optional.empty(), 
true).size() == 0);
 
     getCluster().getClusterControl().stopAllServers(ServerType.SCAN_SERVER);
 
-    Wait.waitFor(() -> paths.getScanServer(Optional.empty(), 
Optional.empty()).size() == 0);
+    Wait.waitFor(() -> paths.getScanServer(Optional.empty(), Optional.empty(), 
true).size() == 0);
 
     
getCluster().getClusterControl().stopAllServers(ServerType.GARBAGE_COLLECTOR);
 
-    Wait.waitFor(() -> paths.getGarbageCollector() == null);
+    Wait.waitFor(() -> paths.getGarbageCollector(true) == null);
 
     getCluster().getClusterControl().stopAllServers(ServerType.MANAGER);
 
-    Wait.waitFor(() -> paths.getManager() == null);
+    Wait.waitFor(() -> paths.getManager(true) == null);
 
     getCluster().getClusterControl().stopAllServers(ServerType.TABLET_SERVER);
 
-    Wait.waitFor(() -> paths.getTabletServer(Optional.empty(), 
Optional.empty()).size() == 0);
+    Wait.waitFor(() -> paths.getTabletServer(Optional.empty(), 
Optional.empty(), true).size() == 0);
+    Wait.waitFor(
+        () -> paths.getTabletServer(Optional.empty(), Optional.empty(), 
false).size() == 2);
 
   }
 

Reply via email to