Hi Ashish,
Thanks for the prompt reply.
Below is a typical track trace I'm getting. You'll notice it has
nothing to do with Mina, as my clients do not use it yet.
java.lang.NegativeArraySizeException
at
org.jppf.comm.socket.AbstractSocketWrapper.receiveBytes(AbstractSocketWrapper.java:195)
at
org.jppf.server.node.JPPFContainer.deserializeObjects(JPPFContainer.java:127)
at org.jppf.server.node.NodeIO.deserializeObjects(NodeIO.java:167)
at org.jppf.server.node.NodeIO.readObjects(NodeIO.java:120)
at org.jppf.server.node.NodeIO.readTask(NodeIO.java:90)
at org.jppf.server.node.JPPFNode.perform(JPPFNode.java:179)
at org.jppf.server.node.JPPFNode.run(JPPFNode.java:136)
at org.jppf.node.NodeRunner.main(NodeRunner.java:114)
2010-01-03 10:23:16,227
[ERROR][org.jppf.server.node.JPPFContainer.call(261)]: invalid type
code: 20 [object index: 0]
java.io.StreamCorruptedException: invalid type code: 20
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1356)
at java.io.ObjectInputStream.readArray(ObjectInputStream.java:1667)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1323)
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.HashMap.readObject(HashMap.java:1030)
at sun.reflect.GeneratedMethodAccessor4.invoke(Unknown Source)
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
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
org.jppf.utils.ObjectSerializerImpl.deserialize(ObjectSerializerImpl.java:123)
at
org.jppf.utils.ObjectSerializerImpl.deserialize(ObjectSerializerImpl.java:95)
at
org.jppf.server.node.JPPFContainer$ObjectReadTask.call(JPPFContainer.java:257)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at
java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:619)
The IoFilter code can be found at:
http://jppf-project.cvs.sourceforge.net/viewvc/jppf-project/server/src/java/org/jppf/server/mina/nodeserver/NodeIoFilter.java?revision=1.1&view=markup
The IoHandler:
http://jppf-project.cvs.sourceforge.net/viewvc/jppf-project/server/src/java/org/jppf/server/mina/nodeserver/NodeIoHandler.java?revision=1.1&view=markup
The code that creates and starts the IoProcessor:
http://jppf-project.cvs.sourceforge.net/viewvc/jppf-project/server/src/java/org/jppf/server/mina/nodeserver/MinaNodeServer.java?revision=1.1&view=markup
Let me know if you need more information.
Sincerely,
-Laurent
On 03/01/2010 11:09, Ashish wrote:
Can we get the exception trace?. Also, is it possible to share your
custom IoFilter?
thanks
ashish
On Sun, Jan 3, 2010 at 3:58 AM, Laurent
Cohen<[email protected]> wrote:
Hello,
I've just started with Mina and am facing a problem I've been stuck
with for
days.
Environment:
- Mina 2.0.0 RC1
- Sun JDK 1.5 / 1.6 / 1.6 x64
- Windows Vista x64
I'm currently trying to switch an open source grid computing project
(http://www.jppf.org), of which I am a developer, to Mina's
communication
framework, as I believe it would be easier to maintain and extend,
and I'm
very excited by the built-in SSL and in-JVM communication
capabilities.
The architecture of the project is of type master / worker where
the master
acts as the Mina server, and the worker nodes as the clients.
Currently, I am at a point where the communication between server
and client
is working, but only with a single client/node. As soon as I have
more than
one client, exceptions are thrown on the clients' side on write
operations.
Each message exchanged between server and client is made of a set of
serialized Java objects, with a header for each object which is a
4-bytes
integer that indicates the length of the serialized block of data.
The first
serialized object (i.e. message header) tells how many objects are
in the
message.
Basically each message is as follows: [ length1, data1, ... ,
lengthN, dataN
] where lengthX is the length of block dataX, which is a serialized
object
graph.
From the tracing and debugging I've done, the first object is
always read
and deserialized properly, and it is always on the second object
that the
exceptions occur. The exceptions are of types
StreamCorruptedException,
NegativeArraySizeException, OutOfMemoryError, apparently due to the
fact
that the block length is not read or written properly.
On the server side, serialization/deserialization occurs only for
the first
(header) object of the message. The other objects are actually
handled as
arrays of bytes, but not necessarily in memory: some or all of them
may be
stored in temporary files, depending on the remaining available
memory in
the server's JVM. The goal is to allow the server to work with data
structures that are much larger than the JVM heap. This is why I
implemented
a custom IoFilter, rather than for instance a codec like
CumulativeProtocolDecoder, as I do not want the entire message to
be in
memory (only the header object, which is relatively small, has to be).
Sorry for the lengthy explanation, I hope it is clear enough. I am
puzzled
as to why this is working with a single client, but not with 2 or
more.
Would you have any idea as to where I can look, and as to what I
could have
missed, overlooked, or done wrong?
Please let me know if you need more information or code snippets.
Sincerely,
-Laurent