hbase-issues mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Qiang Tian (JIRA)" <j...@apache.org>
Subject [jira] [Commented] (HBASE-12359) MulticastPublisher should specify IPv4/v6 protocol family when creating multicast channel
Date Sat, 15 Nov 2014 05:45:34 GMT

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

Qiang Tian commented on HBASE-12359:
------------------------------------

Hi Stack,
that is strange. the jekins run and local run were both fine. My local run against the latest
master branch on linux VM is also fine..
from the openjdk code(suppose similar with oracle jdk code), we hit below null:

{code}
  151        * Returns any IPv4 address of the given network interface, or
  152        * null if the interface does not have any IPv4 addresses.
  153        */
  154       static Inet4Address anyInet4Address(final NetworkInterface interf) {
  155           return AccessController.doPrivileged(new PrivilegedAction<Inet4Address>()
{
  156               public Inet4Address run() {
  157                   Enumeration<InetAddress> addrs = interf.getInetAddresses();
  158                   while (addrs.hasMoreElements()) {
  159                       InetAddress addr = addrs.nextElement();
  160                       if (addr instanceof Inet4Address) {
  161                           return (Inet4Address)addr;
  162                       }
  163                   }
  164                   return null;                  // <====here

{code}

and

{code}
  752       /**
  753        * Joins channel's socket to the given group/interface and
  754        * optional source address.
  755        */
  756       private MembershipKey innerJoin(InetAddress group,
  757                                       NetworkInterface interf,
  758                                       InetAddress source)
...
  826                   Inet4Address target = Net.anyInet4Address(interf);
  827                   if (target == null)
  828                       throw new IOException("Network interface not configured for IPv4");
{code}

the interf comes from below MulticastPublisher code:

{code}
    public void connect(Configuration conf) throws IOException {
      NetworkInterface ni = NetworkInterface.getByInetAddress(Addressing.getIpAddress());

{code}

but I do not change it... Where did you run it? which os?
thanks.



> MulticastPublisher should specify IPv4/v6 protocol family when creating multicast channel
> -----------------------------------------------------------------------------------------
>
>                 Key: HBASE-12359
>                 URL: https://issues.apache.org/jira/browse/HBASE-12359
>             Project: HBase
>          Issue Type: Bug
>          Components: master
>    Affects Versions: 2.0.0
>            Reporter: Qiang Tian
>            Assignee: Qiang Tian
>            Priority: Minor
>         Attachments: hbase-12359-master.patch
>
>
> see http://osdir.com/ml/general/2014-10/msg56689.html
> {code}
> 014-10-28 12:21:47,337 ERROR [main] hbase.MiniHBaseCluster(230): Error starting cluster
> java.lang.RuntimeException: Failed construction of Master: class org.apache.hadoop.hbase.master.HMaster
>        at org.apache.hadoop.hbase.util.JVMClusterUtil.createMasterThread(JVMClusterUtil.java:145)
>        at org.apache.hadoop.hbase.LocalHBaseCluster.addMaster(LocalHBaseCluster.java:215)
>        at org.apache.hadoop.hbase.LocalHBaseCluster.<init>(LocalHBaseCluster.java:153)
>        at org.apache.hadoop.hbase.MiniHBaseCluster.init(MiniHBaseCluster.java:215)
>        at org.apache.hadoop.hbase.MiniHBaseCluster.<init>(MiniHBaseCluster.java:94)
>        at org.apache.hadoop.hbase.HBaseTestingUtility.startMiniHBaseCluster(HBaseTestingUtility.java:914)
>        at org.apache.hadoop.hbase.HBaseTestingUtility.startMiniCluster(HBaseTestingUtility.java:877)
>        at org.apache.hadoop.hbase.HBaseTestingUtility.startMiniCluster(HBaseTestingUtility.java:794)
>        at org.apache.hadoop.hbase.HBaseTestingUtility.startMiniCluster(HBaseTestingUtility.java:765)
>        at org.apache.hadoop.hbase.HBaseTestingUtility.startMiniCluster(HBaseTestingUtility.java:752)
>        at org.apache.hadoop.hbase.client.TestHCM.setUpBeforeClass(TestHCM.java:138)
>        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
>        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
>        at java.lang.reflect.Method.invoke(Method.java:601)
>        at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47)
>        at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
>        at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44)
>        at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:24)
>        at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)
>        at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
>        at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
>        at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
>        at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
>        at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
>        at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
>        at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
> Caused by: java.lang.IllegalArgumentException: IPv6 socket cannot join IPv4 multicast
group
>        at sun.nio.ch.DatagramChannelImpl.innerJoin(DatagramChannelImpl.java:779)
>        at sun.nio.ch.DatagramChannelImpl.join(DatagramChannelImpl.java:865)
>        at io.netty.channel.socket.nio.NioDatagramChannel.joinGroup(NioDatagramChannel.java:394)
>        at org.apache.hadoop.hbase.master.ClusterStatusPublisher$MulticastPublisher.connect(ClusterStatusPublisher.java:273)
>        at org.apache.hadoop.hbase.master.ClusterStatusPublisher.<init>(ClusterStatusPublisher.java:121)
>        at org.apache.hadoop.hbase.master.HMaster.<init>(HMaster.java:307)
>        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
>        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
>        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
>        at java.lang.reflect.Constructor.newInstance(Constructor.java:525)
>        at org.apache.hadoop.hbase.util.JVMClusterUtil.createMasterThread(JVMClusterUtil.java:142)
>        ... 26 more
> {code}
> the exception comes from below JDK code:
> {code}
>  765           if (group instanceof Inet4Address) {
>  766               if (family == StandardProtocolFamily.INET6 && !Net.canIPv6SocketJoinIPv4Group())
>  767                   throw new IllegalArgumentException("IPv6 socket cannot join IPv4
multicast group");
> {code}
> according to document(http://docs.oracle.com/javase/7/docs/api/java/nio/channels/MulticastChannel.html)
> {quote}
> The multicast implementation is intended to map directly to the native multicasting facility.
Consequently, the following items should be considered when developing an application that
receives IP multicast datagrams:
>     The creation of the channel should specify the ProtocolFamily that corresponds to
the address type of the multicast groups that the channel will join. There is no guarantee
that a channel to a socket in one protocol family can join and receive multicast datagrams
when the address of the multicast group corresponds to another protocol family. For example,
it is implementation specific if a channel to an IPv6 socket can join an IPv4 multicast group
and receive multicast datagrams sent to the group. 
> {quote}
> if not specifying family, the ProtocolFamily of the channel's socket is platform (and
possibly configuration) dependent and therefore unspecified
> the publisher code:
> {code}
>     @Override
>     public void connect(Configuration conf) throws IOException {
> ...
>       Bootstrap b = new Bootstrap();
>       b.group(group)
>           .channel(NioDatagramChannel.class)
>           .option(ChannelOption.SO_REUSEADDR, true)
>           .handler(new ClusterStatusEncoder(isa));
> {code}
> looks should use this netty constructor
> {code}
>     public NioDatagramChannel(InternetProtocolFamily ipFamily) {
>         this(newSocket(DEFAULT_SELECTOR_PROVIDER, ipFamily));
>     }
> {code}



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Mime
View raw message