You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@kudu.apache.org by ad...@apache.org on 2019/04/24 16:40:10 UTC
[kudu] 02/03: dist-test: support test result reporting
This is an automated email from the ASF dual-hosted git repository.
adar pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/kudu.git
commit 3707cf33ccbcb015130de356e4e82d1f54636c6e
Author: Adar Dembo <ad...@cloudera.com>
AuthorDate: Thu Apr 18 15:40:25 2019 -0700
dist-test: support test result reporting
The goal is to be able to use dist-test in any run of build-and-test.sh,
even those that power the flaky test dashboard.
Because dist-test runs just one test per invocation, it isn't safe to disown
the reporting process; the slave might disappear mid-report. There wasn't an
obvious way to know that we're using dist-test from within run-test.sh, so I
opted to stop disowning altogether. The Java result reporting is synchronous
(and per-test rather than per-class) so this didn't seem like a big deal.
I was concerned that the additional parallelism might lead to "thundering
herd" behavior in the test result server (i.e. if all tests finished and
reported at the same time) so I ran a couple reporting-enabled dist-tests
looking for load spikes on the server. I didn't see any, likely because:
- Most tests' running time varies.
- Tests only start when dist-test slaves become available, not all at once.
RUN_FLAKY_ONLY will be addressed in a follow-up.
Change-Id: Ie5072e2395376e455f63dac6d3debc88526aed07
Reviewed-on: http://gerrit.cloudera.org:8080/13068
Tested-by: Adar Dembo <ad...@cloudera.com>
Reviewed-by: Grant Henke <gr...@apache.org>
---
build-support/dist_test.py | 24 +++++++++++++++
build-support/run-test.sh | 12 +-------
.../org/apache/kudu/gradle/DistTestTask.java | 36 ++++++++++++++++++++--
3 files changed, 58 insertions(+), 14 deletions(-)
diff --git a/build-support/dist_test.py b/build-support/dist_test.py
index 402b6c6..b26ebc9 100755
--- a/build-support/dist_test.py
+++ b/build-support/dist_test.py
@@ -83,6 +83,7 @@ TEST_SHARD_RE = re.compile("\.\d+$")
DEPS_FOR_ALL = \
["build-support/stacktrace_addr2line.pl",
+ "build-support/report-test.sh",
"build-support/run-test.sh",
"build-support/run_dist_test.py",
"build-support/java-home-candidates.txt",
@@ -273,6 +274,20 @@ def copy_system_library(lib):
shutil.copy2(rel_to_abs(lib), dst)
return dst
+def forward_env_var(command_list, var_name, is_required=True):
+ """
+ Extends 'command_list' with the name and value of the environment variable
+ given by 'var_name'.
+
+ Does nothing if the environment variable isn't set or is empty, unless
+ 'is_required' is True, in which case an exception is raised.
+ """
+ if not var_name in os.environ or not os.environ.get(var_name):
+ if is_required:
+ raise Exception("required env variable %s is missing" % (var_name,))
+ return
+ command_list.extend(["-e", "%s=%s" % (var_name, os.environ.get(var_name))])
+
def create_archive_input(staging, execution, dep_extractor,
collect_tmpdir=False):
"""
@@ -324,6 +339,15 @@ def create_archive_input(staging, execution, dep_extractor,
continue
command.extend(['-e', '%s=%s' % (k, v)])
+ # If test result reporting was requested, forward all relevant environment
+ # variables into the test process so as to enable reporting.
+ if os.environ.get('KUDU_REPORT_TEST_RESULTS', 0):
+ forward_env_var(command, 'KUDU_REPORT_TEST_RESULTS')
+ forward_env_var(command, 'BUILD_CONFIG')
+ forward_env_var(command, 'BUILD_TAG')
+ forward_env_var(command, 'GIT_REVISION')
+ forward_env_var(command, 'TEST_RESULT_SERVER', is_required=False)
+
if collect_tmpdir:
command += ["--collect-tmpdir"]
command.append('--')
diff --git a/build-support/run-test.sh b/build-support/run-test.sh
index c5b9ab8..21d09d0 100755
--- a/build-support/run-test.sh
+++ b/build-support/run-test.sh
@@ -215,17 +215,7 @@ for ATTEMPT_NUMBER in $(seq 1 $TEST_EXECUTION_ATTEMPTS) ; do
if [ -n "$KUDU_REPORT_TEST_RESULTS" ] && [ "$KUDU_REPORT_TEST_RESULTS" -ne 0 ]; then
echo Reporting results
- $SOURCE_ROOT/build-support/report-test.sh "$ABS_TEST_PATH" "$LOGFILE" "$STATUS" &
-
- # On success, we'll do "best effort" reporting, and disown the subprocess.
- # On failure, we want to upload the failed test log. So, in that case,
- # wait for the report-test.sh job to finish, lest we accidentally run
- # a test retry and upload the wrong log.
- if [ "$STATUS" -eq "0" ]; then
- disown
- else
- wait
- fi
+ $SOURCE_ROOT/build-support/report-test.sh "$ABS_TEST_PATH" "$LOGFILE" "$STATUS"
fi
if [ "$STATUS" -eq "0" ]; then
diff --git a/java/buildSrc/src/main/groovy/org/apache/kudu/gradle/DistTestTask.java b/java/buildSrc/src/main/groovy/org/apache/kudu/gradle/DistTestTask.java
index 4d3f5db..9340b25 100644
--- a/java/buildSrc/src/main/groovy/org/apache/kudu/gradle/DistTestTask.java
+++ b/java/buildSrc/src/main/groovy/org/apache/kudu/gradle/DistTestTask.java
@@ -149,7 +149,7 @@ public class DistTestTask extends DefaultTask {
*
* Note: This currently fails OSX because dump_base_deps use ldd.
*/
- List<String> getBaseDeps() throws IOException {
+ private List<String> getBaseDeps() throws IOException {
Process proc = new ProcessBuilder(distTestBin,
"internal",
"dump_base_deps")
@@ -162,6 +162,35 @@ public class DistTestTask extends DefaultTask {
}
}
+ /**
+ * @return all test result reporting environment variables and their values,
+ * in a format suitable for consumption by run_dist_test.py.
+ */
+ private List<String> getTestResultReportingEnvironmentVariables() {
+ ImmutableList.Builder<String> args = new ImmutableList.Builder<>();
+ String enabled = System.getenv("KUDU_REPORT_TEST_RESULTS");
+ if (enabled != null && Integer.parseInt(enabled) > 0) {
+ for (String ev : ImmutableList.of("KUDU_REPORT_TEST_RESULTS",
+ "BUILD_CONFIG",
+ "BUILD_TAG",
+ "GIT_REVISION",
+ "TEST_RESULT_SERVER")) {
+ String evValue = System.getenv(ev);
+ if (evValue == null || evValue.isEmpty()) {
+ if (ev.equals("TEST_RESULT_SERVER")) {
+ // This one is optional.
+ continue;
+ }
+ throw new RuntimeException(
+ String.format("Required env variable %s is missing", ev));
+ }
+ args.add("-e");
+ args.add(String.format("%s=%s", ev, evValue));
+ }
+ }
+ return args.build();
+ }
+
private String genIsolate(Path isolateFileDir, Test test, String testClass,
List<String> baseDeps) throws IOException {
Path rootDir = test.getProject().getRootDir().toPath();
@@ -200,8 +229,9 @@ public class DistTestTask extends DefaultTask {
if (collectTmpDir) {
cmd.add("--collect-tmpdir");
}
- cmd.add("--test-language=java",
- "--",
+ cmd.add("--test-language=java");
+ cmd.addAll(getTestResultReportingEnvironmentVariables());
+ cmd.add("--",
"-ea",
"-cp",
Joiner.on(":").join(classpath));