Hi Philippe,

This is a good use of StackWalker.   getSource can simply return
StackFrame and avoid the creation of String[].

Stuart will give you better guidance related to RMI testing.

I see that test/jdk/sun/rmi/runtime/Log has a few RMI logging tests.
RMI tests are in tier3.  You can run jdk_rmi test group to verify
this patch.

I notice that pre-1.4 RMI logging support.  I wonder if this is
time to remove it.

Mandy

On 8/22/19 7:21 AM, Philippe Marschall wrote:
Hello

First time contributor here.

We have exception tracing enabled in production and see thousands of
exceptions in sun.rmi.runtime.Log#getSource() to get the caller class.
In my option this should use StackWalker introduced in Java 9. I could
find no corresponding bug in JBS.

I created a and uploaded webrev here [1] and also added the patch inline
below. As for the implementation I created a custom StackWalker to be
able to pass in the estimated number of frames that we traverse. For
variable naming conventions I tried to stick with other StackWalker
users I could find in the JDK. The stream formatting tries to follow the
LVTI style guidelines.

I have not written a test as the method is private. I ran the tier1
tests and they passed.

I have signed the OCA.

What are the next steps?


--- old/src/java.rmi/share/classes/sun/rmi/runtime/Log.java 2019-08-21
14:16:47.381544386 +0200
+++ new/src/java.rmi/share/classes/sun/rmi/runtime/Log.java 2019-08-21
14:16:47.249545585 +0200
@@ -30,6 +30,7 @@
 import java.io.OutputStream;
 import java.rmi.server.LogStream;
 import java.security.PrivilegedAction;
+import java.util.Set;
 import java.util.logging.Handler;
 import java.util.logging.SimpleFormatter;
 import java.util.logging.Level;
@@ -62,6 +63,8 @@
     public static final Level BRIEF = Level.FINE;
     public static final Level VERBOSE = Level.FINER;

+    private static final StackWalker WALKER =
StackWalker.getInstance(Set.of(), 4);
+
     /* selects log implementation */
     private static final LogFactory logFactory;
     static {
@@ -444,10 +447,10 @@
      * Obtain class and method names of code calling a log method.
      */
     private static String[] getSource() {
-        StackTraceElement[] trace = (new Exception()).getStackTrace();
-        return new String[] {
-            trace[3].getClassName(),
-            trace[3].getMethodName()
-        };
+        return WALKER.walk(s -> s
+                                 .skip(3)
+                                 .map(f -> new String[]
{f.getClassName(), f.getMethodName()})
+                                 .findFirst()
+                                 .get());
     }
 }

 [1]
https://github.com/marschall/webrevs/raw/master/Log-getSource/webrev.zip

Cheers
Philippe Marschall


Reply via email to