You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@mina.apache.org by "Florian Weigand (JIRA)" <ji...@apache.org> on 2010/01/29 20:00:34 UTC
[jira] Commented: (DIRMINA-653) IoSession.write not thread-safe?
Loosing messages under heavy multi-threaded write on same session.
[ https://issues.apache.org/jira/browse/DIRMINA-653?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12806439#action_12806439 ]
Florian Weigand commented on DIRMINA-653:
-----------------------------------------
I am still able to reproduce this problem in RC1 everytime (sooner or later) in my application. I am using mina-core-2.0.0-RC1, mina-filter-compression-2.0.0-RC1 and jzlib-1.0.7.
I have added a CompressionFilter and after that my ProtocolCodecFilter(new MyCodecFactory()) to the Chain on both my client and server application.
I am calling IoSession.write() from at least 3 different threads concurrently in the client. One of the threads is named "pool-4-thread-1". the others are custom threads.
after a while the client throws some exception:
java.lang.ArrayIndexOutOfBoundsException: -1
at com.jcraft.jzlib.Deflate._tr_tally(Deflate.java:640)
at com.jcraft.jzlib.Deflate.deflate_slow(Deflate.java:1172)
at com.jcraft.jzlib.Deflate.deflate(Deflate.java:1567)
at com.jcraft.jzlib.ZStream.deflate(ZStream.java:133)
at org.apache.mina.filter.compression.Zlib.deflate(Zlib.java:192)
at org.apache.mina.filter.compression.CompressionFilter.doFilterWrite(CompressionFilter.java:187)
or this one:
java.io.IOException: Compression failed with return value : -5
at org.apache.mina.filter.compression.Zlib.deflate(Zlib.java:196)
this happens on occasion, but even if i dont see this or some similar exception on the client, i always see this exception on the server:
java.io.IOException: Unknown error. Error code : -3 and message : invalid stored block lengths
at org.apache.mina.filter.compression.Zlib.inflate(Zlib.java:153)
at org.apache.mina.filter.compression.CompressionFilter.messageReceived(CompressionFilter.java:156)
at org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextMessageReceived(DefaultIoFilterChain.java:434)
at org.apache.mina.core.filterchain.DefaultIoFilterChain.access$1200(DefaultIoFilterChain.java:46)
at org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl$1.messageReceived(DefaultIoFilterChain.java:793)
at org.apache.mina.core.filterchain.IoFilterAdapter.messageReceived(IoFilterAdapter.java:119)
at org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextMessageReceived(DefaultIoFilterChain.java:434)
at org.apache.mina.core.filterchain.DefaultIoFilterChain.fireMessageReceived(DefaultIoFilterChain.java:426)
at org.apache.mina.core.polling.AbstractPollingIoProcessor.read(AbstractPollingIoProcessor.java:638)
at org.apache.mina.core.polling.AbstractPollingIoProcessor.process(AbstractPollingIoProcessor.java:598)
at org.apache.mina.core.polling.AbstractPollingIoProcessor.process(AbstractPollingIoProcessor.java:587)
at org.apache.mina.core.polling.AbstractPollingIoProcessor.access$400(AbstractPollingIoProcessor.java:61)
at org.apache.mina.core.polling.AbstractPollingIoProcessor$Processor.run(AbstractPollingIoProcessor.java:969)
at org.apache.mina.util.NamePreservingRunnable.run(NamePreservingRunnable.java:64)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:650)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:675)
at java.lang.Thread.run(Thread.java:595)
i can delay or avoid the exception by using the debugger and break to only send one message at a time.
synchronizing the IoSession#write() on the client makes the problem disappear and everything works as expected, but at the cost of heavy performance loss.
looks to me like a single internal buffer to hold partial data concurrently overridden by different threads, which corrupts the buffer and hence the server fails to decompress the data.
i am using Java 1.5.0_16, running a localhost connection in two different JVMs.
please look into this again.
> IoSession.write not thread-safe? Loosing messages under heavy multi-threaded write on same session.
> ---------------------------------------------------------------------------------------------------
>
> Key: DIRMINA-653
> URL: https://issues.apache.org/jira/browse/DIRMINA-653
> Project: MINA
> Issue Type: Bug
> Components: Core, Filter
> Affects Versions: 2.0.0-M4
> Environment: Windows Vista 64-bit
> Reporter: Mauritz Lovgren
> Fix For: 2.0.0-M5
>
>
> I am writing a stress-test that tests multi-thread safetyness of our stateless encoder / decoder under heavy load and I am observing that messages are silently lost during session.write(Object), (the lost messages do not seem to reach the underlying socket buffer at all).
> I am using one encoder / decoder that is stateless. No executor filter, only the filter codec and a basic io handler.
> Synchronizing on the session.write makes the problem go away;
> synchronized (session)
> {
> future = session.write(message);
> }
> Do I really have to synchronize on the session to solve this issue?
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.