Hi Chris,

On 01/24/2017 04:07 PM, Chris Hegarty wrote:
Peter,

On 2017-01-17 15:10, Peter Levart wrote:
Hi,

This is a preview of a patch that addresses the following issue:

    https://bugs.openjdk.java.net/browse/JDK-8029019
This very good work. I have not done a complete review, but what
jumps out at me is that you have removed some of the validation
code and checks from AnnotationInvocationHandler ( in one place
there is an assert and a comment that “good” data is expected.
AnnotationInvocationHandler has shown up in many interesting
places, I wonder if it is wise to remove these.

I don't know to what part of code you are referring. if it is the checks in the AnnotationInvocationHandler constructor then they have been moved to AnnotationType constructor. AnnotationParser always constructs/retrieves AnnotationType instance for the annotationClass object before it attempts to construct AnnotationInvocationHandler for such annotationClass, so annotationClass is pre-validated. AnnotationInvocationHandler is a package-private class and its constructor is only invoked from AnnotationParser.annotationForMap() public factory method. This method is invoked from 3 places currently:

AnnotationParser.parseAnnotation2() which pre-validates the annotationClass
AnnotationsInheritanceOrderRedefinitionTest which is passing only javac compiled (pre-validated) annotationClasses to it com.sun.tools.javac.model.AnnotationProxyMaker.generateAnnotation - this one is called from various other places so there's no guarantee that the annotationClass passed to it is validated.

So you have a point. I will include an unconditional call to AnnotationType.getInstance(annotationClass) in the AnnotationInvocationHandler constructor. This will only amount to an overhead of a volatile read when AnnotationType is already cached which it usually will be.

Regards, Peter


-Chris.

But it is also an attempt to clean-up failure reporting for invalid
annotation types. Here's the 1st webrev:

http://cr.openjdk.java.net/~plevart/jdk9-dev/8029019_Annotations.optimization/webrev.01/


With this patch applied, running the following benchmark:

http://cr.openjdk.java.net/~plevart/jdk9-dev/8029019_Annotations.optimization/AnnotationsBench.java


Produces the following results:

Original:

Benchmark                                 Mode  Cnt Score     Error  Units
AnnotationsBench.a1_PrimitiveMember       avgt   10 20.790 ±   1.317  ns/op
AnnotationsBench.a2_ObjectMember          avgt   10 21.550 ±   0.580  ns/op
AnnotationsBench.a3_PrimitiveArrayMember  avgt   10 28.314 ±   1.477  ns/op
AnnotationsBench.a4_ObjectArrayMember     avgt   10 27.094 ±   0.574  ns/op
AnnotationsBench.a5_AnnotationType        avgt   10 13.047 ±   0.983  ns/op
AnnotationsBench.a6_HashCode              avgt   10 158.001 ±   9.347
ns/op
AnnotationsBench.a7_Equals                avgt   10 663.921 ±  27.256
ns/op
AnnotationsBench.a8_ToString              avgt   10 1772.901 ± 107.355
ns/op

Patched:

Benchmark                                 Mode  Cnt Score    Error  Units
AnnotationsBench.a1_PrimitiveMember       avgt   10 8.547 ±  0.100  ns/op
AnnotationsBench.a2_ObjectMember          avgt   10 8.352 ±  0.340  ns/op
AnnotationsBench.a3_PrimitiveArrayMember  avgt   10 17.526 ±  0.696  ns/op
AnnotationsBench.a4_ObjectArrayMember     avgt   10 15.639 ±  0.116  ns/op
AnnotationsBench.a5_AnnotationType        avgt   10 4.692 ±  0.154  ns/op
AnnotationsBench.a6_HashCode              avgt   10 142.954 ±  7.460  ns/op
AnnotationsBench.a7_Equals                avgt   10 184.535 ±  0.917  ns/op
AnnotationsBench.a8_ToString              avgt   10 1806.685 ± 96.370
ns/op


Allocation rates are also reduced:

Original:

AnnotationsBench.a1_PrimitiveMember:·gc.alloc.rate.norm avgt   10
16.000 ±   0.001    B/op
AnnotationsBench.a2_ObjectMember:·gc.alloc.rate.norm avgt   10    16.000
±   0.001    B/op
AnnotationsBench.a3_PrimitiveArrayMember:·gc.alloc.rate.norm avgt
10    64.000 ±   0.001    B/op
AnnotationsBench.a4_ObjectArrayMember:·gc.alloc.rate.norm avgt   10
48.000 ±   0.001    B/op
AnnotationsBench.a5_AnnotationType:·gc.alloc.rate.norm avgt   10
16.000 ±   0.001    B/op
AnnotationsBench.a6_HashCode:·gc.alloc.rate.norm avgt   10   128.000 ±
0.001    B/op
AnnotationsBench.a7_Equals:·gc.alloc.rate.norm avgt   10   120.001 ±
0.001    B/op
AnnotationsBench.a8_ToString:·gc.alloc.rate.norm avgt   10  5200.002 ±
0.001    B/op

Patched:

AnnotationsBench.a1_PrimitiveMember:·gc.alloc.rate.norm avgt   10    ≈
10⁻⁵              B/op
AnnotationsBench.a2_ObjectMember:·gc.alloc.rate.norm avgt   10    ≈
10⁻⁵              B/op
AnnotationsBench.a3_PrimitiveArrayMember:·gc.alloc.rate.norm avgt
10    48.000 ±   0.001    B/op
AnnotationsBench.a4_ObjectArrayMember:·gc.alloc.rate.norm avgt   10
32.000 ±   0.001    B/op
AnnotationsBench.a5_AnnotationType:·gc.alloc.rate.norm avgt   10    ≈
10⁻⁵              B/op
AnnotationsBench.a6_HashCode:·gc.alloc.rate.norm avgt   10    64.000 ±
0.001    B/op
AnnotationsBench.a7_Equals:·gc.alloc.rate.norm avgt   10    24.000 ±
0.001    B/op
AnnotationsBench.a8_ToString:·gc.alloc.rate.norm avgt   10  5136.002 ±
0.001    B/op


As for the failure reporting: requesting an annotation for invalid
annotation type now always produces AnnotationFormatError. Previously,
some invalid annotations were simply skipped, some produced
AnnotationFormatError and for some of them, AnnotationFormatError was
raised only when evaluating Annotation's equals() method.

I would like to discuss this failure behavior more in-depth.

Regards, Peter


Reply via email to