/** * 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.exec.work.fragment; import static org.junit.Assert.fail; import org.apache.drill.BaseTestQuery; import org.apache.drill.common.exceptions.UserException; import org.apache.drill.exec.exception.OutOfMemoryException; import org.apache.drill.exec.proto.CoordinationProtos; import org.apache.drill.exec.testing.ControlsInjectionUtil; import org.junit.Test; /** * Run several tpch queries and inject an OutOfMemoryException in ScanBatch that will cause an OUT_OF_MEMORY outcome to * be propagated downstream. Make sure the proper "memory error" message is sent to the client. */ public class TestFragmentExecutorCancel extends BaseTestQuery { @Test public void testCancelNonRunningFragments() throws Exception{ test("alter session set `planner.slice_target` = 10"); // Inject an out of memory exception in the ScanBatch CoordinationProtos.DrillbitEndpoint endpoint = bits[0].getContext().getEndpoint(); String controlsString = "{\"injections\":[{" + "\"address\":\"" + endpoint.getAddress() + "\"," + "\"port\":\"" + endpoint.getUserPort() + "\"," + "\"type\":\"exception\"," + "\"siteClass\":\"" + "org.apache.drill.exec.physical.impl.ScanBatch" + "\"," + "\"desc\":\"" + "next-allocate" + "\"," + "\"nSkip\":0," + "\"nFire\":1," + "\"exceptionClass\":\"" + OutOfMemoryException.class.getName() + "\"" + "}]}"; ControlsInjectionUtil.setControls(client, controlsString); String query = getFile("queries/tpch/04.sql"); try { test(query); fail("The query should have failed!!!"); } catch(UserException uex) { // The query should fail } try { closeClient(); } catch (IllegalStateException ex) { fail("failed to close the drillbits properly"); } } }