IMPALA-13128: disk-file-test Hangs on ARM + UBSAN Test Jobs

The Jenkins jobs that run the UBSAN tests on ARM were occaisonally
hanging on the disk-file-test. This commit fixes these hangs by
upgrading Google Test and implementing the Death Test handling
functionality which safely runs tests that expect the process to die.
See https://github.com/google/googletest/blob/main/docs/advanced.md#death-tests
for details on known problems with running death tests and threads at
the same time causing tests to hang.

Testing was accomplished by running the disk-file-test repeatedly in a
loop on a RHEL 8.9 ARM machine. Before this fix was implemented, this
test would run up to 70 times before it hung. After the fix was
implemented, the test ran 2,490 times and was still running when it was
stopped. These test runs had durations between 18.7 and 19.9 seconds
which means disk-file-test now takes about 15 seconds longer than its
previous duration of about 4.4 seconds.

Change-Id: Ie01f7781f24644a66e9ec52652450116f5cb4297
Reviewed-on: http://gerrit.cloudera.org:8080/21544
Reviewed-by: Impala Public Jenkins <impala-public-jenkins@cloudera.com>
Tested-by: Impala Public Jenkins <impala-public-jenkins@cloudera.com>
This commit is contained in:
Joe McDonnell
2024-06-10 20:09:20 -07:00
committed by Impala Public Jenkins
parent 101e10ba31
commit 8d05f5134c
16 changed files with 33 additions and 24 deletions

View File

@@ -120,7 +120,8 @@ set_dep_root(GCC)
set_dep_root(GFLAGS)
set_dep_root(GLOG)
set_dep_root(GPERFTOOLS)
set_dep_root(GTEST)
set(GTEST_ROOT
$ENV{IMPALA_TOOLCHAIN_PACKAGES_HOME}/googletest-$ENV{IMPALA_GTEST_VERSION})
set_dep_root(JWT_CPP)
set_dep_root(LIBEV)
set_dep_root(LIBUNWIND)

View File

@@ -704,7 +704,7 @@ TEST_P(LlvmOptTest, CachedOptFunction) {
EXPECT_EQ(cache_misses->GetValue(), opt_levels.size() - num_less);
}
INSTANTIATE_TEST_CASE_P(OptLevels, LlvmOptTest, ::testing::Values(
INSTANTIATE_TEST_SUITE_P(OptLevels, LlvmOptTest, ::testing::Values(
// Optimization level Expect unoptimized
std::make_tuple(TCodeGenOptLevel::O0, true),
std::make_tuple(TCodeGenOptLevel::O1, false),

View File

@@ -107,7 +107,7 @@ class JsonParserTest : public ::testing::TestWithParam<int> {
};
};
INSTANTIATE_TEST_CASE_P(StreamSize, JsonParserTest, ::testing::Values(1, 16, 256));
INSTANTIATE_TEST_SUITE_P(StreamSize, JsonParserTest, ::testing::Values(1, 16, 256));
TEST_P(JsonParserTest, Basic) {
SimpleJsonScanner js(schema(), [this](const char** begin, const char** end) {

View File

@@ -11427,7 +11427,7 @@ TEST_P(ExprTest, AiFunctionsTest) {
} // namespace impala
INSTANTIATE_TEST_CASE_P(Instantiations, ExprTest, ::testing::Values(
INSTANTIATE_TEST_SUITE_P(Instantiations, ExprTest, ::testing::Values(
// disable_codegen enable_expr_rewrites
std::make_tuple(true, false),
std::make_tuple(false, false),

View File

@@ -284,7 +284,7 @@ TEST_P(RpcMgrKerberizedTest, InternalAuthorizationSkip) {
// Run tests with Unix domain socket and TCP socket by setting
// FLAGS_rpc_use_unix_domain_socket as true and false.
INSTANTIATE_TEST_CASE_P(
INSTANTIATE_TEST_SUITE_P(
UdsOnAndOff, RpcMgrKerberizedTest, ::testing::Values(true, false));
} // namespace impala

View File

@@ -416,7 +416,7 @@ TEST_P(RpcMgrTest, BusyService) {
// Run tests with Unix domain socket and TCP socket by setting
// FLAGS_rpc_use_unix_domain_socket as true and false.
INSTANTIATE_TEST_CASE_P(UdsOnAndOff, RpcMgrTest, ::testing::Values(true, false));
INSTANTIATE_TEST_SUITE_P(UdsOnAndOff, RpcMgrTest, ::testing::Values(true, false));
} // namespace impala

View File

@@ -135,10 +135,10 @@ class ThriftKerberizedParamsTest :
}
};
INSTANTIATE_TEST_CASE_P(KerberosOnAndOff,
ThriftKerberizedParamsTest,
::testing::Values(KERBEROS_OFF,
KERBEROS_ON));
INSTANTIATE_TEST_SUITE_P(KerberosOnAndOff,
ThriftKerberizedParamsTest,
::testing::Values(KERBEROS_OFF,
KERBEROS_ON));
TEST(ThriftTestBase, Connectivity) {
int port = GetServerPort();

View File

@@ -60,7 +60,7 @@ add_executable(data-cache-trace-replayer data-cache-trace-replayer.cc)
target_link_libraries(data-cache-trace-replayer ${IMPALA_TEST_LINK_LIBS})
ADD_UNIFIED_BE_LSAN_TEST(disk-io-mgr-test DiskIoMgrTest.*)
ADD_UNIFIED_BE_LSAN_TEST(disk-file-test DiskFileTest.*)
ADD_UNIFIED_BE_LSAN_TEST(disk-file-test DiskFileTest.*:DiskFileDeathTest.*)
ADD_UNIFIED_BE_LSAN_TEST(data-cache-trace-test DataCacheTraceTest.*)
# Exception to unified be: Custom main function (platform tests)
ADD_BE_LSAN_TEST(data-cache-test)

View File

@@ -332,7 +332,7 @@ class DataCacheTest :
}
};
INSTANTIATE_TEST_CASE_P(DataCacheTestTypes, DataCacheTest,::testing::Values(
INSTANTIATE_TEST_SUITE_P(DataCacheTestTypes, DataCacheTest,::testing::Values(
DataCacheTestParam("LRU", 0),
DataCacheTestParam("LRU", NUM_THREADS),
DataCacheTestParam("LIRS", 0),

View File

@@ -15,6 +15,8 @@
// specific language governing permissions and limitations
// under the License.
#include <gtest/gtest.h>
#include "common/names.h"
#include "runtime/io/disk-io-mgr-internal.h"
#include "testutil/death-test-util.h"
@@ -30,6 +32,8 @@ class DiskFileTest : public testing::Test {
MemBlockStatus new_status, bool expect_success);
};
typedef DiskFileTest DiskFileDeathTest;
// last_status is the MemBlock's last status it is going to reach other than
// MemBlockStatus::DISABLED.
void DiskFileTest::ValidateMemBlockStatus(MemBlockStatus last_status) {
@@ -88,7 +92,9 @@ TEST_F(DiskFileTest, MemBlockTest) {
}
// Test the MemBlock status transition.
TEST_F(DiskFileTest, MemBlockStatusTransition) {
TEST_F(DiskFileDeathTest, MemBlockStatusTransition) {
GTEST_FLAG_SET(death_test_style, "threadsafe");
MemBlock block(0);
ValidateMemBlockStatusTransition(
block, MemBlockStatus::UNINIT, MemBlockStatus::UNINIT, false);

View File

@@ -163,7 +163,7 @@ class CacheBench : public testing::Test,
// Test both distributions, and for each, test both the case where the data
// fits in the cache and where it is a bit larger.
INSTANTIATE_TEST_CASE_P(Patterns, CacheBench, testing::ValuesIn(std::vector<BenchSetup>{
INSTANTIATE_TEST_SUITE_P(Patterns, CacheBench, testing::ValuesIn(std::vector<BenchSetup>{
{BenchSetup::Pattern::ZIPFIAN, 1.0},
{BenchSetup::Pattern::ZIPFIAN, 3.0},
{BenchSetup::Pattern::UNIFORM, 1.0},

View File

@@ -73,7 +73,7 @@ class CacheTest :
}
};
INSTANTIATE_TEST_CASE_P(
INSTANTIATE_TEST_SUITE_P(
CacheTypes, CacheTest,
::testing::Values(
make_tuple(Cache::EvictionPolicy::FIFO,

View File

@@ -41,7 +41,7 @@ class CacheInvalidationTest :
}
};
INSTANTIATE_TEST_CASE_P(
INSTANTIATE_TEST_SUITE_P(
CacheTypes, CacheInvalidationTest,
::testing::Values(
make_tuple(Cache::EvictionPolicy::FIFO,
@@ -277,7 +277,7 @@ class LRUCacheTest :
}
};
INSTANTIATE_TEST_CASE_P(
INSTANTIATE_TEST_SUITE_P(
CacheTypes, LRUCacheTest,
::testing::Values(ShardingPolicy::MultiShard,
ShardingPolicy::SingleShard));

View File

@@ -1661,7 +1661,7 @@ TEST_P(TimeSeriesCounterResampleTest, TestPrettyPrint) {
for (const char* e : param.expected) EXPECT_STR_CONTAINS(pretty_str, e);
}
INSTANTIATE_TEST_CASE_P(VariousNumbers, TimeSeriesCounterResampleTest,
INSTANTIATE_TEST_SUITE_P(VariousNumbers, TimeSeriesCounterResampleTest,
::testing::Values(
TimeSeriesTestParam(64, {"TestCounter (500.000ms): 0, 1, 2, 3", "61, 62, 63"}),

View File

@@ -474,12 +474,14 @@ def get_toolchain_downloads():
toolchain_packages += [ToolchainPackage(p) for p in
["avro", "binutils", "boost", "breakpad", "bzip2", "calloncehack", "cctz",
"cloudflarezlib", "cmake", "crcutil", "curl", "flatbuffers", "gdb", "gflags",
"glog", "gperftools", "gtest", "jwt-cpp", "libev", "libunwind", "lz4", "mold",
"glog", "gperftools", "jwt-cpp", "libev", "libunwind", "lz4", "mold",
"openldap", "orc", "protobuf", "python", "rapidjson", "re2", "snappy", "tpc-h",
"tpc-ds", "zlib", "zstd"]]
python3_package = ToolchainPackage(
"python", explicit_version=os.environ.get("IMPALA_PYTHON3_VERSION"))
toolchain_packages += [python3_package]
gtest_package = ToolchainPackage(
"googletest", explicit_version=os.environ.get("IMPALA_GTEST_VERSION"))
toolchain_packages += [python3_package, gtest_package]
toolchain_packages += get_unique_toolchain_downloads(
["thrift:cpp", "thrift:java", "thrift:py"])
protobuf_package_clang = ToolchainPackage(

View File

@@ -85,13 +85,13 @@ export USE_AVRO_CPP=${USE_AVRO_CPP:=false}
# moving to a different build of the toolchain, e.g. when a version is bumped or a
# compile option is changed. The build id can be found in the output of the toolchain
# build jobs, it is constructed from the build number and toolchain git hash prefix.
export IMPALA_TOOLCHAIN_BUILD_ID_AARCH64=34-f93e2c9a86
export IMPALA_TOOLCHAIN_BUILD_ID_X86_64=422-f93e2c9a86
export IMPALA_TOOLCHAIN_BUILD_ID_AARCH64=45-e78b0ef342
export IMPALA_TOOLCHAIN_BUILD_ID_X86_64=438-e78b0ef342
export IMPALA_TOOLCHAIN_REPO=\
${IMPALA_TOOLCHAIN_REPO:-https://github.com/cloudera/native-toolchain.git}
export IMPALA_TOOLCHAIN_BRANCH=${IMPALA_TOOLCHAIN_BRANCH:-master}
export IMPALA_TOOLCHAIN_COMMIT_HASH=\
${IMPALA_TOOLCHAIN_COMMIT_HASH-f93e2c9a865c80cafd76b872ad04400877766a2f}
${IMPALA_TOOLCHAIN_COMMIT_HASH-e78b0ef34241218cda7eac3b526cb6a824596df1}
# Compare the build ref in build IDs by removing everything up-to-and-including the
# first hyphen.
if [ "${IMPALA_TOOLCHAIN_BUILD_ID_AARCH64#*-}" \
@@ -141,7 +141,7 @@ export IMPALA_GLOG_VERSION=0.3.5-p3
unset IMPALA_GLOG_URL
export IMPALA_GPERFTOOLS_VERSION=2.10
unset IMPALA_GPERFTOOLS_URL
export IMPALA_GTEST_VERSION=1.6.0
export IMPALA_GTEST_VERSION=1.14.0
unset IMPALA_GTEST_URL
export IMPALA_JWT_CPP_VERSION=0.5.0
unset IMPALA_JWT_CPP_URL