[
https://issues.apache.org/jira/browse/DIRAPI-140?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13662913#comment-13662913
]
Emmanuel Lecharny commented on DIRAPI-140:
------------------------------------------
Ok, I have a better understanding on what's going on.
On the server, when we process a searchRequest, we loop on the created cursor
until we have no more elements to return. This is done by the
SearchRequestHandler.writeResults() method :
while ( ( count < sizeLimit ) && cursor.next() )
{
...
If, for any reason, the abandonRequest is received and processed at the very
same time, what will happen is that the cursor will be closed. We do check this
condition :
public boolean next() throws LdapException, CursorException, IOException
{
checkNotClosed( "next()" );
...
public final void checkNotClosed( String operation ) throws
CursorClosedException
{
monitor.checkNotClosed();
}
and
public void checkNotClosed() throws CursorClosedException
{
// lack of synchronization may cause pass but eventually it will work
if ( closed )
{
throw new CursorClosedException( cause.getMessage() );
}
}
So basically, we get an exception instead of something easier to handle.
It's not happening very often, but still, with 1000 loop, it's almost
guaranteed to happen.
As a side effect, we generate an exception which has no cause, which leads to a
NPE later in the SearchRequestHandler.handleException() method :
public void handleException( LdapSession session, ResultResponseRequest
req, Exception e )
{
LdapResult result = req.getResultResponse().getLdapResult();
/*
* Set the result code or guess the best option.
*/
ResultCodeEnum code;
if ( e instanceof CursorClosedException )
{
e = ( Exception ) ( ( CursorClosedException ) e ).getCause();
<<<-------------- Bad ! We should not overwrite the exception parameter here...
}
Here, e becomes null and it shows in the trace because of :
String msg = code.toString() + ": failed for " + req + ": " +
e.getLocalizedMessage(); <<<--- NPE
In any case, we should not throw an exception when the cursor is simply closed
because of an abandon request, we should instead return false to a call to
cursor.next().
There is a bit of work to fix that, but it's not really complicated.
> Test ClientSearchRequestTest.testSubDn() fails
> ----------------------------------------------
>
> Key: DIRAPI-140
> URL: https://issues.apache.org/jira/browse/DIRAPI-140
> Project: Directory Client API
> Issue Type: Bug
> Environment: Apache Maven 3.0.5
> (rNON-CANONICAL_2013-02-25_10-23_root; 2013-02-25 11:23:59+0100)
> Java version: 1.6.0_45, vendor: Sun Microsystems Inc.
> Default locale: en_US, platform encoding: UTF-8
> OS name: "linux", version: "3.9.2-1-arch", arch: "amd64", family: "unix"
> Reporter: Stefan Seelmann
>
> In trunk the test ClientSearchRequestTest.testSubDn (module ldap-client-test)
> fails quite often. When adding a for loop around the test code it fails after
> 1-10 executions. The first search works always, but the second search which
> uses the SearchRequest object sometimes doesn't contain a result and
> searchCursor.next() is false. Please note that I'm not sure if that is a pb
> in client or in the server.
--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira