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

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



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
> > 
> > 
> > 
>