[Date Prev][Date Next] [Chronological] [Thread] [Top]

Re: Intermittent hang/deadlock when iterating through LDAP search results using JLDAP



Yes, both JLDAP and OpenLDAP are supprted on the list, I just wanted to see if the issue was with just one server or many.  Instead of cloning the master, I believe there is a pool implementation that comes with JLDAP in com.novell.ldap.connectionpool.  Is this in a multithreaded environment?

Marc

On 9/8/05, Safdar Kureishy <safdar.kureishy@gmail.com> wrote:
Just so you know, I'm using different threads to run queries using cloned connections from the same "master" connection...

So when this problem occurs, all those threads seem to pile up one on top of the other and remain blocked on the same call (as shown in the call stack).

Thanks,
Safdar

On 9/8/05, Safdar Kureishy < safdar.kureishy@gmail.com> wrote:
Hi Marc,

I've only seen this happen with OpenLDAP so far. I am also accessing Active Directory using JLDAP (for different information) but I hven't seen this problem occur there.

I posted to this newsgroup since JLDAP is supposed to come under its domain ...

Have you seen this problem as well?

Thanks,
Safdar


On 9/8/05, Marc Boorshtein < mboorshtein@gmail.com> wrote:
Does this happen with any other ldap server?

Marc


On 9/8/05, Safdar Kureishy < safdar.kureishy@gmail.com> wrote:
Hi,

I'm using JLDAP to access an OpenLDAP server and query for information.
There are situations (intermittent) where search result iteration returned
via
LDAPConnection::search() (synchronous search) ends up in a deadlock/hang of
some sort.

Here are some strack traces:
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(LDAPMessageQue ue).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

Another similar stack trace is:
Thread [http-8444-Processor15] (Suspended)
Object.wait(long) line: not available [native method] [local variables
unavailable]
MessageVector(Object).wait() line: 429
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
OpenLDAPQueryImpl.execute() line: 153

Is anyone familiar with the solution/workaround to this problem? I'm not
using
SSL for now, but I plan to eventually switch to using SSL as well.

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.

Thanks,
Safdar