< prev index next >
test/runtime/ErrorHandling/TimeoutInErrorHandlingTest.java
Print this page
rev 12487 : 8166944: Hanging Error Reporting steps may lead to torn error logs.
Reviewed-by: cjplummer, dholmes
Summary: Interupt error reporting if reporting steps hang to enable subsequent reporting steps to run.
rev 12488 : [mq]: 8166944-Hanging-Error-Reporting-2
*** 1,7 ****
/*
! * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
--- 1,7 ----
/*
! * Copyright (c) 2017 Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*** 35,79 ****
* @test
* @bug 8166944
* @summary Hanging Error Reporting steps may lead to torn error logs
* @modules java.base/jdk.internal.misc
* @library /test/lib
! * @requires vm.debug == true
* @author Thomas Stuefe (SAP)
*/
public class TimeoutInErrorHandlingTest {
public static void main(String[] args) throws Exception {
/* Start the VM and let it crash. Specify TestUnresponsiveErrorHandler which will
! * let three subsequent error reporting steps hang. The Timeout handling triggered
! * by the WatcherThread should kick in and interrupt those steps.
*
! * Timeout in Error Reporting is controlled by ErrorLogTimeout, which defines after
! * how many seconds error reporting is stopped altogether and the VM is aborted.
! * Each error reporting step is granted up to half of this time before it is canceled
! * and the next step is started (the logic being, typically error steps are
! * instantaneous, if they hang, its typically an error which only should affect one
! * or two steps).
! * So, by causing three subsequent steps to hang, we expect the error log to contain
! * at least one, possibly two step-timeout messages, and then the global ErrorLogTimeout
! * should have been reached and the VM should have been aborted by the WatcherThread,
! * which should write "timer expired, abort..." to stderr. */
!
! // Not debug, not windows (yet)
! if (!Platform.isDebugBuild() || Platform.isWindows()) {
! return;
! }
ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(
"-XX:+UnlockDiagnosticVMOptions",
"-Xmx100M",
"-XX:ErrorHandlerTest=14",
"-XX:+TestUnresponsiveErrorHandler",
! "-XX:ErrorLogTimeout=10", // 10 seconds
"-XX:-CreateCoredumpOnCrash",
"-version");
OutputAnalyzer output_detail = new OutputAnalyzer(pb.start());
--- 35,80 ----
* @test
* @bug 8166944
* @summary Hanging Error Reporting steps may lead to torn error logs
* @modules java.base/jdk.internal.misc
* @library /test/lib
! * @requires (vm.debug == true) & (os.family != "windows")
* @author Thomas Stuefe (SAP)
*/
public class TimeoutInErrorHandlingTest {
public static void main(String[] args) throws Exception {
/* Start the VM and let it crash. Specify TestUnresponsiveErrorHandler which will
! * let five subsequent error reporting steps hang. The Timeout handling triggered
! * by the WatcherThread should kick in and interrupt those steps. In theory, the
! * text "timeout occurred during error reporting in step .." (the little timeouts)
! * should occur in the error log up to four times, followed by the final big timeout
! * "------ Timeout during error reporting after xx s. ------"
*
! * Note that there are a number of uncertainties which make writing a 100% foolproof
! * test challenging. The time the error reporting thread takes to react to the
! * timeout triggers is unknown. So it is difficult to predict how many little timeouts
! * will be visible before the big timeout kicks in. Also, once the big timeout hits,
! * error reporting thread and Watcherthread will race. The former writes his last
! * message to the error logs and flushes, the latter waits 200ms and then exits the
! * process without further synchronization with the error reporting thread.
! *
! * Because of all this and the desire to write a bullet proof test which does
! * not fail sporadically, we will not test for the final timeout message nor for all
! * of the optimally expected little timeout messages. We just test for two of the
! * little timeout messages to see that repeated timeout handling is basically working.
! */
ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(
"-XX:+UnlockDiagnosticVMOptions",
"-Xmx100M",
"-XX:ErrorHandlerTest=14",
"-XX:+TestUnresponsiveErrorHandler",
! "-XX:ErrorLogTimeout=16", // 16 seconds big timeout = 4 seconds per little timeout
"-XX:-CreateCoredumpOnCrash",
"-version");
OutputAnalyzer output_detail = new OutputAnalyzer(pb.start());
*** 100,110 ****
--- 101,114 ----
FileInputStream fis = new FileInputStream(f);
BufferedReader br = new BufferedReader(new InputStreamReader(fis));
String line = null;
+
+
Pattern [] pattern = new Pattern[] {
+ Pattern.compile(".*timeout occurred during error reporting in step.*"),
Pattern.compile(".*timeout occurred during error reporting in step.*")
};
int currentPattern = 0;
String lastLine = null;
< prev index next >