Hi, I have come across a problem when using the client API to interact with the 
server. When iterating through a cursor, the client hangs in the library code, 
consuming 100% of a CPU core. I am using a 64-bit Oracle JDK version 1.8.0_73, 
to run ApacheDS 2.0.0-M20 as the server. The same JDK is used to run my client 
application, which has the following maven dependency for interacting with the 
server:             <dependency>                
<groupId>org.apache.directory.server</groupId>                
<artifactId>apacheds-core-api</artifactId>                
<version>2.0.0-M20</version>            </dependency> Now, the piece of code 
that causes the problem is this:         EntryCursor allGroupsCursor = null;    
    try {            allGroupsCursor = 
ldapConn.search(GlobalContext.getLdapGroupsBaseDn(),                    
GlobalContext.getLdapGroupsFilter(), GlobalContext.getLdapGroupsScope());       
     for (Entry groupEntry : allGroupsCursor) {                String dn = 
groupEntry.getDn().getName();                Group group = 
loadGroupFromEntry(groupEntry);                model.allGroups.put(dn, group);  
          }        } finally {            if (allGroupsCursor != null)          
      allGroupsCursor.close();        } Here is the thread that executes this 
code: "RepeatingExecutorService Thread 1" #22 prio=5 os_prio=0 
tid=0x00000000239ab000 nid=0xea8 waiting on condition [0x00002ab39ec3f000]   
java.lang.Thread.State: TIMED_WAITING (parking)        at 
sun.misc.Unsafe.park(Native Method)        - parking to wait for  
<0x00000000866c1e88> (a 
java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)        
at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:215)       
 at 
java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2078)
        at 
java.util.concurrent.LinkedBlockingQueue.poll(LinkedBlockingQueue.java:467)     
   at 
org.apache.directory.ldap.client.api.future.ResponseFuture.get(ResponseFuture.java:130)
        at 
org.apache.directory.ldap.client.api.future.SearchFuture.get(SearchFuture.java:69)
        at 
org.apache.directory.ldap.client.api.SearchCursorImpl.next(SearchCursorImpl.java:119)
        at 
org.apache.directory.ldap.client.api.EntryCursorImpl.next(EntryCursorImpl.java:90)
        at 
org.apache.directory.api.ldap.model.cursor.CursorIterator.next(CursorIterator.java:81)
        at com.playground.ModelService.loadAllGroups(ModelService.java:127) So 
my understanding is that the client thread is parked waiting for another “I/O 
worker” thread to fetch the next entry in the cursor. Looking at all the 
threads from my dump, it has to be this one: "NioProcessor-35" #95 prio=5 
os_prio=0 tid=0x0000000013536000 nid=0x2924 runnable [0x00002ab39fa09000]   
java.lang.Thread.State: RUNNABLE        at 
sun.security.ssl.SSLEngineImpl.unwrap(SSLEngineImpl.java:781)        - locked 
<0x00000000867943f0> (a java.lang.Object)        at 
javax.net.ssl.SSLEngine.unwrap(SSLEngine.java:624)        at 
org.apache.mina.filter.ssl.SslHandler.unwrap(SslHandler.java:743)        at 
org.apache.mina.filter.ssl.SslHandler.messageReceived(SslHandler.java:359)      
  at org.apache.mina.filter.ssl.SslFilter.messageReceived(SslFilter.java:489)   
     - locked <0x00000000867942f8> (a org.apache.mina.filter.ssl.SslHandler)    
    at 
org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextMessageReceived(DefaultIoFilterChain.java:542)
        at 
org.apache.mina.core.filterchain.DefaultIoFilterChain.access$1300(DefaultIoFilterChain.java:48)
        at 
org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl$1.messageReceived(DefaultIoFilterChain.java:943)
        at 
org.apache.mina.core.filterchain.IoFilterAdapter.messageReceived(IoFilterAdapter.java:109)
        at 
org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextMessageReceived(DefaultIoFilterChain.java:542)
        at 
org.apache.mina.core.filterchain.DefaultIoFilterChain.fireMessageReceived(DefaultIoFilterChain.java:535)
        at 
org.apache.mina.core.polling.AbstractPollingIoProcessor.read(AbstractPollingIoProcessor.java:718)
        at 
org.apache.mina.core.polling.AbstractPollingIoProcessor.process(AbstractPollingIoProcessor.java:672)
        at 
org.apache.mina.core.polling.AbstractPollingIoProcessor.process(AbstractPollingIoProcessor.java:661)
        at 
org.apache.mina.core.polling.AbstractPollingIoProcessor.access$600(AbstractPollingIoProcessor.java:68)
        at 
org.apache.mina.core.polling.AbstractPollingIoProcessor$Processor.run(AbstractPollingIoProcessor.java:1130)
        at 
org.apache.mina.util.NamePreservingRunnable.run(NamePreservingRunnable.java:64) 
       at 
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
       at 
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
       at java.lang.Thread.run(Thread.java:745) I’ve taken several stack dumps 
and this thread has been stuck there for hours. I’ve tried running “kill -3 
PID” in quick succession and the thread seems to allways be there, inside the 
JDK’s SSL unwrap method, but it does seem to spin fast and I once managed catch 
it when advancing to the next message: "NioProcessor-35" #95 prio=5 os_prio=0 
tid=0x0000000013536000 nid=0x2924 runnable [0x00002ab39fa09000]   
java.lang.Thread.State: RUNNABLE        at 
sun.security.ssl.SSLEngineImpl.unwrap(SSLEngineImpl.java:781)        - locked 
<0x00000000867943f0> (a java.lang.Object)        at 
javax.net.ssl.SSLEngine.unwrap(SSLEngine.java:624)        at 
org.apache.mina.filter.ssl.SslHandler.unwrap(SslHandler.java:743)        at 
org.apache.mina.filter.ssl.SslHandler.messageReceived(SslHandler.java:359)      
  at org.apache.mina.filter.ssl.SslFilter.messageReceived(SslFilter.java:489)   
     - locked <0x00000000867942f8> (a 
org.apache.mina.filter.ssl.SslHandler)--"NioProcessor-35" #95 prio=5 os_prio=0 
tid=0x0000000013536000 nid=0x2924 runnable [0x00002ab39fa09000]   
java.lang.Thread.State: RUNNABLE        at 
org.apache.mina.filter.ssl.SslHandler.unwrap(SslHandler.java:756)        at 
org.apache.mina.filter.ssl.SslHandler.messageReceived(SslHandler.java:359)      
  at org.apache.mina.filter.ssl.SslFilter.messageReceived(SslFilter.java:489)   
     - locked <0x00000000867942f8> (a org.apache.mina.filter.ssl.SslHandler)    
    at 
org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextMessageReceived(DefaultIoFilterChain.java:542)
        at 
org.apache.mina.core.filterchain.DefaultIoFilterChain.access$1300(DefaultIoFilterChain.java:48)
        at 
org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl$1.messageReceived(DefaultIoFilterChain.java:943)
 I seems to me like the MINA code may be caught in an endless loop, because the 
application is not running out of memory (if the server was actually sending an 
endless list of items, I’d expect that heap usage would grow until I get an 
OutOfMemory error). Furthermore, there is no indication that the server is 
actually sending out tons of data (server process is at 0% usage). Is there 
anything I can do to track down the source of this so that it may be fixed? Any 
debug logging I can enable (on the client or server or both) that may help shed 
some light on what’s happening?  

Reply via email to