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.