AFAIK this was needed in the initial implementation where we had issues in
building BAM data receiver in multiple addresses. I think we have solve
that issue now and hence we can now remove the findAddress().

Regards
Suho

On Wed, Sep 17, 2014 at 7:10 PM, Dunith Dhanushka <dun...@wso2.com> wrote:

> Hi folks,
>
> Currently we have a problem with binding BAM data receiver to local
> loopback address(localhost/127.0.0.1). In fact, databridge.receiver binds
> to localhost without any issues. Problem arises when the databridge.agent
> tries to connect to data receiver.
>
> Given below is the code used by data publishers to connect to the receiver
> (See
> org.wso2.carbon.databridge.agent.thrift.internal.pool.client.general.ClientPoolFactory
> )
>
> TTransport receiverTransport = null;
>             try {
>                 receiverTransport = new
> TSocket(HostAddressFinder.findAddress(hostNameAndPort[0]),
>
>  Integer.parseInt(hostNameAndPort[1]));
>             } catch (SocketException ignored) {
>                 //already checked
>             }
>
> Problem with this approach is HostAddressFinder.findAddress returns a
> different IP when hostNameAndPort[0] is set to "localhost". In other cases
> it would work fine.
>
> According to current HostAddressFinder.findAddress implementation, it
> eleminates "localhost" or 127.0.0.1 and returns an address of a another
> NIC. Since thrift receiver is not bound to that particular interface, an
> error will be thrown at the client side.
>
> public static String findAddress(String hostname) throws SocketException {
>         if (hostname.trim().equals("localhost") ||
> hostname.trim().equals("127.0.0.1") || hostname.trim().equals("::1")) {
>             Enumeration<NetworkInterface> ifaces =
>                     NetworkInterface.getNetworkInterfaces();
>             while (ifaces.hasMoreElements()) {
>                 NetworkInterface iface = ifaces.nextElement();
>                 Enumeration<InetAddress> addresses =
> iface.getInetAddresses();
>
>                 while (addresses.hasMoreElements()) {
>                     InetAddress addr = addresses.nextElement();
>                     if (addr instanceof Inet4Address &&
> !addr.isLoopbackAddress()) {
>                         return addr.getHostAddress();
>                     }
>                 }
>             }
>             return "127.0.0.1";
>         } else {
>             return hostname;
>         }
> }
>
>
> Why we purposely eliminate loopback address in the above method?
>
> There'll be a probelm when a server  got multiple network interfaces and
> customer wants to bind the receiver to loopback address. According to above
> implementation, that is impossible. As a solution, is it safe to remove
> this loopback address elimination and accept whatever the value passed as
> the hostName?
>
> Please mention your concerns.
>
> Regards,
>
> Dunith Dhanushka,
> Senior Software Engineer - BAM,
> WSO2 Inc,
>
> Mobile - +94 71 8615744
> Blog - dunithd.wordpress.com <http://blog.dunith.com>
> Twitter - @dunithd <http://twitter.com/dunithd>
>



-- 

*S. Suhothayan*
Technical Lead & Team Lead of WSO2 Complex Event Processor
 *WSO2 Inc. *http://wso2.com
* <http://wso2.com/>*
lean . enterprise . middleware


*cell: (+94) 779 756 757 | blog: http://suhothayan.blogspot.com/
<http://suhothayan.blogspot.com/>twitter: http://twitter.com/suhothayan
<http://twitter.com/suhothayan> | linked-in:
http://lk.linkedin.com/in/suhothayan <http://lk.linkedin.com/in/suhothayan>*
_______________________________________________
Dev mailing list
Dev@wso2.org
http://wso2.org/cgi-bin/mailman/listinfo/dev

Reply via email to