Uploaded image for project: 'Infinispan'
  1. Infinispan
  2. ISPN-3224

RemoteCacheManager of HotRod client is not able connect to server because of wrong parsing IPv6 address for pure IPv6 machines and gets wrong address on dual stack machines

XMLWordPrintable

    • Icon: Bug Bug
    • Resolution: Obsolete
    • Icon: Minor Minor
    • None
    • 5.2.5.Final, 5.3.0.Final
    • Remote Protocols
    • None

      ########################Run hotrod client with pure IPv6#############################################
      Hotrod client fails when want connect to server, below is exception from pure IPv6 machines it doesn't really undedstand IPv6 address it should connect."Could not connect to server: /0.0.10.60:52" Here should
      be IPv6 address but it looks like some wrong IPv4 address it want to connect to and I use complicated address 2620:52:0:105f:0:0:ffff:32%2:11222 as host variable and it is not specified in /etc/hosts

      	 public RemoteCacheManager(String host, int port, boolean start, ClassLoader classLoader) {
      				config = new ConfigurationProperties(host + ":" + port); <<< host=2620:52:0:105f:0:0:ffff:32%2 and port=11222
      				this.classLoader = classLoader;
      				if (start) start();
      		 }
      

      then in start method

         @Override
         public void start() {
            // Workaround for JDK6 NPE: http://bugs.sun.com/view_bug.do?bug_id=6427854
            SysPropertyActions.setProperty("sun.nio.ch.bugLevel", "\"\"");
      
            forceReturnValueDefault = config.getForceReturnValues();
            codec = CodecFactory.getCodec(config.getProtocolVersion());
      
            String factory = config.getTransportFactory();
            transportFactory = (TransportFactory) getInstance(factory, classLoader);
      
            Collection<SocketAddress> servers = config.getServerList(); <<< we get list of servers but getServerList() method should be improved see below!
            
            transportFactory.start(codec, config, servers, topologyId, classLoader); <<< and pass to transportFactory
            if (marshaller == null) {
               String marshallerName = config.getMarshaller();
               setMarshaller((Marshaller) getInstance(marshallerName, classLoader));
            }
      
            if (asyncExecutorService == null) {
               String asyncExecutorClass = config.getAsyncExecutorFactory();
               ExecutorFactory executorFactory = (ExecutorFactory) getInstance(asyncExecutorClass, classLoader);
               asyncExecutorService = executorFactory.getExecutor(config.getProperties());
            }
      
            synchronized (cacheName2RemoteCache) {
               for (RemoteCacheHolder rcc : cacheName2RemoteCache.values()) {
                  startRemoteCache(rcc);
               }
            }
      
            // Print version to help figure client version run
            log.version(org.infinispan.Version.printVersion());
      
            started = true;
         }
      

      and "servers" variable contain the same IP address 2620:52:0:105f:0:0:ffff:32%2:11222

         public Collection<SocketAddress> getServerList() {
            Set<SocketAddress> addresses = new HashSet<SocketAddress>();
            String servers = props.getProperty(SERVER_LIST, "127.0.0.1:" + DEFAULT_HOTROD_PORT); <<< got 2620:52:0:105f:0:0:ffff:32%2:11222
            for (String server : servers.split(";")) {
               String[] components = server.trim().split(":"); <<< just only here the splitting it wrong, we devide address into 9 chunks
               String host = components[0]; <<< host name shoud be 1 chunk 2620
               int port = DEFAULT_HOTROD_PORT; 
               if (components.length > 1) port = Integer.parseInt(components[1]); <<< and port 52
               addresses.add(new InetSocketAddress(host, port)); <<< and again we pass wrong parameteres to this constructor with IntetSocketAddress(2620, 52)
            }
      
            if (addresses.isEmpty()) throw new IllegalStateException("No Hot Rod servers specified!");
      
            return addresses; << here we just get some strange IPv4 address as 0.0.10.60:52
         }
      

      and exception is the following

      Caused by: org.infinispan.client.hotrod.exceptions.TransportException:: Could not connect to server: /0.0.10.60:52
      	at org.infinispan.client.hotrod.impl.transport.tcp.TcpTransport.<init>(TcpTransport.java:88)
      	at org.infinispan.client.hotrod.impl.transport.tcp.TransportObjectFactory.makeObject(TransportObjectFactory.java:57)
      	at org.infinispan.client.hotrod.impl.transport.tcp.TransportObjectFactory.makeObject(TransportObjectFactory.java:38)
      	at org.apache.commons.pool.impl.GenericKeyedObjectPool.borrowObject(GenericKeyedObjectPool.java:1220)
      	at org.infinispan.client.hotrod.impl.transport.tcp.TcpTransportFactory.borrowTransportFromPool(TcpTransportFactory.java:271)
      

      ########################Other issue is when hotrod client connects in dual stack mode#################
      /etc/hosts file is---------------------------------------------------------
      127.0.0.1 myhost localhost.localdomain localhost
      ::1 myhost localhost6.localdomain6 localhost6
      ---------------------------------------------------------------------------
      Then is the same problem in ConfigurationProperties.java getServerList() method we add address to addresses <<<addresses.add(new InetSocketAddress(host, port));>>>
      so InetSocketAddress constructor is called

          public InetSocketAddress(String hostname, int port) {
              checkHost(hostname);
              InetAddress addr = null;
              String host = null;
              try {
                  addr = InetAddress.getByName(hostname); <<< we should get InetAddress with hostname 
              } catch(UnknownHostException e) {
                  host = hostname;
              }
              holder = new InetSocketAddressHolder(host, addr, checkPort(
          }
      

      but we have 2! different inet addresses with the same hostname one is 127.0.0.1 and other ::1 and if i run it on IPv6 there should be ::1 and not 127.0.0.1!
      And
      public static InetAddress getByName(String host)
      throws UnknownHostException

      { return InetAddress.getAllByName(host)[0]; <<< but here we get only first address in array and got always 127.0.0.1 }

      and then other exception is thrown

      Caused by: org.infinispan.client.hotrod.exceptions.TransportException:: Could not connect to server: vchepQA/127.0.0.1:11222
          at org.infinispan.client.hotrod.impl.transport.tcp.TcpTransport.&lt;init&gt;(TcpTransport.java:88)
          at org.infinispan.client.hotrod.impl.transport.tcp.TransportObjectFactory.makeObject(TransportObjectFactory.java:57)
          at org.infinispan.client.hotrod.impl.transport.tcp.TransportObjectFactory.makeObject(TransportObjectFactory.java:38)
          at org.apache.commons.pool.impl.GenericKeyedObjectPool.borrowObject(GenericKeyedObjectPool.java:1220)
          at org.infinispan.client.hotrod.impl.transport.tcp.TcpTransportFactory.borrowTransportFromPool(TcpTransportFactory.java:271)
          ... 97 more
      

      and i forget to add trace log just download it here http://dropmefiles.com/en/H5wvu

      ##################################################INFINISPAN 5.3.0.FINAL#####################################################################
      org.infinispan.client.hotrod.configuration.ConfigurationBuilder has this method

         @Override
         public ConfigurationBuilder addServers(String servers) {
            for (String server : servers.split(";")) {
               String[] components = server.trim().split(":");
               String host = components[0];
               int port = ConfigurationProperties.DEFAULT_HOTROD_PORT;
               if (components.length > 1)
                  port = Integer.parseInt(components[1]);
               this.addServer().host(host).port(port);
            }
            return this;
         }
      

      And what if I put in <servers> argument something like addServers("[fe80::3e97:eff:fe19:3045]:11222;[fe80::3e97:eff:fe19:3046]:11322")? I think that It is not parsing correctly and we can use
      <servers> argument something like addServers("localhost6:11222; localhost6.localdomain6:11322") or other ipv6 hostnames.
      Because I want to use ip addresses and not hostnames and not to change /etc/hosts file only for mapping ipv6 address to some dummy hostname

            Unassigned Unassigned
            vchepeli_jira Vitalii Chepeliuk (Inactive)
            Votes:
            0 Vote for this issue
            Watchers:
            3 Start watching this issue

              Created:
              Updated:
              Resolved: