-
Bug
-
Resolution: Obsolete
-
Minor
-
None
-
5.2.5.Final, 5.3.0.Final
-
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
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.<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) ... 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
- relates to
-
ISPN-3535 ConfigurationBuilder.withProperties adds empty address when SERVER_LIST not defined
- Resolved