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); }