[ 
https://issues.apache.org/jira/browse/DIRMINA-885?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13204528#comment-13204528
 ] 

Emmanuel Lecharny edited comment on DIRMINA-885 at 9/5/14 11:08 AM:
--------------------------------------------------------------------

It seems that a new implementation of IoProcessor involves a lot of work, so 
I'd decided to find another way...
I've re-read the code many a time, and confirmed that one of the reason for the 
issue is that the IoHandler.messageReceived() is invoked in the thread created 
in ExecutorFilter. Since it is executed in parallel (i.e. asynchronously) with 
the threads running AbstractPollingIoProcessor.Processor.run(), which basically 
performs channel read, message received event firing(kicking off 
IoHandler.messageReceived() ), flush, session-removal sequentially, 
IoHandler.messageReceived() can be performed before or after the 
session-removal.
My instinct is to make them run synchronously...which will definitely cause 
severe performance penalty. The number of request that can be simultaneously 
processed is limited to the number of IoProcessor.
So I ended up with this:
{code}
acceptor = new NioSocketAcceptor( new 
SimpleIoProcessorPool<NioSession>(NioProcessor.class, processorCount) );
{code}
The original issue is resolved, but it comes with worrying performance 
drop-down.
I deliberately coded a Thread.sleep(7000) in messageReceived(), and I set 
processorCount = 4, here's a brief load test result:
concurrent requests sent: 4
result: all replies received in 7 sec                                        

concurrent requests sent: 5
result: 3 replies received around 7 sec, 2 replies received around 14
question: Aren't 4 of 5 requests supposed to be processed concurrently?

concurrent requests sent: 8
result: all replies received in 14 sec

This is my newest progress I've made up to now...it seems that this is the 
mediocre solution I have to make do with for now.
Thanks for your help, Emma. If you have any progress, just let me know. Much 
appreciated! 



was (Author: carusyte):
It seems that a new implementation of IoProcessor involves a lot of work, so 
I'd decided to find another way...
I've re-read the code many a time, and confirmed that one of the reason for the 
issue is that the IoHandler.messageReceived() is invoked in the thread created 
in ExecutorFilter. Since it is executed in parallel (i.e. asynchronously) with 
the threads running AbstractPollingIoProcessor.Processor.run(), which basically 
performs channel read, message received event firing(kicking off 
IoHandler.messageReceived() ), flush, session-removal sequentially, 
IoHandler.messageReceived() can be performed before or after the 
session-removal.
My instinct is to make them run synchronously...which will definitely cause 
severe performance penalty. The number of request that can be simultaneously 
processed is limited to the number of IoProcessor.
So I ended up with this:
acceptor = new NioSocketAcceptor( new 
SimpleIoProcessorPool<NioSession>(NioProcessor.class, processorCount) );
The original issue is resolved, but it comes with worrying performance 
drop-down.
I deliberately coded a Thread.sleep(7000) in messageReceived(), and I set 
processorCount = 4, here's a brief load test result:
concurrent requests sent: 4
result: all replies received in 7 sec                                        

concurrent requests sent: 5
result: 3 replies received around 7 sec, 2 replies received around 14
question: Aren't 4 of 5 requests supposed to be processed concurrently?

concurrent requests sent: 8
result: all replies received in 14 sec

This is my newest progress I've made up to now...it seems that this is the 
mediocre solution I have to make do with for now.
Thanks for your help, Emma. If you have any progress, just let me know. Much 
appreciated! 


> session is closed before the server writes back to the client
> -------------------------------------------------------------
>
>                 Key: DIRMINA-885
>                 URL: https://issues.apache.org/jira/browse/DIRMINA-885
>             Project: MINA
>          Issue Type: Bug
>          Components: Core
>    Affects Versions: 2.0.2
>         Environment: win XP, jdk 1.6.0_23
>            Reporter: Carusyte
>            Priority: Minor
>
> I am using some kind of test tool as client to send arbitrary data, my 
> decoder and handler work correctly as expected, but MINA closes the session 
> before my encoder is called. As I looked into the source code, 
> AbstractPollingIoProcessor seems to schedule a session remove as long as the 
> # of bytes read from the channel == -1 (line 673 and line 706). As per the 
> documentation of java.nio.channels.ReadableByteChannel.read(ByteBuffer dst), 
> this method returns -1 if the channel has reached end-of-stream, but is it 
> really necessary to close the session even before the client receive any 
> response? 



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to