Hi guys,
I created a nice RMI alternative based on MINA 2.0 RC1 called "SIMON".
(http://dev.root1.de/projects/show/simon).
This works fine so far and is already used in some bigger tests. Now I
wanted to create a massive multithreaded test:
With "SIMON" words: One Client-Application that simulates 60 Clients
(---> 60 threads). Each "client" sends several messages to the server
until it terminates.
In "MINA" words: I have one client->server connection, 60 worker threads
on client side that send and receive several messages until they
terminate, and I make use of my own ProtocolCodecFactory.
The problem now is:
I can do the above test with 10 threads. No problem. If I increase the
number of threads that send and receive messages through the
protocolcodec, I sooner or later get the following exception (everytime
the same stack):
-----
2009-12-02 21:16:11,786 [FINEST ] t_id=63
de.root1.simon.Dispatcher.exceptionCaught -> exception Caught.
session=0x00000003
cause=org.apache.mina.filter.codec.ProtocolDecoderException:
java.nio.BufferUnderflowException (Hexdump: 01 00 00 00 26 00 00 00 01
00 20 64 65 2E 72 6F 6F 74 31 2E 73 69 6D 6F 6E 2E 74 65 73 74 2E 52 65
6D 6F 74 65 4F 62 6A 65 63 74 00 03 7B 23 7D 01 00 00 00 25 00 00 00 01
00 20 64 65 2E 72 6F 6F 74 31 2E 73 69 6D 6F 6E 2E 74 65 73 74 2E 52 65
6D 6F 74 65 4F 62 6A 65 63 74 00 03 7B 23 7D 01 00 00 00 24 00 00 00 01
00 20 64 65 2E 72 6F 6F 74 31 2E 73 69 6D 6F 6E 2E 74 65 73 74 2E 52) stack=
org.apache.mina.filter.codec.ProtocolCodecFilter.messageReceived(ProtocolCodecFilter.java:235)
org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextMessageReceived(DefaultIoFilterChain.java:434)
org.apache.mina.core.filterchain.DefaultIoFilterChain.access$1200(DefaultIoFilterChain.java:46)
org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl$1.messageReceived(DefaultIoFilterChain.java:793)
org.apache.mina.filter.logging.LoggingFilter.messageReceived(LoggingFilter.java:176)
org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextMessageReceived(DefaultIoFilterChain.java:434)
org.apache.mina.core.filterchain.DefaultIoFilterChain.access$1200(DefaultIoFilterChain.java:46)
org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl$1.messageReceived(DefaultIoFilterChain.java:793)
org.apache.mina.core.filterchain.IoFilterAdapter.messageReceived(IoFilterAdapter.java:119)
org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextMessageReceived(DefaultIoFilterChain.java:434)
org.apache.mina.core.filterchain.DefaultIoFilterChain.fireMessageReceived(DefaultIoFilterChain.java:426)
org.apache.mina.core.polling.AbstractPollingIoProcessor.read(AbstractPollingIoProcessor.java:638)
org.apache.mina.core.polling.AbstractPollingIoProcessor.process(AbstractPollingIoProcessor.java:598)
org.apache.mina.core.polling.AbstractPollingIoProcessor.process(AbstractPollingIoProcessor.java:587)
org.apache.mina.core.polling.AbstractPollingIoProcessor.access$400(AbstractPollingIoProcessor.java:61)
org.apache.mina.core.polling.AbstractPollingIoProcessor$Processor.run(AbstractPollingIoProcessor.java:969)
org.apache.mina.util.NamePreservingRunnable.run(NamePreservingRunnable.java:64)
java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
java.lang.Thread.run(Thread.java:619)
-----
(The "Dispatcher" class is an instance of IoHandler)
I've no idea what causes this bufferunderflow. And i've no idea how to
track down the root of this issue (the stack does only show mina classes
..).
So my question is:
If I use a ProtocolCodecFactory and get into trouble with
bufferunderflow somewhere in the mina code: Is it possible that MINA has
a problem? Or is it only my code?
As the constellation is quite "complex" it's not easy to provide a
reproducer-sample.... So how can I proceed analyzing this issue to find
the root-cause?
best regards,
Alex