[ 
https://issues.apache.org/jira/browse/DRILL-4286?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16252606#comment-16252606
 ] 

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_r150985212
  
    --- 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();
    +          }
    +        }
    +      }).start();
    +      Thread.sleep(grace_period);
    +      Collection<DrillbitEndpoint> drillbitEndpoints = 
cluster.drillbit().getContext()
    +              .getClusterCoordinator()
    +              .getAvailableEndpoints();
    +      for (DrillbitEndpoint dbEndpoint : drillbitEndpoints) {
    +        if(drillbitEndpoint.getAddress().equals(dbEndpoint.getAddress()) 
&& drillbitEndpoint.getUserPort() == dbEndpoint.getUserPort()) {
    +          
assertNotEquals(dbEndpoint.getState(),DrillbitEndpoint.State.ONLINE);
    +        }
    +      }
    +    }
    +  }
    +
    +  /*
    +   Test shutdown through RestApi
    +   */
    +  @Test
    +  public void testRestApi() throws Exception {
    --- End diff --
    
    @ilooner provided a REST test fixture in a recent PR. Should this test use 
that?


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

Reply via email to