[ https://issues.apache.org/jira/browse/DRILL-4286?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16252605#comment-16252605 ]
ASF GitHub Bot commented on DRILL-4286: --------------------------------------- Github user paul-rogers commented on a diff in the pull request: https://github.com/apache/drill/pull/921#discussion_r150984962 --- Diff: exec/java-exec/src/test/java/org/apache/drill/test/TestGracefulShutdown.java --- @@ -0,0 +1,248 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.drill.test; +import com.google.common.io.Files; +import org.apache.commons.io.FileUtils; +import org.apache.drill.exec.ExecConstants; +import org.apache.drill.exec.proto.CoordinationProtos.DrillbitEndpoint; +import org.apache.drill.exec.server.Drillbit; +import org.junit.Assert; +import org.junit.BeforeClass; +import org.junit.Test; +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import java.io.PrintWriter; +import java.net.HttpURLConnection; +import java.net.URL; +import java.util.Collection; +import java.util.Properties; +import static org.junit.Assert.assertNotEquals; +import static org.junit.Assert.fail; + +public class TestGracefulShutdown { + + static String testDirPath; + @BeforeClass + public static void setUpTestData() throws Exception { + + final File testDir = getTempDir("graceful_shutdown"); + testDirPath = testDir.getAbsolutePath(); + for( int i = 0; i < 500; i++) { + setupFile(testDir, i); + } + } + + + public static final Properties WEBSERVER_CONFIGURATION = new Properties() { + { + put(ExecConstants.HTTP_ENABLE, true); + put(ExecConstants.HTTP_PORT_HUNT, true); + } + }; + + public ClusterFixtureBuilder enableWebServer(ClusterFixtureBuilder builder) { + Properties props = new Properties(); + props.putAll(WEBSERVER_CONFIGURATION); + builder.configBuilder.configProps(props); + return builder; + } + + + /* + Start multiple drillbits and then shutdown a drillbit. Query the online + endpoints and check if the drillbit still exists. + */ + @Test + public void testOnlineEndPoints() throws Exception { + + String[] drillbits = {"db1" ,"db2","db3", "db4", "db5", "db6"}; + ClusterFixtureBuilder builder = ClusterFixture.builder().withBits(drillbits).withLocalZk(); + + + try ( ClusterFixture cluster = builder.build(); + ClientFixture client = cluster.clientFixture()) { + + Drillbit drillbit = cluster.drillbit("db2"); + DrillbitEndpoint drillbitEndpoint = drillbit.getRegistrationHandle().getEndPoint(); + int grace_period = drillbit.getContext().getConfig().getInt("drill.exec.grace_period"); + new Thread(new Runnable() { + public void run() { + try { + cluster.closeDrillbit("db2"); + } catch (Exception e) { + e.printStackTrace(); + } + } + }).start(); + //wait for graceperiod + Thread.sleep(grace_period); + Collection<DrillbitEndpoint> drillbitEndpoints = cluster.drillbit().getContext() + .getClusterCoordinator() + .getOnlineEndPoints(); + Assert.assertFalse(drillbitEndpoints.contains(drillbitEndpoint)); + } + } + /* + Test if the drillbit transitions from ONLINE state when a shutdown + request is initiated + */ + @Test + public void testStateChange() throws Exception { + + String[] drillbits = {"db1" ,"db2", "db3", "db4", "db5", "db6"}; + ClusterFixtureBuilder builder = ClusterFixture.builder().withBits(drillbits).withLocalZk(); + + try ( ClusterFixture cluster = builder.build(); + ClientFixture client = cluster.clientFixture()) { + Drillbit drillbit = cluster.drillbit("db2"); + int grace_period = drillbit.getContext().getConfig().getInt("drill.exec.grace_period"); + DrillbitEndpoint drillbitEndpoint = drillbit.getRegistrationHandle().getEndPoint(); + new Thread(new Runnable() { + public void run() { + try { + cluster.closeDrillbit("db2"); + } catch (Exception e) { + e.printStackTrace(); --- End diff -- OK for debugging. For automated uses, replace with `fail()` here and in any other tests that use this same pattern. > Have an ability to put server in quiescent mode of operation > ------------------------------------------------------------ > > Key: DRILL-4286 > URL: https://issues.apache.org/jira/browse/DRILL-4286 > Project: Apache Drill > Issue Type: New Feature > Components: Execution - Flow > Reporter: Victoria Markman > Assignee: Venkata Jyothsna Donapati > > I think drill will benefit from mode of operation that is called "quiescent" > in some databases. > From IBM Informix server documentation: > {code} > Change gracefully from online to quiescent mode > Take the database server gracefully from online mode to quiescent mode to > restrict access to the database server without interrupting current > processing. After you perform this task, the database server sets a flag that > prevents new sessions from gaining access to the database server. The current > sessions are allowed to finish processing. After you initiate the mode > change, it cannot be canceled. During the mode change from online to > quiescent, the database server is considered to be in Shutdown mode. > {code} > This is different from shutdown, when processes are terminated. -- This message was sent by Atlassian JIRA (v6.4.14#64029)