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

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



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