title: LDAP requests hanging for 15 seconds
body: <p>I have JBoss application server that is using LDAP for authentication. Lately we have noticed that there are a lot of slow requests (> 15 seconds).</p>
  
  <p>I did some threaddumps of the server and noticed that many threads where waiting on a lock: com.sun.jndi.ldap.LdapRequest@54ceac</p>
  
  <pre><code>java.lang.Object.wait(Native Method)
  com.sun.jndi.ldap.Connection.readReply(Connection.java:418)
  com.sun.jndi.ldap.LdapClient.ldapBind(LdapClient.java:340)
  com.sun.jndi.ldap.LdapClient.authenticate(LdapClient.java:192)
  com.sun.jndi.ldap.LdapCtx.connect(LdapCtx.java:2637)
  com.sun.jndi.ldap.LdapCtx.(LdapCtx.java:283)
  com.sun.jndi.ldap.LdapCtxFactory.getUsingURL(LdapCtxFactory.java:175)
  com.sun.jndi.ldap.LdapCtxFactory.getLdapCtxInstance(LdapCtxFactory.java:134)
  com.sun.jndi.url.ldap.ldapURLContextFactory.getObjectInstance(ldapURLContextFactory.java:35)
  javax.naming.spi.NamingManager.getURLObject(NamingManager.java:584)
  </code></pre>
  
  <p>All of the requests I have seen that have been waiting in this state have used more than 15 seconds to complete. We are monitoring the LDAP-server and all requests from the monitoring tool finish in less than 200 ms. This makes me think this is a problem with the com.sun.jndi.ldap code. Decompiling the com.sun.jndi.ldap.Connection class (jdk1.5.0_12) I see this:</p>
  
  <pre><code>BerDecoder readReply(LdapRequest ldaprequest) throws IOException, NamingException
  {
  _L2:
      BerDecoder berdecoder;
      if((berdecoder = ldaprequest.getReplyBer()) != null)
      break; /* Loop/switch isn't completed */
      try
      {
  label0:
      {
          synchronized(this)
          {
          if(sock == null)
              throw new ServiceUnavailableException((new StringBuilder()).append(host).append(":").append(port).append("; socket closed").toString());
          }
          synchronized(ldaprequest)
          {
          berdecoder = ldaprequest.getReplyBer();
          if(berdecoder == null)
          {
              ldaprequest.wait(15000L);
              break label0;
          }
          }
          break; /* Loop/switch isn't completed */
      }
      }
      ...
  </code></pre>
  
  <p>There is apparently a hardcoded timeout of 15000 milliseconds. </p>
  
  <p>Do anyone have any ideas for a fix/workaround?</p>