[prev in list] [next in list] [prev in thread] [next in thread] 

List:       mina-dev
Subject:    [jira] Commented: (DIRMINA-653) IoSession.write not thread-safe?
From:       "Florian Weigand (JIRA)" <jira () apache ! org>
Date:       2010-01-29 19:00:34
Message-ID: 811232612.134841264791634660.JavaMail.jira () brutus ! apache ! org
[Download RAW message or body]


    [ 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.


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic