Hi,

I'm using JLDAP to access an OpenLDAP server and query for
information. There are situations (intermittent) where the hasMore()
method of an LDAPSearchResults object returned via
LDAPConnection::search() (synchronous search) seems to be hanging with
teh following stack trace:

        Thread [http-8453-Processor2] (Suspended)
                Object.wait(long) line: not available [native method]
                MessageVector(Object).wait() line: 429 [local variables 
unavailable]
                MessageAgent.getLDAPMessage(Integer) line: not available
                LDAPSearchQueue(LDAPMessageQueue).getResponse(Integer) line: 
not available
                LDAPSearchQueue(LDAPMessageQueue).getResponse() line: not 
available
                LDAPSearchResults.getBatchOfResults() line: not available
                LDAPSearchResults.resetVectors() line: not available
                LDAPSearchResults.hasMore() line: not available [local 
variables unavailable]

I also see a stack dump alongside this that might be related to it at
the network level:

        Thread [http-8454-Processor4] (Suspended)
                PlainSocketImpl.socketAccept(SocketImpl) line: not available 
[native method]
                PlainSocketImpl.accept(SocketImpl) line: 353
                SSLServerSocketImpl(ServerSocket).implAccept(Socket) line: 448
                SSLServerSocketImpl.accept() line: not available
                
JSSE14SocketFactory(JSSESocketFactory).acceptSocket(ServerSocket) line: 110
                PoolTcpEndpoint.acceptSocket() line: 368
                TcpWorkerThread.runIt(Object[]) line: 549
                ThreadPool$ControlRunnable.run() line: 683
                ThreadWithAttributes(Thread).run() line: 534

Has anyone had any experience with this hang problem? I'm not using
SSL for now, but I plan to eventually switch to using SSL.

Here is the code I'm using to invoke the search (it's a pretty simple
search). I obtain a connection instance by cloning a "master"
connection. After I've iterated through all the results, I close the
cloned connection. According to the Javadoc for this, the call to
close() on the cloned connection should not affect the master
connection in any way.

       // Here I initialize the master connection:
       ...
            this.masterConnection.connect(host, port);
            this.masterConnection.bind(LDAPConnection.LDAP_V3,
this.loginDN, passwd);
       ...

      // Here I search by cloning the master connection:
        ...
        ...
        LDAPConnection connection = this.masterConnection.clone();
        LDAPSearchResults results = connection.search(this.baseDN,
ldapScope, searchStr, requestedAttributes, false);
        try {
            while (results.hasMore()) {  <<<<<< THIS IS WHERE THE
HANG/DEADLOCK OCCURS
                LDAPEntry nativeEntry = results.next();
                LDAPAttribute idAttr =
nativeEntry.getAttribute(this.staticIdAttribute);
        ...
        ...
        } finally {
            // Always release the connection:
            
this.adapter.getConnectionPoolManager().releaseConnection(connection);
        }

Any help will be greatly appreciated. Is this problem also applicable
when using SSL to connect to the OpenLDAP server?

Thanks,
Safdar

Reply via email to