[ https://issues.apache.org/jira/browse/DIRSERVER-1161?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12587843#action_12587843 ]
Norval Hope commented on DIRSERVER-1161: ---------------------------------------- I should reiterate if it isn't clear - that the 1.0 and 1.5 patch attachments for this issue add some extra debug log output to two classes only, the software is vanilla 1.0 and 5.1. Here a dump of the stack when I stop at a breakpoint in SearchHandler as it does a session.write() on the first search result and I now see exactly why the problem occurs: ------------------------- UberjarMain [Java Application] org.apache.directory.server.UberjarMain at localhost:1066 Thread [SocketAcceptor-0] (Running) Thread [DestroyJavaVM] (Running) Thread [SynchWorkerThread] (Running) Thread [SocketAcceptorIoProcessor-0.0] (Running) Thread [pool-2-thread-1] (Running) Thread [pool-2-thread-2] (Running) Thread [pool-2-thread-3] (Running) Thread [pool-2-thread-4] (Suspended (breakpoint at line 393 in SearchHandler)) SearchHandler.messageReceived(IoSession, Object) line: 393 LdapProtocolProvider$LdapProtocolHandler(DemuxingIoHandler).messageReceived(IoSession, Object) line: 141 LdapProtocolProvider$LdapProtocolHandler.messageReceived(IoSession, Object) line: 428 AbstractIoFilterChain$TailFilter.messageReceived(IoFilter$NextFilter, IoSession, Object) line: 570 SocketFilterChain(AbstractIoFilterChain).callNextMessageReceived(IoFilterChain$Entry, IoSession, Object) line: 299 AbstractIoFilterChain.access$5(AbstractIoFilterChain, IoFilterChain$Entry, IoSession, Object) line: 296 AbstractIoFilterChain$EntryImpl$1.messageReceived(IoSession, Object) line: 648 SimpleProtocolDecoderOutput.flush() line: 58 ProtocolCodecFilter.messageReceived(IoFilter$NextFilter, IoSession, Object) line: 180 SocketFilterChain(AbstractIoFilterChain).callNextMessageReceived(IoFilterChain$Entry, IoSession, Object) line: 299 AbstractIoFilterChain.access$5(AbstractIoFilterChain, IoFilterChain$Entry, IoSession, Object) line: 296 AbstractIoFilterChain$EntryImpl$1.messageReceived(IoSession, Object) line: 648 ExecutorFilter.processEvent(IoFilter$NextFilter, IoSession, ExecutorFilter$EventType, Object) line: 228 ExecutorFilter$ProcessEventsRunnable.run() line: 280 ThreadPoolExecutor$Worker.runTask(Runnable) line: 650 ThreadPoolExecutor$Worker.run() line: 675 Thread.run() line: 595 C:\jdk1.5.0_11\bin\javaw.exe (11/04/2008 1:56:36 PM) ------------------------------ The problem is that SearchHandler is called via AbstractIoFilterChain$EntryImpl$1.messageReceived(IoSession, Object) line: 648 and after submitting the search to the underlying framework, it synchronously steps through all of the the results submitting session.write()s for each one. However, none of the queued events are flushed to the JNDI client until SearchHandler has completely drained the SearchResponseIterator over the results of the search and exited, at which point the stack unwinds back to ExecutorFilter$ProcessEventsRunnable.run() line: 280 which results in the outputting of a log message like this: 2008-04-11 14:49:06,984 3130859 [pool-2-thread-6] (org.apache.mina.filter.executor.ExecutorFilter$ProcessEventsRunnable:276) DEBUG - About to process event for /127.0.0.1:1090 size of queue is currently=1973 and then all the queued output SENT messages actually get flushed out to the JNDI client via this call: processEvent(event.getNextFilter(), buffer.session, event .getType(), event.getData()); So my immediate thought is to change SearchHandler so that it spawns a thread to take care of iterating through the search results asynchronously and then returns immediately. With some luck this will result in the desired streaming behaviour, but of course I don't know the relevant bits of the code well enough to know if this approach is too simplistic and will violate any implicit or explicit assumptions in the ApacheDS / MINA architecures. I'm going to try it out anyway ... > search results are not streamed to the client until final done response is > queued > --------------------------------------------------------------------------------- > > Key: DIRSERVER-1161 > URL: https://issues.apache.org/jira/browse/DIRSERVER-1161 > Project: Directory ApacheDS > Issue Type: Bug > Components: core > Affects Versions: 1.0 > Environment: JDK 1.5.0_11 > Reporter: Norval Hope > Attachments: apacheds_1.5.1_streaming.patch, > apacheds_1.5.1_streaming_log_output.txt, installers_1.5.1_streaming.patch, > mina_1.1.2_streaming.patch, pom.xml, streaming_log_output.txt, > streaming_logging.patch > > Original Estimate: 120h > Remaining Estimate: 120h > > Search results accumulate in Events on the SessionBuffer.eventQueue within > ExecutorFilter.fireEvent() until final done response for the search is > written to the session and then all results for the search (possibly millions > depending on the search and state of the directory) are written out at once. > This is a big problem for scalability and I gather from previous > correspondence with Alex that this behaviour is unexpected. -- This message is automatically generated by JIRA. - You can reply to this email to add a comment to the issue online.