diff --git a/presto-main/src/main/java/com/facebook/presto/execution/resourceGroups/InternalResourceGroupManager.java b/presto-main/src/main/java/com/facebook/presto/execution/resourceGroups/InternalResourceGroupManager.java index 9ee456ec38ab2..81972462e4d26 100644 --- a/presto-main/src/main/java/com/facebook/presto/execution/resourceGroups/InternalResourceGroupManager.java +++ b/presto-main/src/main/java/com/facebook/presto/execution/resourceGroups/InternalResourceGroupManager.java @@ -112,6 +112,7 @@ public final class InternalResourceGroupManager private final boolean isResourceManagerEnabled; private final QueryManagerConfig queryManagerConfig; private final InternalNodeManager nodeManager; + private boolean isConfigurationManagerLoaded; @Inject public InternalResourceGroupManager( @@ -136,6 +137,7 @@ public InternalResourceGroupManager( this.isResourceManagerEnabled = requireNonNull(serverConfig, "serverConfig is null").isResourceManagerEnabled(); this.resourceGroupRuntimeExecutor = new PeriodicTaskExecutor(resourceGroupRuntimeInfoRefreshInterval.toMillis(), refreshExecutor, this::refreshResourceGroupRuntimeInfo); configurationManagerFactories.putIfAbsent(LegacyResourceGroupConfigurationManager.NAME, new LegacyResourceGroupConfigurationManager.Factory()); + this.isConfigurationManagerLoaded = false; } @Override @@ -202,6 +204,7 @@ public void loadConfigurationManager() MAX_QUEUED_QUERIES, Integer.toString(queryManagerConfig.getMaxQueuedQueries())); setConfigurationManager(LegacyResourceGroupConfigurationManager.NAME, legacyProperties); } + isConfigurationManagerLoaded = true; } private void setConfigurationManager(String name, Map properties) @@ -284,6 +287,12 @@ public List getResourceGroupRuntimeInfos() return resourceGroupRuntimeInfos.build(); } + @Override + public boolean isConfigurationManagerLoaded() + { + return isConfigurationManagerLoaded; + } + private void buildResourceGroupRuntimeInfo(ImmutableList.Builder resourceGroupRuntimeInfos, InternalResourceGroup resourceGroup) { if (!resourceGroup.subGroups().isEmpty()) { diff --git a/presto-main/src/main/java/com/facebook/presto/execution/resourceGroups/NoOpResourceGroupManager.java b/presto-main/src/main/java/com/facebook/presto/execution/resourceGroups/NoOpResourceGroupManager.java index 2a19329337b3c..4beb45a5374c5 100644 --- a/presto-main/src/main/java/com/facebook/presto/execution/resourceGroups/NoOpResourceGroupManager.java +++ b/presto-main/src/main/java/com/facebook/presto/execution/resourceGroups/NoOpResourceGroupManager.java @@ -76,4 +76,10 @@ public List getResourceGroupRuntimeInfos() { throw new UnsupportedOperationException(); } + + @Override + public boolean isConfigurationManagerLoaded() + { + return true; + } } diff --git a/presto-main/src/main/java/com/facebook/presto/execution/resourceGroups/ResourceGroupManager.java b/presto-main/src/main/java/com/facebook/presto/execution/resourceGroups/ResourceGroupManager.java index 07d1a795dc4a8..d3d97d118756b 100644 --- a/presto-main/src/main/java/com/facebook/presto/execution/resourceGroups/ResourceGroupManager.java +++ b/presto-main/src/main/java/com/facebook/presto/execution/resourceGroups/ResourceGroupManager.java @@ -49,4 +49,6 @@ void loadConfigurationManager() throws Exception; List getResourceGroupRuntimeInfos(); + + boolean isConfigurationManagerLoaded(); } diff --git a/presto-main/src/main/java/com/facebook/presto/server/ServerInfoResource.java b/presto-main/src/main/java/com/facebook/presto/server/ServerInfoResource.java index 08a7e9f88d369..6006b49f298b4 100644 --- a/presto-main/src/main/java/com/facebook/presto/server/ServerInfoResource.java +++ b/presto-main/src/main/java/com/facebook/presto/server/ServerInfoResource.java @@ -16,6 +16,7 @@ import com.facebook.airlift.node.NodeInfo; import com.facebook.presto.client.NodeVersion; import com.facebook.presto.client.ServerInfo; +import com.facebook.presto.execution.resourceGroups.ResourceGroupManager; import com.facebook.presto.metadata.StaticCatalogStore; import com.facebook.presto.spi.NodeState; @@ -56,10 +57,11 @@ public class ServerInfoResource private final GracefulShutdownHandler shutdownHandler; private final long startTime = System.nanoTime(); private final NodeResourceStatusProvider nodeResourceStatusProvider; + private final ResourceGroupManager resourceGroupManager; private NodeState nodeState = ACTIVE; @Inject - public ServerInfoResource(NodeVersion nodeVersion, NodeInfo nodeInfo, ServerConfig serverConfig, StaticCatalogStore catalogStore, GracefulShutdownHandler shutdownHandler, NodeResourceStatusProvider nodeResourceStatusProvider) + public ServerInfoResource(NodeVersion nodeVersion, NodeInfo nodeInfo, ServerConfig serverConfig, StaticCatalogStore catalogStore, GracefulShutdownHandler shutdownHandler, NodeResourceStatusProvider nodeResourceStatusProvider, ResourceGroupManager resourceGroupManager) { this.version = requireNonNull(nodeVersion, "nodeVersion is null"); this.environment = requireNonNull(nodeInfo, "nodeInfo is null").getEnvironment(); @@ -68,6 +70,7 @@ public ServerInfoResource(NodeVersion nodeVersion, NodeInfo nodeInfo, ServerConf this.catalogStore = requireNonNull(catalogStore, "catalogStore is null"); this.shutdownHandler = requireNonNull(shutdownHandler, "shutdownHandler is null"); this.nodeResourceStatusProvider = requireNonNull(nodeResourceStatusProvider, "nodeResourceStatusProvider is null"); + this.resourceGroupManager = requireNonNull(resourceGroupManager, "resourceGroupManager is null"); } @GET @@ -118,7 +121,7 @@ public NodeState getServerState() if (shutdownHandler.isShutdownRequested()) { return SHUTTING_DOWN; } - else if (!nodeResourceStatusProvider.hasResources()) { + else if (!nodeResourceStatusProvider.hasResources() || !resourceGroupManager.isConfigurationManagerLoaded()) { return INACTIVE; } else { diff --git a/presto-main/src/main/java/com/facebook/presto/server/testing/TestingPrestoServer.java b/presto-main/src/main/java/com/facebook/presto/server/testing/TestingPrestoServer.java index 2263e283fa47e..6157d89c19e0a 100644 --- a/presto-main/src/main/java/com/facebook/presto/server/testing/TestingPrestoServer.java +++ b/presto-main/src/main/java/com/facebook/presto/server/testing/TestingPrestoServer.java @@ -243,6 +243,7 @@ public TestingPrestoServer( false, false, coordinator, + false, properties, environment, discoveryUri, @@ -259,6 +260,7 @@ public TestingPrestoServer( boolean coordinatorSidecar, boolean coordinatorSidecarEnabled, boolean coordinator, + boolean skipLoadingResourceGroupConfigurationManager, Map properties, String environment, URI discoveryUri, @@ -368,7 +370,9 @@ public TestingPrestoServer( this.resourceGroupManager = resourceGroupManager instanceof InternalResourceGroupManager ? Optional.of((InternalResourceGroupManager) resourceGroupManager) : Optional.empty(); - resourceGroupManager.loadConfigurationManager(); + if (!skipLoadingResourceGroupConfigurationManager) { + resourceGroupManager.loadConfigurationManager(); + } nodePartitioningManager = injector.getInstance(NodePartitioningManager.class); planOptimizerManager = injector.getInstance(ConnectorPlanOptimizerManager.class); clusterMemoryManager = injector.getInstance(ClusterMemoryManager.class); diff --git a/presto-tests/src/main/java/com/facebook/presto/tests/DistributedQueryRunner.java b/presto-tests/src/main/java/com/facebook/presto/tests/DistributedQueryRunner.java index 27d253176140a..8b5f88303ee0e 100644 --- a/presto-tests/src/main/java/com/facebook/presto/tests/DistributedQueryRunner.java +++ b/presto-tests/src/main/java/com/facebook/presto/tests/DistributedQueryRunner.java @@ -141,6 +141,7 @@ public DistributedQueryRunner(Session defaultSession, int nodeCount, Map extraProperties, SqlParserOptions parserOptions, String environment, @@ -444,6 +452,7 @@ private static TestingPrestoServer createTestingPrestoServer( coordinatorSidecar, coordinatorSidecarEnabled, coordinator, + skipLoadingResourceGroupConfigurationManager, properties, environment, discoveryUri, @@ -943,6 +952,7 @@ public static class Builder private boolean resourceManagerEnabled; private boolean catalogServerEnabled; private boolean coordinatorSidecarEnabled; + private boolean skipLoadingResourceGroupConfigurationManager; private List extraModules = ImmutableList.of(); private int resourceManagerCount = 1; @@ -1074,6 +1084,12 @@ public Builder setResourceManagerCount(int resourceManagerCount) return this; } + public Builder setSkipLoadingResourceGroupConfigurationManager(boolean skipLoadingResourceGroupConfigurationManager) + { + this.skipLoadingResourceGroupConfigurationManager = skipLoadingResourceGroupConfigurationManager; + return this; + } + public DistributedQueryRunner build() throws Exception { @@ -1081,6 +1097,7 @@ public DistributedQueryRunner build() resourceManagerEnabled, catalogServerEnabled, coordinatorSidecarEnabled, + skipLoadingResourceGroupConfigurationManager, defaultSession, nodeCount, coordinatorCount, diff --git a/presto-tests/src/test/java/com/facebook/presto/server/TestServerInfoResource.java b/presto-tests/src/test/java/com/facebook/presto/server/TestServerInfoResource.java index 2d174eefbccc7..75f743d5e710c 100644 --- a/presto-tests/src/test/java/com/facebook/presto/server/TestServerInfoResource.java +++ b/presto-tests/src/test/java/com/facebook/presto/server/TestServerInfoResource.java @@ -49,6 +49,7 @@ public class TestServerInfoResource { private HttpClient client; private DistributedQueryRunner queryRunner; + private DistributedQueryRunner queryRunnerWithNoClusterReadyCheck; private ThriftCodecManager thriftCodeManager; @BeforeClass @@ -72,7 +73,7 @@ public void teardown() this.client = null; } - @AfterGroups(groups = {"createQueryRunner", "getServerStateWithoutRequiredResourceManagers", "getServerStateWithoutRequiredCoordinators"}) + @AfterGroups(groups = {"createQueryRunner", "getServerStateWithoutRequiredResourceManagers", "getServerStateWithoutRequiredCoordinators", "getServerStateWithoutRequiredCoordinators", "createQueryRunnerWithNoClusterReadyCheckSkipLoadingResourceGroupConfigurationManager"}) public void serverTearDown() { for (TestingPrestoServer server : queryRunner.getServers()) { @@ -106,11 +107,11 @@ public void createQueryRunnerWithNoClusterReadyCheckSetup() throws Exception { queryRunner = createQueryRunnerWithNoClusterReadyCheck( - ImmutableMap.of(), - ImmutableMap.of(), - ImmutableMap.of(), - ImmutableMap.of("cluster.required-resource-managers-active", "2", "cluster.required-coordinators-active", "1"), - ImmutableMap.of("query.client.timeout", "10s"), 2); + ImmutableMap.of(), + ImmutableMap.of(), + ImmutableMap.of(), + ImmutableMap.of("cluster.required-resource-managers-active", "2", "cluster.required-coordinators-active", "1"), + ImmutableMap.of("query.client.timeout", "10s"), 2, false); } @Test(timeOut = 30_000, groups = {"getServerStateWithoutRequiredResourceManagers"}, dataProvider = "thriftEncodingToggle") @@ -131,7 +132,7 @@ public void getServerStateWithoutRequiredCoordinatorsSetup() ImmutableMap.of(), ImmutableMap.of(), ImmutableMap.of("cluster.required-resource-managers-active", "1", "cluster.required-coordinators-active", "3"), - ImmutableMap.of("query.client.timeout", "10s"), 2); + ImmutableMap.of("query.client.timeout", "10s"), 2, false); } @Test(timeOut = 30_000, groups = {"getServerStateWithoutRequiredCoordinators"}, dataProvider = "thriftEncodingToggle") @@ -144,6 +145,28 @@ public void testGetServerStateWithoutRequiredCoordinators(boolean useThriftEncod assertEquals(state, NodeState.INACTIVE); } + @BeforeGroups("createQueryRunnerWithNoClusterReadyCheckSkipLoadingResourceGroupConfigurationManager") + public void createQueryRunnerWithNoClusterReadyCheckSkipLoadingResourceGroupConfigurationManager() + throws Exception + { + queryRunner = createQueryRunnerWithNoClusterReadyCheck( + ImmutableMap.of(), + ImmutableMap.of(), + ImmutableMap.of(), + ImmutableMap.of("cluster.required-resource-managers-active", "1", "cluster.required-coordinators-active", "1"), + ImmutableMap.of("query.client.timeout", "10s"), 2, true); + } + + @Test(groups = {"createQueryRunnerWithNoClusterReadyCheckSkipLoadingResourceGroupConfigurationManager"}) + public void testGetServerStateWhenResourceGroupConfigurationManagerNotLoaded() + throws Exception + { + TestingPrestoServer server = queryRunner.getCoordinator(0); + URI uri = uriBuilderFrom(server.getBaseUrl().resolve("/v1/info/state")).build(); + NodeState state = getNodeState(uri, false, null); + assertEquals(state, NodeState.INACTIVE); + } + private NodeState getNodeState(URI uri, boolean useThriftEncoding, Protocol thriftProtocol) { Request.Builder requestBuilder = useThriftEncoding ? ThriftRequestUtils.prepareThriftGet(thriftProtocol) : getJsonTransportBuilder(prepareGet()); diff --git a/presto-tests/src/test/java/com/facebook/presto/tests/tpch/TpchQueryRunner.java b/presto-tests/src/test/java/com/facebook/presto/tests/tpch/TpchQueryRunner.java index bd0e530ee53e5..7ecf65d6107a1 100644 --- a/presto-tests/src/test/java/com/facebook/presto/tests/tpch/TpchQueryRunner.java +++ b/presto-tests/src/test/java/com/facebook/presto/tests/tpch/TpchQueryRunner.java @@ -60,7 +60,7 @@ public static DistributedQueryRunner createQueryRunner( int coordinatorCount) throws Exception { - return createQueryRunner(resourceManagerProperties, catalogServerProperties, coordinatorSidecarProperties, coordinatorProperties, extraProperties, coordinatorCount, false, 1); + return createQueryRunner(resourceManagerProperties, catalogServerProperties, coordinatorSidecarProperties, coordinatorProperties, extraProperties, coordinatorCount, false, 1, false); } public static DistributedQueryRunner createQueryRunnerWithNoClusterReadyCheck( @@ -69,19 +69,20 @@ public static DistributedQueryRunner createQueryRunnerWithNoClusterReadyCheck( Map coordinatorSidecarProperties, Map coordinatorProperties, Map extraProperties, - int coordinatorCount) + int coordinatorCount, + boolean skipLoadingResourceGroupConfigurationManager) throws Exception { - return createQueryRunner(resourceManagerProperties, catalogServerProperties, coordinatorSidecarProperties, coordinatorProperties, extraProperties, coordinatorCount, true, 1); + return createQueryRunner(resourceManagerProperties, catalogServerProperties, coordinatorSidecarProperties, coordinatorProperties, extraProperties, coordinatorCount, true, 1, skipLoadingResourceGroupConfigurationManager); } public static DistributedQueryRunner createQueryRunner(Map resourceManagerProperties, Map coordinatorProperties, Map extraProperties, int coordinatorCount, int resourceManagerCount) throws Exception { - return createQueryRunner(resourceManagerProperties, ImmutableMap.of(), ImmutableMap.of(), coordinatorProperties, extraProperties, coordinatorCount, false, resourceManagerCount); + return createQueryRunner(resourceManagerProperties, ImmutableMap.of(), ImmutableMap.of(), coordinatorProperties, extraProperties, coordinatorCount, false, resourceManagerCount, false); } - public static DistributedQueryRunner createQueryRunner(Map resourceManagerProperties, Map catalogServerProperties, Map coordinatorSidecarProperties, Map coordinatorProperties, Map extraProperties, int coordinatorCount, boolean skipClusterReadyCheck, int resourceManagerCount) + public static DistributedQueryRunner createQueryRunner(Map resourceManagerProperties, Map catalogServerProperties, Map coordinatorSidecarProperties, Map coordinatorProperties, Map extraProperties, int coordinatorCount, boolean skipClusterReadyCheck, int resourceManagerCount, boolean skipLoadingResourceGroupConfigurationManager) throws Exception { DistributedQueryRunner queryRunner = TpchQueryRunnerBuilder.builder() @@ -93,6 +94,7 @@ public static DistributedQueryRunner createQueryRunner(Map resou .setResourceManagerEnabled(true) .setCoordinatorCount(coordinatorCount) .setResourceManagerCount(resourceManagerCount) + .setSkipLoadingResourceGroupConfigurationManager(skipLoadingResourceGroupConfigurationManager) .build(); if (!skipClusterReadyCheck) { queryRunner.waitForClusterToGetReady();