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

[GSS](8.0.z) REM3-419 - IntIndexHashMap tuning

XMLWordPrintable

    • False
    • None
    • False
    • Hide

      Restart the server to have the 'IntIndexHashMap' reinitialized freshly.

      Show
      Restart the server to have the 'IntIndexHashMap' reinitialized freshly.

      The Remoting class IntIndexHashMap is used in RemoteConnectionChannel to store the outbound messages leaving the channel endpoint and the inbound messages arriving at the channel endpoint.

          private final IntIndexMap<OutboundMessage> outboundMessages = new IntIndexHashMap<OutboundMessage>(OutboundMessage.INDEXER, Equaller.IDENTITY, 512, 0.5f);
          private final IntIndexMap<InboundMessage> inboundMessages = new IntIndexHashMap<InboundMessage>(InboundMessage.INDEXER, Equaller.IDENTITY, 512, 0.5f);
      

      For example, when an EJBClientChannel instance wants to send an invocation to an EJBServerChannel instance, it will call RemoteConnectionChannel.writeMessage() to create an OutboundMessage instance and write that instance into the outboundMessages map:

          public MessageOutputStream writeMessage() throws IOException {
              int tries = 50;
              IntIndexMap<OutboundMessage> outboundMessages = this.outboundMessages;
              openOutboundMessage();
              boolean ok = false;
              try {
                  final Random random = ThreadLocalRandom.current();
                  while (tries > 0) {
                      final int id = random.nextInt() & 0xfffe;
                      if (! outboundMessages.containsKey(id)) {
                          OutboundMessage message = new OutboundMessage((short) id, this, outboundWindow, maxOutboundMessageSize, messageAckTimeout);
                          OutboundMessage existing = outboundMessages.putIfAbsent(message);
                          if (existing == null) {
                              ok = true;
                              return message;
                          }
                      }
                      tries --;
                  }
                  throw log.channelBusy();
              } finally {
                  if (! ok) {
                      closeOutboundMessage();
                  }
              }
          }
      

      We are finding that, under certain circumstances, the limit of 50 on the attempts to write a OutboundMessage into the map are failing, resulting a ChannelBusyException, and so failed invocations of the EJB client.

      So the question arises: when using an IntIndexHashMap, how can it be tuned to avoid such errors?

              rhn-support-ivassile Ilia Vassilev
              rhn-support-jbaesner Joerg Baesner
              Votes:
              0 Vote for this issue
              Watchers:
              3 Start watching this issue

                Created:
                Updated:
                Resolved: