Files
impala/tests/util/failpoints_util.py
Sahil Takiar 391942d79d IMPALA-8924, IMPALA-8934: Result spooling failpoint tests, fix DCHECKs
Adds several "failpoint" tests to test_result_spooling.py. These tests
use debug_actions spread throughout buffered-plan-root-sink.cc to
trigger failures while result spooling is running. The tests validate
that all queries gracefully fail and do not cause any impalad crashes.

Fixed a few bugs that came up when adding these tests, as well as the
crash reported in IMPALA-8924 (which is now covered by the failpoint
tests added in this patch).

The first bug fixed was a DCHECK in SpillableRowBatchQueue::IsEmpty()
where the method was being called after the queue had been closed. The
fix is to only call IsEmpty() if IsOpen() returns true.

The second bug was an issue in the cancellation path where
BufferedPlanRootSink::GetNext would enter an infinite loop if the query
was cancelled and then GetNext was called. The fix is to check the
cancellation state in the outer while loop.

Testing:
* Added new tests to test_result_spooling.py
* Ran core tests

Change-Id: Ib96f797bc8a5ba8baf9fb28abd1f645345bbe932
Reviewed-on: http://gerrit.cloudera.org:8080/14214
Reviewed-by: Impala Public Jenkins <impala-public-jenkins@cloudera.com>
Tested-by: Impala Public Jenkins <impala-public-jenkins@cloudera.com>
2019-09-19 19:03:27 +00:00

37 lines
1.9 KiB
Python

# 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.
from tests.common.impala_test_suite import ImpalaTestSuite, LOG
def execute_query_expect_debug_action_failure(impala_test_suite, query, vector):
"""Executes the given query with the configured debug_action and asserts that the
query fails. Removes the debug_action from the exec options, re-runs the query, and
assert that it succeeds."""
assert 'debug_action' in vector.get_value('exec_option')
# Run the query with the given debug_action and assert that the query fails.
# execute_query_expect_failure either returns the client exception thrown when executing
# the query, or the result of the query if it failed but did the client did not throw an
# exception. Either way, log the result.
LOG.debug(ImpalaTestSuite.execute_query_expect_failure(
impala_test_suite.client, query, vector.get_value('exec_option')))
# Assert that the query can be run without the debug_action.
del vector.get_value('exec_option')['debug_action']
result = impala_test_suite.execute_query(query, vector.get_value('exec_option'))
assert result.success, "Failed to run {0} without debug action".format(query)