/** * 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.lens.regression.client; import java.io.File; import java.io.IOException; import java.lang.reflect.Method; import javax.ws.rs.client.WebTarget; import javax.xml.bind.JAXBException; import org.apache.lens.api.query.*; import org.apache.lens.regression.core.constants.QueryInventory; import org.apache.lens.regression.core.helpers.*; import org.apache.lens.regression.core.testHelper.BaseTestClass; import org.apache.lens.server.api.error.LensException; import org.apache.log4j.Logger; import org.testng.Assert; import org.testng.annotations.*; public class ITKillQueryTests extends BaseTestClass { WebTarget servLens; private String sessionHandleString; private final String hdfsJarPath = lens.getServerHdfsUrl() + "/tmp"; private final String localJarPath = new File("").getAbsolutePath() + "/lens-regression/target/testjars/"; private final String hiveUdfJar = "hiveudftest.jar"; private final String serverResourcePath = "/tmp/regression/resources"; String sleepQuery = QueryInventory.getSleepQuery("5"); private static Logger logger = Logger.getLogger(ITKillQueryTests.class); @BeforeClass(alwaysRun = true) public void initialize() throws IOException, JAXBException, LensException, IllegalAccessException, InstantiationException { servLens = ServiceManagerHelper.init(); logger.info("Creating a new Session"); sessionHandleString = sHelper.openSession(lens.getCurrentDB()); //TODO : Enable when udf registration per driver is fixed /* HadoopUtil.uploadJars(localJarPath + "/" + hiveUdfJar, hdfsJarPath); logger.info("Adding jar for making query to run for longer period of time"); sHelper.addResourcesJar(hdfsJarPath + "/" + hiveUdfJar); QueryHandle queryHandle = (QueryHandle) qHelper.executeQuery(QueryInventory.SLEEP_FUNCTION).getData();*/ } @BeforeMethod(alwaysRun = true) public void setUp(Method method) throws Exception { logger.info("Test Name: " + method.getName()); } @AfterClass(alwaysRun = true) public void closeSession() throws Exception { logger.info("Closing Session"); sHelper.closeSession(); } @Test(enabled = true) public void killQueryByHandle() throws Exception { QueryHandle qH = (QueryHandle) qHelper.executeQuery(sleepQuery).getData(); logger.info("QUERY HANDLE : " + qH); QueryStatus queryStatus = qHelper.waitForQueryToRun(qH); Assert.assertEquals(queryStatus.getStatus(), QueryStatus.Status.RUNNING, "Query is Not Running"); qHelper.killQueryByQueryHandle(qH); queryStatus = qHelper.getQueryStatus(qH); Assert.assertEquals(queryStatus.getStatus(), QueryStatus.Status.CANCELED, "Query is Not Running"); } @Test(enabled = true) public void killQueryByUser() throws Exception { String diffUser = "diff"; String diffPass = "diff"; String newSessionHandleSring = sHelper.openSession(diffUser, diffPass, lens.getCurrentDB()); logger.info("Adding jar for making query to run for longer period of time"); sHelper.addResourcesJar(hdfsJarPath + "/" + hiveUdfJar, newSessionHandleSring); QueryHandle queryHandle1 = (QueryHandle) qHelper.executeQuery(sleepQuery).getData(); logger.info("1st QUERY HANDLE : " + queryHandle1); QueryHandle queryHandle2 = (QueryHandle) qHelper.executeQuery(sleepQuery).getData(); logger.info("2nd QUERY HANDLE : " + queryHandle2); QueryHandle queryHandle3 = (QueryHandle) qHelper.executeQuery(sleepQuery, null, newSessionHandleSring).getData(); logger.info("3rd QUERY HANDLE : " + queryHandle3); QueryStatus queryStatus1 = qHelper.waitForQueryToRun(queryHandle1); QueryStatus queryStatus2 = qHelper.waitForQueryToRun(queryHandle2); QueryStatus queryStatus3 = qHelper.waitForQueryToRun(queryHandle3, newSessionHandleSring); Assert.assertEquals(queryStatus1.getStatus(), QueryStatus.Status.RUNNING, "Query is Not Running"); Assert.assertEquals(queryStatus2.getStatus(), QueryStatus.Status.RUNNING, "Query is Not Running"); Assert.assertEquals(queryStatus3.getStatus(), QueryStatus.Status.RUNNING, "Query is Not Running"); Thread.sleep(1000); qHelper.killQuery(null, null, lens.getUserName()); Thread.sleep(2000); queryStatus1 = qHelper.getQueryStatus(queryHandle1); queryStatus2 = qHelper.getQueryStatus(queryHandle2); queryStatus3 = qHelper.getQueryStatus(queryHandle3); Assert.assertEquals(queryStatus1.getStatus(), QueryStatus.Status.CANCELED, "Query is Not Running"); Assert.assertEquals(queryStatus2.getStatus(), QueryStatus.Status.CANCELED, "Query is Not Running"); Assert.assertEquals(queryStatus3.getStatus(), QueryStatus.Status.RUNNING, "Query is Not Running"); qHelper.killQuery(null, null, diffUser); queryStatus3 = qHelper.getQueryStatus(queryHandle3); Assert.assertEquals(queryStatus3.getStatus(), QueryStatus.Status.CANCELED, "Query is Not Running"); } @Test(enabled = true) public void killQueryOfAllUser() throws Exception { String diffUser = "diff"; String diffPass = "diff"; String newSessionHandleSring = sHelper.openSession(diffUser, diffPass, lens.getCurrentDB()); sHelper.addResourcesJar(hdfsJarPath + "/" + hiveUdfJar, newSessionHandleSring); QueryHandle queryHandle1 = (QueryHandle) qHelper.executeQuery(sleepQuery).getData(); QueryHandle queryHandle2 = (QueryHandle) qHelper.executeQuery(sleepQuery).getData(); QueryHandle queryHandle3 = (QueryHandle) qHelper.executeQuery(sleepQuery, null, newSessionHandleSring).getData(); QueryStatus queryStatus1 = qHelper.waitForQueryToRun(queryHandle1); QueryStatus queryStatus2 = qHelper.waitForQueryToRun(queryHandle2); QueryStatus queryStatus3 = qHelper.waitForQueryToRun(queryHandle3, newSessionHandleSring); Assert.assertEquals(queryStatus1.getStatus(), QueryStatus.Status.RUNNING, "Query is Not Running"); Assert.assertEquals(queryStatus2.getStatus(), QueryStatus.Status.RUNNING, "Query is Not Running"); Assert.assertEquals(queryStatus3.getStatus(), QueryStatus.Status.RUNNING, "Query is Not Running"); qHelper.killQuery(null, null, "all"); queryStatus1 = qHelper.getQueryStatus(queryHandle1); queryStatus2 = qHelper.getQueryStatus(queryHandle2); queryStatus3 = qHelper.getQueryStatus(queryHandle3); Assert.assertEquals(queryStatus1.getStatus(), QueryStatus.Status.CANCELED, "Query is Not Running"); Assert.assertEquals(queryStatus2.getStatus(), QueryStatus.Status.CANCELED, "Query is Not Running"); Assert.assertEquals(queryStatus3.getStatus(), QueryStatus.Status.CANCELED, "Query is Not Running"); } @Test(enabled = true) public void killAllQueryOfUser() throws Exception { QueryHandle queryHandle1 = (QueryHandle) qHelper.executeQuery(sleepQuery).getData(); QueryHandle queryHandle2 = (QueryHandle) qHelper.executeQuery(sleepQuery).getData(); QueryStatus queryStatus1 = qHelper.waitForQueryToRun(queryHandle1); QueryStatus queryStatus2 = qHelper.waitForQueryToRun(queryHandle2); Assert.assertEquals(queryStatus1.getStatus(), QueryStatus.Status.RUNNING, "Query is Not Running"); Assert.assertEquals(queryStatus2.getStatus(), QueryStatus.Status.RUNNING, "Query is Not Running"); qHelper.killQuery(); queryStatus1 = qHelper.getQueryStatus(queryHandle1); queryStatus2 = qHelper.getQueryStatus(queryHandle2); Assert.assertEquals(queryStatus1.getStatus(), QueryStatus.Status.CANCELED, "Query is Not Running"); Assert.assertEquals(queryStatus2.getStatus(), QueryStatus.Status.CANCELED, "Query is Not Running"); } @Test(enabled = true) public void killQueryByState() throws Exception { QueryHandle queryHandle1 = (QueryHandle) qHelper.executeQuery(sleepQuery).getData(); QueryHandle queryHandle2 = (QueryHandle) qHelper.executeQuery(sleepQuery).getData(); QueryStatus queryStatus1 = qHelper.waitForQueryToRun(queryHandle1); QueryStatus queryStatus2 = qHelper.waitForQueryToRun(queryHandle2); Assert.assertEquals(queryStatus1.getStatus(), QueryStatus.Status.RUNNING, "Query is Not Running"); Assert.assertEquals(queryStatus2.getStatus(), QueryStatus.Status.RUNNING, "Query is Not Running"); //kill Running queries qHelper.killQuery(null, "RUNNING"); queryStatus1 = qHelper.getQueryStatus(queryHandle1); queryStatus2 = qHelper.getQueryStatus(queryHandle2); Assert.assertEquals(queryStatus1.getStatus(), QueryStatus.Status.CANCELED, "Query is Not Running"); Assert.assertEquals(queryStatus2.getStatus(), QueryStatus.Status.CANCELED, "Query is Not Running"); //kill Canceled query qHelper.killQuery(null, "CANCELED"); queryStatus1 = qHelper.getQueryStatus(queryHandle1); queryStatus2 = qHelper.getQueryStatus(queryHandle2); Assert.assertEquals(queryStatus1.getStatus(), QueryStatus.Status.CANCELED, "Query is Not Running"); Assert.assertEquals(queryStatus2.getStatus(), QueryStatus.Status.CANCELED, "Query is Not Running"); //kill successful query QueryHandle queryHandle3 = (QueryHandle) qHelper.executeQuery(QueryInventory.QUERY).getData(); LensQuery lensQuery = qHelper.waitForCompletion(queryHandle3); Assert.assertEquals(lensQuery.getStatus().getStatus(), QueryStatus.Status.SUCCESSFUL); qHelper.killQuery(null, "SUCCESSFUL"); QueryStatus queryStatus3 = qHelper.getQueryStatus(queryHandle3); Assert.assertEquals(queryStatus3.getStatus(), QueryStatus.Status.SUCCESSFUL); } //TODO: enable when the bug is fixed. /* Currently doing kill query by queryName "query" will kill all the query with queryName as "*query*" * Raised a JIRA for same * When its Fixed Revisit this function */ @Test(enabled = false) public void killQueryByQueryName() throws Exception { String queryName1 = "queryNameFirst"; String queryName2 = "queryNameSecond"; String queryName3 = "Name"; QueryHandle queryHandle1 = (QueryHandle) qHelper.executeQuery(sleepQuery, queryName1).getData(); logger.info("1st QUERY HANDLE : " + queryHandle1); QueryHandle queryHandle2 = (QueryHandle) qHelper.executeQuery(sleepQuery, queryName2).getData(); logger.info("2nd QUERY HANDLE : " + queryHandle2); QueryHandle queryHandle3 = (QueryHandle) qHelper.executeQuery(sleepQuery, queryName3).getData(); logger.info("3rd QUERY HANDLE : " + queryHandle3); QueryStatus queryStatus1 = qHelper.waitForQueryToRun(queryHandle1); QueryStatus queryStatus2 = qHelper.waitForQueryToRun(queryHandle2); QueryStatus queryStatus3 = qHelper.waitForQueryToRun(queryHandle3); Assert.assertEquals(queryStatus1.getStatus(), QueryStatus.Status.RUNNING, "Query is Not Running"); Assert.assertEquals(queryStatus2.getStatus(), QueryStatus.Status.RUNNING, "Query is Not Running"); Assert.assertEquals(queryStatus3.getStatus(), QueryStatus.Status.RUNNING, "Query is Not Running"); qHelper.killQuery(queryName3); queryStatus1 = qHelper.getQueryStatus(queryHandle1); queryStatus2 = qHelper.getQueryStatus(queryHandle2); queryStatus3 = qHelper.getQueryStatus(queryHandle3); Assert.assertEquals(queryStatus1.getStatus(), QueryStatus.Status.RUNNING, "Query is Not Running"); Assert.assertEquals(queryStatus2.getStatus(), QueryStatus.Status.RUNNING, "Query is Not Running"); Assert.assertEquals(queryStatus3.getStatus(), QueryStatus.Status.CANCELED, "Query is Not Cancelled"); qHelper.killQuery(queryName1); queryStatus1 = qHelper.getQueryStatus(queryHandle1); queryStatus2 = qHelper.getQueryStatus(queryHandle2); Assert.assertEquals(queryStatus1.getStatus(), QueryStatus.Status.CANCELED, "Query is Not CANCELED"); Assert.assertEquals(queryStatus2.getStatus(), QueryStatus.Status.RUNNING, "Query is Not Running"); qHelper.killQuery(queryName2); queryStatus2 = qHelper.getQueryStatus(queryHandle2); Assert.assertEquals(queryStatus2.getStatus(), QueryStatus.Status.CANCELED, "Query is Not CANCELED"); } @Test(enabled = true) public void killQueryByTimeRange() throws Exception { String startTime1 = String.valueOf(System.currentTimeMillis()); logger.info("Start Time of 1st Query : " + startTime1); Thread.sleep(1000); QueryHandle queryHandle1 = (QueryHandle) qHelper.executeQuery(sleepQuery).getData(); Thread.sleep(1000); String endTime1 = String.valueOf(System.currentTimeMillis()); logger.info("End Time of 1st Query : " + endTime1); Thread.sleep(1000); String startTime2 = String.valueOf(System.currentTimeMillis()); logger.info("Start Time of 2nd Query : " + startTime2); Thread.sleep(1000); QueryHandle queryHandle2 = (QueryHandle) qHelper.executeQuery(sleepQuery).getData(); Thread.sleep(1000); String endTime2 = String.valueOf(System.currentTimeMillis()); logger.info("End Time of 2nd Query : " + endTime2); QueryStatus queryStatus1 = qHelper.waitForQueryToRun(queryHandle1); QueryStatus queryStatus2 = qHelper.waitForQueryToRun(queryHandle2); Assert.assertEquals(queryStatus1.getStatus(), QueryStatus.Status.RUNNING, "Query is Not Running"); Assert.assertEquals(queryStatus2.getStatus(), QueryStatus.Status.RUNNING, "Query is Not Running"); qHelper.killQuery(null, null, null, sessionHandleString, startTime1, endTime1); queryStatus1 = qHelper.getQueryStatus(queryHandle1); queryStatus2 = qHelper.getQueryStatus(queryHandle2); Assert.assertEquals(queryStatus1.getStatus(), QueryStatus.Status.CANCELED, "Query is Not CANCELED"); Assert.assertEquals(queryStatus2.getStatus(), QueryStatus.Status.RUNNING, "Query is Not CANCELED"); qHelper.killQuery(null, null, null, sessionHandleString, startTime2, endTime2); queryStatus2 = qHelper.getQueryStatus(queryHandle2); Assert.assertEquals(queryStatus2.getStatus(), QueryStatus.Status.CANCELED, "Query is Not CANCELED"); } @Test(enabled = true) public void killQueryByAllFilter() throws Exception { String queryName1 = "TestKill"; String startTime1 = String.valueOf(System.currentTimeMillis()); logger.info("Start Time of 1st Query : " + startTime1); Thread.sleep(1000); QueryHandle queryHandle1 = (QueryHandle) qHelper.executeQuery(sleepQuery, queryName1).getData(); Thread.sleep(1000); String endTime1 = String.valueOf(System.currentTimeMillis()); logger.info("End Time of 1st Query : " + endTime1); QueryStatus queryStatus1 = qHelper.waitForQueryToRun(queryHandle1); Assert.assertEquals(queryStatus1.getStatus(), QueryStatus.Status.RUNNING, "Query is Not Running"); qHelper.killQuery(queryName1, "RUNNING", lens.getUserName(), sessionHandleString, startTime1, endTime1); queryStatus1 = qHelper.getQueryStatus(queryHandle1); Assert.assertEquals(queryStatus1.getStatus(), QueryStatus.Status.CANCELED, "Query is Not CANCELED"); } }