[ 
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

Reply via email to