Return-Path: X-Original-To: archive-asf-public-internal@cust-asf2.ponee.io Delivered-To: archive-asf-public-internal@cust-asf2.ponee.io Received: from cust-asf.ponee.io (cust-asf.ponee.io [163.172.22.183]) by cust-asf2.ponee.io (Postfix) with ESMTP id 1C948200C73 for ; Wed, 26 Apr 2017 00:30:11 +0200 (CEST) Received: by cust-asf.ponee.io (Postfix) id 1B66C160BB8; Tue, 25 Apr 2017 22:30:11 +0000 (UTC) Delivered-To: archive-asf-public@cust-asf.ponee.io Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by cust-asf.ponee.io (Postfix) with SMTP id 4230A160BB6 for ; Wed, 26 Apr 2017 00:30:10 +0200 (CEST) Received: (qmail 32474 invoked by uid 500); 25 Apr 2017 22:30:09 -0000 Mailing-List: contact dev-help@zookeeper.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@zookeeper.apache.org Delivered-To: mailing list dev@zookeeper.apache.org Received: (qmail 32304 invoked by uid 99); 25 Apr 2017 22:30:08 -0000 Received: from pnap-us-west-generic-nat.apache.org (HELO spamd3-us-west.apache.org) (209.188.14.142) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 25 Apr 2017 22:30:08 +0000 Received: from localhost (localhost [127.0.0.1]) by spamd3-us-west.apache.org (ASF Mail Server at spamd3-us-west.apache.org) with ESMTP id 7FEA4188C3F for ; Tue, 25 Apr 2017 22:30:08 +0000 (UTC) X-Virus-Scanned: Debian amavisd-new at spamd3-us-west.apache.org X-Spam-Flag: NO X-Spam-Score: -99.201 X-Spam-Level: X-Spam-Status: No, score=-99.201 tagged_above=-999 required=6.31 tests=[KAM_ASCII_DIVIDERS=0.8, RP_MATCHES_RCVD=-0.001, SPF_PASS=-0.001, URIBL_BLOCKED=0.001, USER_IN_WHITELIST=-100] autolearn=disabled Received: from mx1-lw-us.apache.org ([10.40.0.8]) by localhost (spamd3-us-west.apache.org [10.40.0.10]) (amavisd-new, port 10024) with ESMTP id ugzwwaZyGp_Z for ; Tue, 25 Apr 2017 22:30:07 +0000 (UTC) Received: from mailrelay1-us-west.apache.org (mailrelay1-us-west.apache.org [209.188.14.139]) by mx1-lw-us.apache.org (ASF Mail Server at mx1-lw-us.apache.org) with ESMTP id 324BD5FCB9 for ; Tue, 25 Apr 2017 22:30:06 +0000 (UTC) Received: from jira-lw-us.apache.org (unknown [207.244.88.139]) by mailrelay1-us-west.apache.org (ASF Mail Server at mailrelay1-us-west.apache.org) with ESMTP id 290A9E0C0D for ; Tue, 25 Apr 2017 22:30:05 +0000 (UTC) Received: from jira-lw-us.apache.org (localhost [127.0.0.1]) by jira-lw-us.apache.org (ASF Mail Server at jira-lw-us.apache.org) with ESMTP id 78D7521DC7 for ; Tue, 25 Apr 2017 22:30:04 +0000 (UTC) Date: Tue, 25 Apr 2017 22:30:04 +0000 (UTC) From: "ASF GitHub Bot (JIRA)" To: dev@zookeeper.apache.org Message-ID: In-Reply-To: References: Subject: [jira] [Commented] (ZOOKEEPER-2755) Allow to subclass ClientCnxnSocketNetty and NettyServerCnxn in order to use Netty Local transport MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-JIRA-FingerPrint: 30527f35849b9dde25b450d4833f0394 archived-at: Tue, 25 Apr 2017 22:30:11 -0000 [ 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)