PQ68468: INTERMITTENT DE-SERIALIZATION FAILURE ON RETURNING INTERFACE | |||||||||||||||||||||||||||||||||||||||
![]() |
|||||||||||||||||||||||||||||||||||||||
![]() APAR status Closed as program error. Error description Customer uses VAJ 3.5.3. having a serious problem when calling a stateless session bean from multiple client threads. When some of them receive the result of the remote call, an exception CORBA.MARSHAL is thrown. The description is "Unable to read value from underlying bridge". The minor code is 0 and the completion status - No. . Our result class contains a member that is interface ( in the specified case the actual referenced object is a HashMap). Customer noticed that during deserialization of the result in method com.ibm.rmi.io.IIOPInputStream.inputClassFields (Object, Class, ObjectStreamField !,CodeBase) sometimes the Has calling objectValue = orbStream.read_value(type); in case 2 of the last switch(callType) of the method. The exception is thrown when a different choice is made and the HashMap is de-serialized calling objectValue = Utility.readAbstractAndNarrow(orbStream,type) in case 1 of the same switch. . The choice is made in the callosc.isAbstractInterface(). When the result is false( cust thinks this IS a correct result) the deserialization is successful. . Sometimes the result is true, the deserialization continues in the wrong path and some exception is thrown ((different in different tests - e.g. OutOfMemory). Later it is transformed into CORBA.MARSHAL.Local fix Problem summary **************************************************************** * USERS AFFECTED: All WebSphere Application Server users of * * multiple threaded EJB client applications * **************************************************************** * PROBLEM DESCRIPTION: Some of the threads, in a multiple * * thread EJB client, are failing with * * CORBA.Marshaling exceptions. * **************************************************************** * RECOMMENDATION: * **************************************************************** Some of the client threads running inside a multiple threaded EJB client application may experience org.omg.CORBA.MARSHAL: Unable to read value from underlying bridge exceptions. Example of exception stack: com.ibm.CORBA.iiop.ClientDelegate invoke(CORBA.Object, OutputStream) org.omg.CORBA.MARSHAL: Unable to read value from underlying bridge at com.ibm.rmi.iiop.CDRInputStream.read_value(CDRInputStream.javaProblem conclusion The problem is the interaction of the methods isAbstractInterface() and computeAbstract() in com.ibm.rmi.io.ObjectStreamClass. There is a race condition. The latter is synchronized, its only caller (the former method) is not. isAbstractInterface() acts as a control method optimizing the call to the compute method. This is done using a local variable to decide whether to do the computation which is set after the first invocation (to save doing the computation again). To resolve the problem, the synchronized block was moved to an outer scope to avoid the race condition. It is possible that a first thread enters the synchronized compute method and before it has set the result variable, another thread calls into the isAbstractInterface() which then, noticing the control variable is set it does not invoke the synchronized compute method but simply returns the result variable (which has not been set yet) The default for which is ' true'. i.e. there is a 50% likelihood that this is the correct result.Temporary fix Comments
APAR is sysrouted FROM one or more of the following: APAR is sysrouted TO one or more of the following: Modules/Macros
SRLS
|
Document Information |
Product categories: Software > Application Servers >
Distributed Application & Web Servers > WebSphere Application
Server > General
Operating system(s):
Software version: 400
Software edition:
Reference #: PQ68468
IBM Group: Software Group
Modified date: Dec 10, 2002
(C) Copyright IBM Corporation 2000, 2006. All Rights Reserved.