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:
- Check memory on affected system
- Compile lookup with
-fsanitize-undefined
and try again - Add dtrace probes to lookup and try again