[Logo] Terracotta Discussion Forums (LEGACY READ-ONLY ARCHIVE)
  [Search] Search   [Recent Topics] Recent Topics   [Members]  Member Listing   [Groups] Back to home page 
[Register] Register / 
[Login] Login 
[Expert]
Problem with deserialization of clustered objects  XML
Forum Index -> Terracotta for Spring
Author Message
cziesman

neo

Joined: 11/22/2010 16:57:51
Messages: 2
Offline

Hi,

This is my very first post here.

I am working on a JEE application that runs in a Glassfish 2.1.1 cluster. We use Terracotta DSO in the web tier to cluster state between the Glassfish instances. We have several services that provide access to various parts of the clustered state. The services are exposed to remote clients via Spring HTTP proxies.

When a proxied service is called, the service executes properly, but the returned data fails to be unmarshalled by the client. We see stack traces similar to the following:

Code:
org.springframework.remoting.RemoteAccessException: Could not access HTTP invoker remote service at [http://127.0.0.1/mmpl/Secure/TaskService]; nested exception is java.io.EOFException
 at org.springframework.remoting.httpinvoker.HttpInvokerClientInterceptor.convertHttpInvokerAccessException(HttpInvokerClientInterceptor.java:211)
 at org.springframework.remoting.httpinvoker.HttpInvokerClientInterceptor.invoke(HttpInvokerClientInterceptor.java:144)
 at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
 at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
 at $Proxy3.getLatestTask(Unknown Source)
 at com.rsc.eas.test.TemporalOppFilterTest.testFilterOppBeDuringAndNotDuring(TemporalOppFilterTest.java:166)
 at junit.extensions.TestDecorator.basicRun(TestDecorator.java:24)
 at junit.extensions.TestSetup$1.protect(TestSetup.java:21)
 at junit.extensions.TestSetup.run(TestSetup.java:25)
 Caused by: java.io.EOFException
 at java.io.DataInputStream.readInt(DataInputStream.java:375)
 at java.io.ObjectInputStream$BlockDataInputStream.readInt(ObjectInputStream.java:2776)
 at java.io.ObjectInputStream.readInt(ObjectInputStream.java:950)
 at java.util.ArrayList.readObject(ArrayList.java:588)
 at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:974)
 at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1849)
 at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1753)
 at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329)
 at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1947)
 at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1871)
 at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1753)
 at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329)
 at java.io.ObjectInputStream.readObject(ObjectInputStream.java:351)
 at java.util.ArrayList.readObject(ArrayList.java:593)
 at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:974)
 at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1849)
 at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1753)
 at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329)
 at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1947)
 at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1871)
 at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1753)
 at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329)
 at java.io.ObjectInputStream.readObject(ObjectInputStream.java:351)
 at java.util.ArrayList.readObject(ArrayList.java:593)
 at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:974)
 at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1849)
 at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1753)
 at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329)
 at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1947)
 at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1871)
 at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1753)
 at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329)
 at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1947)
 at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1871)
 at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1753)
 at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329)
 at java.io.ObjectInputStream.readObject(ObjectInputStream.java:351)
 at org.springframework.remoting.httpinvoker.AbstractHttpInvokerRequestExecutor.doReadRemoteInvocationResult(AbstractHttpInvokerRequestExecutor.java:291)
 at org.springframework.remoting.httpinvoker.AbstractHttpInvokerRequestExecutor.readRemoteInvocationResult(AbstractHttpInvokerRequestExecutor.java:242)
 at org.springframework.remoting.httpinvoker.SimpleHttpInvokerRequestExecutor.doExecuteRequest(SimpleHttpInvokerRequestExecutor.java:68)
 at org.springframework.remoting.httpinvoker.AbstractHttpInvokerRequestExecutor.executeRequest(AbstractHttpInvokerRequestExecutor.java:136)
 at org.springframework.remoting.httpinvoker.HttpInvokerClientInterceptor.executeRequest(HttpInvokerClientInterceptor.java:191)
 at org.springframework.remoting.httpinvoker.HttpInvokerClientInterceptor.executeRequest(HttpInvokerClientInterceptor.java:173)
 at org.springframework.remoting.httpinvoker.HttpInvokerClientInterceptor.invoke(HttpInvokerClientInterceptor.java:141)


My suspicion is that the deserialization is failing due to the fact that the DTO being returned contains a tiny bit of Terracotta bytecode instrumentation, and therefore the class no longer matches the class that the client code was expecting.

Is this a reasonable diagnosis? If so, what do I need to do to make these classes distributable?

Thanks!
teck

seraphim
[Avatar]
Joined: 05/24/2006 15:03:25
Messages: 1128
Offline

well something is wrong with that serialization stream, no doubt about that.

It wouldn't come as a surprise that DSO (and its class instrumentation) could be tickling a problem here, but I'm not aware of a known problem here.

From the stack trace it is in the middle of deserializing an ArrayList and ran out of data trying to read the list size.

All this said I don't have a great idea on how to debug further. It would be useful to do some A/B testing where the only variable is whether DSO is enabled or not. Keeping everything else constant can you make the problem appear and come back with adding/removing DSO.

If you can produce a runnable test case for this problem I'd be happy to debug it

Tim Eck (terracotta engineer)
cziesman

neo

Joined: 11/22/2010 16:57:51
Messages: 2
Offline

It turns out that the problematic class is a subclass of ArrayList, and that there are some known problems relating to serialization of subclasses of ArrayList. I refactored the class to implement java.util.List and to use an instance variable for its ArrayList, and my problems went away. Terracotta was just an innocent bystander.

Thanks for the response!
 
Forum Index -> Terracotta for Spring
Go to:   
Powered by JForum 2.1.7 © JForum Team