here's some code that i think demonstrates the problem. with the
calls to filterChainBuilder.addFirst() to add the SslFilter &
FileRegionWriteFilter, MyHandler.messageSent() is never called
(slightly different from what i've seen in our actual code, but pretty
close).
let me know what else i can do to help track this down.
-adam
public class App {
private static class MyHandler extends IoHandlerAdapter {
private final IoBuffer ioBuffer = IoBuffer.wrap("test
string".getBytes());
private FileChannel fileChannel;
public MyHandler() {
try {
fileChannel = new
FileInputStream("tmpfile").getChannel();
} catch (FileNotFoundException e) {
e.printStackTrace();
System.exit(1);
}
}
@Override
public void messageReceived(IoSession session, Object message)
throws Exception {
session.write(ioBuffer);
session.write(new DefaultFileRegion(fileChannel));
}
@Override
public void messageSent(IoSession session, Object message) {
System.out.println();
System.out.println("messageSent" + message);
}
}
public static void main(String[] args) throws
NoSuchAlgorithmException, KeyManagementException, IOException {
SSLContext context = SSLContext.getInstance("TLS");
context.init(null, null, null);
NioSocketAcceptor ioAcceptor = new NioSocketAcceptor(4);
ioAcceptor.setReuseAddress(true);
ioAcceptor.setBacklog(2048);
ioAcceptor.getSessionConfig().setThroughputCalculationInterval(10);
ioAcceptor.setCloseOnDeactivation(false);
DefaultIoFilterChainBuilder filterChainBuilder = new
DefaultIoFilterChainBuilder();
filterChainBuilder.addFirst("sslFilter", new SslFilter(context));
filterChainBuilder.addFirst("fileRegionFilter", new
FileRegionWriteFilter());
ioAcceptor.setFilterChainBuilder(filterChainBuilder);
ioAcceptor.setHandler(new MyHandler());
ioAcceptor.bind(new InetSocketAddress(8080));
}
}
On Fri, Jul 31, 2009 at 8:39 AM, Adam Brown<[email protected]> wrote:
> On Thu, Jul 30, 2009 at 3:53 PM, Emmanuel Lecharny<[email protected]>
> wrote:
>> Adam Brown wrote:
>>>
>>> i'm currently using a FileRegionWriteFilter 'before' an SslFilter to
>>> breakup FileRegion objects into chunks that SslFilter can handle
>>> (since SslFilter doesn't handle them directly). however, this filter
>>> chain also has IoBuffers written to the same IoSession.
>>>
>>> the problem i'm seeing appears to be that the IoBuffer is not being
>>> sent by MINA (with messageSent() being sent back up the chain and
>>> IoHandler) before the first IoBuffer generated by the
>>> FileRegionWriteFilter is written. because of this ordering, my
>>> IoBuffer (not the ones created by FileRegionWriteFilter) is "lost" to
>>> the chain and never has messageSent() called on it. in addition to
>>> the messageSent() call made with the FileRegion, some of the IoBuffers
>>> generated by FileRegionWriteFilter "escape" and have messageSent()
>>> called on them, passing them up the filter chain (and ultimately to my
>>> IoHandler).
>>>
>>> so really, i've got two problems :-).
>>>
>>
>> Are you using an ExecutorFilter? If so, which kind of threadPool are you
>> using ?
>
> no, we are not using an ExecutorFilter on the filter chain. all of
> the write()s are occuring in the same thread, just different places in
> our code.
>
>>
>> Can you push a very simple piece of code demonstrating the problem so that
>> we can debu it and understand what's going on ?
>
> yeah, i'll try to put together a simple example that exercises this.
> i did a little debugging before posting to the list & the general flow
> of events is as follows:
>
> our code:
> ioSession.write(myIoBuffer);
> ...
> ioSession.write(fileRegion);
>
> yields in the filter chain:
>
> AbstractStreamWriteFilter.filterWrite(myIoBuffer);
> AbstractStreamWriteFilter.filterWrite(fileRegion);
> AbstractStreamWriteFilter.messageSent(myIoBuffer); -> gets "captured"
> by AbstractStreamWriteFilter
> AbstractStreamWriteFilter.messageSent(ioBufferForFileRegion); ->
> called a couple of times
> ...
> => nextFilter.messageSent(fileRegion);
> nextFilter.messageSent(ioBufferForFileRegion); -> called at least
> once, but this should have been "captured" by
> AbstractStreamWriteFilter
>
>>
>> Thanks !
>>
>> PS: MINA version, etc... That helps !
>
> right now, we're using 2.0.0-M3. we had switched to -M5 a while back,
> but there was a serious performance drop-off caused by -M5 (which we
> haven't had a chance to track down yet), so we reverted to -M3.
>
>>
>> --
>> --
>> cordialement, regards,
>> Emmanuel Lécharny
>> www.iktek.com
>> directory.apache.org
>>
>>
>>
>