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