Vitalii Chepeliuk created ISPN-3224:
---------------------------------------
Summary: 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
Key: ISPN-3224
URL:
https://issues.jboss.org/browse/ISPN-3224
Project: Infinispan
Issue Type: Bug
Components: Remote protocols
Affects Versions: 5.2.4.Final
Reporter: Vitalii Chepeliuk
Assignee: Galder ZamarreƱo
Priority: Critical
########################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.<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
--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see:
http://www.atlassian.com/software/jira