LingeredApp termination sequence

Gary Adams gary.adams at oracle.com
Mon Apr 1 12:22:40 UTC 2019


The problem I was trying to understand a little better ...

I was observing an IOException, but it was not a NoSuchFileException.
Changing to catch just IOException runs cleanly, but may obscure
some other cause of the IOException.

Testing a variant today that exits cleanly as long as the lock file was 
removed.

diff --git a/test/lib/jdk/test/lib/apps/LingeredApp.java 
b/test/lib/jdk/test/lib/apps/LingeredApp.java
--- a/test/lib/jdk/test/lib/apps/LingeredApp.java
+++ b/test/lib/jdk/test/lib/apps/LingeredApp.java
@@ -1,5 +1,5 @@
  /*
- * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights 
reserved.
+ * Copyright (c) 2015, 2019, 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
@@ -492,18 +492,21 @@
          }

          String theLockFileName = args[0];
+        Path path = Paths.get(theLockFileName);

          try {
-            Path path = Paths.get(theLockFileName);
-
              while (Files.exists(path)) {
                  // Touch the lock to indicate our readiness
                  setLastModified(theLockFileName, epoch());
                  Thread.sleep(spinDelay);
              }
-        } catch (NoSuchFileException ex) {
+        } catch (IOException ex) {
              // Lock deleted while we are setting last modified time.
-            // Ignore error and lets the app exits
+            // Ignore the error and let the app exit.
+            if (Files.exists(path)) {
+                // If the lock file was not removed, return an error.
+                System.exit(4);
+            }
          } catch (Exception ex) {
              System.err.println("LingeredApp ERROR: " + ex);
              // Leave exit_code = 1 to Java launcher


During the latest set of test runs I saw a variety of RMI binding errors.
These could be issues with the test infrastructure systems.
Or could be collisions from the test harness.

[Jstatd-Thread] Could not bind /JStatRemoteHost to RMI Registry
[Jstatd-Thread] java.rmi.server.ExportException: Port already in use: 
1099; nested exception is:
[Jstatd-Thread]     java.net.BindException: Address already in use: NET_Bind
[Jstatd-Thread]     at 
java.rmi/sun.rmi.transport.tcp.TCPTransport.listen(TCPTransport.java:335)


[Jstatd-Thread] Could not bind //:49153/JStatRemoteHost to RMI Registry
[Jstatd-Thread] java.rmi.ConnectIOException: error during JRMP 
connection establishment; nested exception is:
[Jstatd-Thread]     java.net.SocketTimeoutException: Read timed out


[Jstatd-Thread] Could not bind //:33712/JStatRemoteHost to RMI Registry
[Jstatd-Thread] java.rmi.server.ExportException: Port already in use: 
33712; nested exception is:
[Jstatd-Thread]     java.net.BindException: Address already in use (Bind 
failed)


[Jstatd-Thread] Could not bind //:58765/TestJstatdServer to RMI Registry
[Jstatd-Thread] java.rmi.ConnectIOException: Exception creating 
connection to: 10.133.156.143; nested exception is:
[Jstatd-Thread]     java.net.NoRouteToHostException: Cannot assign 
requested address


On 3/30/19, 9:46 AM, Dmitry Samersoff wrote:
> Hello Gary,
>
> The LingeredApp was designed to provide precise control over the life
> cycle of a subordinate process.
>
> This means that if the app exits unexpectedly, we should have detailed
> information why it happens.
>
> IOException may occur when the app tries to touch lockfile (e.g. due to
> a network filesystem error), so it might be better to catch IOException,
> then check if it is an instance of NoSuchFileException or the lockfile
> was deleted by driver.
>
> -Dmitry
>
> On 29.03.2019 20:12, Gary Adams wrote:
>> While running some bulk testing on jdk/sun/tools I've
>> come across some errors reported from the termination sequence
>> for LingeredApp debuggee process.
>>
>> The main process creates a locking file, which the LingeredApp
>> sits in a loop updating the file modification date. When the main
>> test completes it stops the LingeredApp by removing the file.
>>
>> The clean exit results when LingeredApp gets a NoSuchFileException.
>> I see a number of bugs filed that are getting a raw IOException
>> on the LingeredApp termination.
>>
>> I'm going to attempt to get more specific information about the
>> IOException.
>>
>> diff --git a/test/lib/jdk/test/lib/apps/LingeredApp.java
>> b/test/lib/jdk/test/lib/apps/LingeredApp.java
>> --- a/test/lib/jdk/test/lib/apps/LingeredApp.java
>> +++ b/test/lib/jdk/test/lib/apps/LingeredApp.java
>> @@ -504,6 +504,9 @@
>>           } catch (NoSuchFileException ex) {
>>               // Lock deleted while we are setting last modified time.
>>               // Ignore error and lets the app exits
>> +        } catch (IOException ioe) {
>> +            ioe.printStackTrace();
>> +            System.exit(3);
>>           } catch (Exception ex) {
>>               System.err.println("LingeredApp ERROR: " + ex);
>>               // Leave exit_code = 1 to Java launcher
>>
>> Since the error is being detected as the test is terminating,
>> I think it would be possible to simply replace the NoSuchFileException,
>> and consider an IOException as the trigger for the clean exit sequence.
>>
>> Anyone have experience with this corner of the swamp?
>>



More information about the serviceability-dev mailing list