[ 
https://issues.apache.org/jira/browse/ZOOKEEPER-2755?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15983756#comment-15983756
 ] 

ASF GitHub Bot commented on ZOOKEEPER-2755:
-------------------------------------------

Github user afine commented on a diff in the pull request:

    https://github.com/apache/zookeeper/pull/227#discussion_r113311911
  
    --- Diff: src/java/main/org/apache/zookeeper/common/SocketAddressUtils.java 
---
    @@ -0,0 +1,97 @@
    +/* Licensed to the Apache Software Foundation (ASF) under one
    + * or more contributor license agreements.  See the NOTICE file
    + * distributed with this work for additional information
    + * regarding copyright ownership.  The ASF licenses this file
    + * to you under the Apache License, Version 2.0 (the
    + * "License"); you may not use this file except in compliance
    + * with the License.  You may obtain a copy of the License at
    + *
    + *     http://www.apache.org/licenses/LICENSE-2.0
    + *
    + * Unless required by applicable law or agreed to in writing, software
    + * distributed under the License is distributed on an "AS IS" BASIS,
    + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    + * See the License for the specific language governing permissions and
    + * limitations under the License.
    + */
    +package org.apache.zookeeper.common;
    +
    +import java.net.InetAddress;
    +import java.net.InetSocketAddress;
    +import java.net.SocketAddress;
    +import org.apache.zookeeper.KeeperException;
    +import org.apache.zookeeper.data.Id;
    +import org.jboss.netty.channel.local.LocalAddress;
    +
    +public class SocketAddressUtils {
    +
    +    public static InetAddress getInetAddress(SocketAddress socketAddress) {
    +        if (socketAddress instanceof InetSocketAddress) {
    +            return ((InetSocketAddress) socketAddress).getAddress();
    +        } else if (socketAddress instanceof LocalAddress) {
    +            return InetAddress.getLoopbackAddress();
    +        } else {
    +            throw new IllegalArgumentException("Unexpected address type " 
+ socketAddress.getClass().getName() + ": " + socketAddress.toString());
    +        }
    +    }
    +
    +    public static LocalAddress mapToLocalAddress(InetSocketAddress 
socketAddress) {
    +        if (socketAddress.getAddress().getHostAddress().equals("0.0.0.0")) 
{
    +            return new 
LocalAddress(InetAddress.getLoopbackAddress().getHostAddress() + ":" + 
socketAddress.getPort());
    +        } else {
    +            return new 
LocalAddress(socketAddress.getAddress().getHostAddress() + ":" + 
socketAddress.getPort());
    +        }
    +    }
    +
    +    public static int getPort(SocketAddress socketAddress) {
    +        if (socketAddress instanceof InetSocketAddress) {
    +            return ((InetSocketAddress) socketAddress).getPort();
    +        } else if (socketAddress instanceof LocalAddress) {
    +            LocalAddress local = (LocalAddress) socketAddress;
    +            String id = local.getId();
    +            try {
    +                int colon = id.lastIndexOf(':');
    +                return Integer.parseInt(id.substring(colon + 1));
    +            } catch (NumberFormatException | IndexOutOfBoundsException 
err) {
    +                throw new IllegalArgumentException("Unexpected local 
address " + id);
    +            }
    +        } else {
    +            throw new IllegalArgumentException("Unexpected address type " 
+ socketAddress.getClass().getName() + ": " + socketAddress.toString());
    +        }
    +    }
    +
    +    public static String getHostString(SocketAddress socketAddress) {
    +        if (socketAddress instanceof InetSocketAddress) {
    +            return ((InetSocketAddress) socketAddress).getHostString();
    +        } else if (socketAddress instanceof LocalAddress) {
    +            LocalAddress local = (LocalAddress) socketAddress;
    +            String id = local.getId();
    +            try {
    +                int colon = id.lastIndexOf(':');
    +                return id.substring(0, colon);
    +            } catch (IndexOutOfBoundsException err) {
    +                throw new IllegalArgumentException("Unexpected local 
address " + id);
    +            }
    +        } else {
    +            throw new IllegalArgumentException("Unexpected address type " 
+ socketAddress.getClass().getName() + ": " + socketAddress.toString());
    +        }
    +    }
    +
    +    public static String getHostAddress(SocketAddress socketAddress) {
    +
    +        if (socketAddress instanceof InetSocketAddress) {
    +            return ((InetSocketAddress) 
socketAddress).getAddress().getHostAddress();
    +        } else if (socketAddress instanceof LocalAddress) {
    +            LocalAddress local = (LocalAddress) socketAddress;
    --- End diff --
    
    this code seems to be shared with getHostString, is there a way that 
duplication can be reduced?


> Allow to subclass ClientCnxnSocketNetty and NettyServerCnxn in order to use 
> Netty Local transport
> -------------------------------------------------------------------------------------------------
>
>                 Key: ZOOKEEPER-2755
>                 URL: https://issues.apache.org/jira/browse/ZOOKEEPER-2755
>             Project: ZooKeeper
>          Issue Type: New Feature
>          Components: java client, server
>    Affects Versions: 3.5.2
>            Reporter: Enrico Olivelli
>
> ClientCnxnSocketNetty and NettyServerCnxn use explicitly InetSocketAddress 
> class to work with network addresses.
> We can do a little refactoring to use only SocketAddress and make it possible 
> to create subclasses of ClientCnxnSocketNetty and NettyServerCnxn which 
> leverage built-in Netty 'local' channels. 
> Such Netty local channels do not create real sockets and so allow a simple 
> ZooKeeper server + ZooKeeper client to be run on the same JVM without binding 
> to real TCP endpoints.
> Usecases:
> Ability to run concurrently on the same machine tests of projects which use 
> ZooKeeper (usually in unit tests the server and the client run inside the 
> same JVM) without dealing with random ports and in general using less network 
> resources
> Run simplified (standalone, all processes in the same JVM) versions of 
> applications which need a working ZooKeeper ensemble to run.
> Note:
> Embedding ZooKeeper server + client on the same JVM has many risks and in 
> general I think we should encourage users to do so, so I in this patch I will 
> not provide official implementations of ClientCnxnSocketNetty and 
> NettyServerCnxn. There will be implementations only inside the test packages, 
> in order to test that most of the features are working with custom socket 
> factories and in particular with the 'LocalAddress' specific subclass of 
> SocketAddress.
> Note:
> the 'Local' sockets feature will be available on Netty 4 too



--
This message was sent by Atlassian JIRA
(v6.3.15#6346)

Reply via email to