Uploaded image for project: 'JBoss Enterprise Application Platform'
  1. JBoss Enterprise Application Platform
  2. JBEAP-10703

(7.1.z) EJB client sometimes gets stuck during initialization - race condition

XMLWordPrintable

    • Icon: Bug Bug
    • Resolution: Obsolete
    • Icon: Major Major
    • None
    • 7.1.0.DR17
    • EJB
    • None

      When I start multiple EJB client threads at once, they sometimes get stuck during initialization. Reproducing example:

      final static int THREADS = 25;
      (....)
      final ExecutorService pool = Executors.newFixedThreadPool(THREADS);
      for (int i = 0; i < THREADS; i++) {
            pool.submit(() -> {
                 try {
                     InitialContext ctx = new InitialContext(getCtxProperties());
                     String lookupName = "ejb:/server/HelloBean!ejb.HelloBeanRemote";
                     HelloBeanRemote bean = (HelloBeanRemote)ctx.lookup(lookupName);
                     System.out.println(bean.hello());
                     ctx.close();
                 } catch (Exception e) {
                     e.printStackTrace();
                 }
            });
      }
      
      public static Properties getCtxProperties() {
              Properties props = new Properties();
              props.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming");
              props.put("remote.connections", "main");
              props.put("remote.connection.main.host", "127.0.0.1");
              props.put("remote.connection.main.port", "8080");
              props.put("remote.connection.main.username", "joe");
              props.put("remote.connection.main.password", "joeIsAwesome2013!");
              return props;
      }
      

      So far I think it only affects scoped context. There seems to be some magic value, for THREADS=15 it works for me, but for THREADS=16 and more, all client threads get stuck during the EJB invocation with this stack:

      Thread 7094: (state = BLOCKED)
       - java.lang.Object.wait(long) @bci=0 (Interpreted frame)
       - java.lang.Object.wait() @bci=2, line=502 (Interpreted frame)
       - org.jboss.ejb.client.EJBClientInvocationContext.awaitResponse(org.jboss.ejb.client.EJBInvocationHandler) @bci=159, line=588 (Interpreted frame)
       - org.jboss.ejb.client.EJBInvocationHandler.lambda$invoke$0(org.jboss.ejb.client.EJBClientContext, java.lang.Object, java.lang.Object[], org.jboss.ejb.client.EJBProxyInformation$ProxyMethodInfo, java.lang.reflect.Method, org.jboss.ejb.client.EJBReceiver, org.jboss.ejb.client.EJBLocator, org.jboss.ejb.client.Affinity) @bci=162, line=180 (Interpreted frame)
       - org.jboss.ejb.client.EJBInvocationHandler$$Lambda$124.execute(org.jboss.ejb.client.EJBReceiver, org.jboss.ejb.client.EJBLocator, org.jboss.ejb.client.Affinity) @bci=27 (Interpreted frame)
       - org.jboss.ejb.client.EJBClientContext.performLocatedAction(org.jboss.ejb.client.EJBLocator, org.jboss.ejb.client.EJBClientContext$LocatedAction) @bci=135, line=707 (Interpreted frame)
       - org.jboss.ejb.client.EJBInvocationHandler.invoke(java.lang.Object, org.jboss.ejb.client.EJBProxyInformation$ProxyMethodInfo, java.lang.Object[]) @bci=360, line=162 (Interpreted frame)
       - org.jboss.ejb.client.EJBInvocationHandler.invoke(java.lang.Object, java.lang.reflect.Method, java.lang.Object[]) @bci=44, line=112 (Interpreted frame)
       - com.sun.proxy.$Proxy2.echo(java.lang.String) @bci=16 (Interpreted frame)                                                                                                                   
       - com.redhat.qe.ejbperf.ClientThreadStateless.run() @bci=320, line=83 (Interpreted frame)
      

      This is a regression in client from EAP 7.1.0.DR17, I don't see this with any previous build.

            istudens@redhat.com Ivo Studensky
            jmartisk@redhat.com Jan Martiska
            Votes:
            0 Vote for this issue
            Watchers:
            4 Start watching this issue

              Created:
              Updated:
              Resolved: