--- old/test/runtime/ErrorHandling/TimeoutInErrorHandlingTest.java 2017-02-06 12:02:35.193606000 +0100 +++ new/test/runtime/ErrorHandling/TimeoutInErrorHandlingTest.java 2017-02-06 12:02:34.980595000 +0100 @@ -1,5 +1,5 @@ /* - * 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 @@ -37,7 +37,7 @@ * @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) */ @@ -47,31 +47,32 @@ 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"); @@ -102,7 +103,10 @@ 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;