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