Opened 3 years ago

#306 new defect

stx:libjava: JavaClassReloaderTests >> test_concurrency_01 often fails on heavily loaded systems

Reported by: jan vrany Owned by:
Priority: major Milestone:
Component: default Keywords:
Cc: Also affects CVS HEAD (eXept version): no

Description

...due to unknown reasons. So far two cases were identified:

1. No class associated with given java.lang.Class**

Here the problem is that wrong native impl is called from native method:

JavaNativeMethodImpl_OpenJDK7 class(JavaNativeMethodImpl_OpenJDK6 class) >> _java_lang_Object_getClass: [7]
receiver: JavaNativeMethodImpl_OpenJDK7
selector: #'_java_lang_Object_getClass:'
args:
     1 this        : public java.lang.String java.lang.String.substring(int)
vars: 
     1 class       : nil
inst: 
     1 superclass  : JavaNativeMethodImpl_OpenJDK6
     2 flags       : 0
     3 methodDictionary: MethodDictionary()
     4 lookupObject: nil
     5 instSize    : 0
     6 instvars    : nil
     7 name        : #'JavaNativeMethodImpl_OpenJDK7'
     8 category    : #'Languages-Java-Support-Java 7'
     9 classvars   : nil
    10 comment     : nil
    11 subclasses  : Class::ArrayWithSequenceNumberValidation(JavaNativeMethodImpl_OpenJDK8 JavaNativeMethodImpl_OracleJDK7)
    12 classFilename: '/var/lib/jenkins/workspace/stx/stx_jv/x86_64-pc-linux-gnu/build/stx/libjava/JavaNativeMethodImpl_OpenJDK7.st'
    13 package     : #'stx:libjava'
    14 revision    : '$Changeset: 3e1e2a1e6971f2e214570a12dac648684b13d6d8 $ SHA1=dc04a01bad37d5374e642398c5ed8f63314ecfd5 SCM=HG'
    15 environment : Smalltalk
    16 signature   : nil
    17 attributes  : #(nil nil nil JavaVMData)

source: 
     1   _java_lang_Class_getConstantPool: this
     2   
     3       <javanative: 'java/lang/Class' name: 'getConstantPool()Lsun/reflect/ConstantPool;'>
     4   
     5           | class |
     6   
     7>>     class := Reflection classForJavaClassObject: this.
     8       class isJavaClass ifFalse:[
     9           ^nil
    10       ].
    11   
    12       ^ Reflection javaConstantPoolObjectFor:class constantPool.
    13   
    14       "Created: / 21-12-2010 / 20:00:02 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    15       "Modified: / 28-02-2011 / 18:05:13 / Marcel Hlopko <hlopik@gmail.com>"
    16       "Modified: / 31-07-2012 / 00:47:15 / Jan Vrany <jan.vrany@fit.cvut.cz>"

java.lang.reflect.Method(java.lang.Object) >> getClass () : Class [Object.java:in native code]
receiver: public java.lang.String java.lang.String.substring(int)
selector: #'getClass()Ljava/lang/Class;'
args: 
vars: 
inst: 
     1 _lockWord_  : 0
     2 override    : 0
     3 securityCheckCache: nil
     4 clazz       : java.lang.Class@5328896(java.lang.String)
     5 slot        : a JavaMethod(JAVA::java::lang::String.substring(I)Ljava/lang/String;)
     6 name        : "substring"
     7 returnType  : java.lang.Class@5328896(java.lang.String)
     8 parameterTypes: java/lang/Class[](java.lang.Class@5697536(int))
     9 exceptionTypes: java/lang/Class[]()
    10 modifiers   : 65537
    11 signature   : nil
    12 genericInfo : nil
    13 annotations : nil
    14 parameterAnnotations: nil
    15 annotationDefault: nil
    16 methodAccessor: nil
    17 root        : public java.lang.String java.lang.String.substring(int)
    18 declaredAnnotations: nil

source: 
     1>> /* source not available...
     2   
     3   decompiling JAVA::java::lang::Object>>getClass()Ljava/lang/Class;
     4   nA: 0 nV: 0 nT: 0
     5   
     6     1: 24 03                   pushGlobal 3 #'JavaVM:NativeMethodsImplementation'
     7     3: 0F                      pushSelf
     8     4: 16 00 02                send1 2 #'_java_lang_Object_getClass:' [0]
     9     7: 00                      retTop
    10   
    11   */

As you may see, getClass() native proxy method sends the correct selector, but the method executed is different. Interestingly enough, selector in wrong method context is correct one! Some hidden bug in method lookup?

2. null pointer exception in ReflectiveMethod

Caused by: java.lang.NullPointerException: null pointer
        at org.eclipse.jdt.internal.compiler.lookup.MethodVerifier.toString()Ljava/lang/String;(MethodVerifier.java:971)
        at stx.libjava.tools.environment.ReflectiveField.getGenericSignature()[C(ReflectiveField.java:93)

If you look at ReflectiveField.java:93, there's no call to toString():

Method m = field.getClass().getDeclaredMethod("getGenericSignature");

Again, wrong method returned from a lookup?


STEPS TO REPRODUCE:

(on jenkins-debian) run make test in stx:libjava in parallel 4-5 times (on 4-core system)


Ideas of what to do:

  1. Check memory on affected system
  2. Compile lookup with -fsanitize-undefined and try again
  3. Add dtrace probes to lookup and try again

Change History (0)

Note: See TracTickets for help on using tickets.