Remove exception from sun.rmi.runtime.Log#getSource()

Mandy Chung mandy.chung at oracle.com
Thu Aug 22 17:56:19 UTC 2019


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
>



More information about the core-libs-dev mailing list