< 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 +1,7 @@
 /*
- * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * 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,45 +35,46 @@
  * @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
+ * @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 three subsequent error reporting steps hang. The Timeout handling triggered
-         * by the WatcherThread should kick in and interrupt those steps.
+         * 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. ------"
          *
-         * 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;
-        }
+         * 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=10", // 10 seconds
+            "-XX:ErrorLogTimeout=16", // 16 seconds big timeout = 4 seconds per little timeout
             "-XX:-CreateCoredumpOnCrash",
             "-version");
 
         OutputAnalyzer output_detail = new OutputAnalyzer(pb.start());
 

@@ -100,11 +101,14 @@
 
         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 >