RFR : 8182672: Java 8u121 on Linux intermittently returns null for MAC address

Mark Sheppard mark.sheppard at oracle.com
Fri Jun 23 14:36:26 UTC 2017


a minor observation:
perhaps a slight modification to the test to allow adaptation to jdk8  
(the genesis of the reported problem)
replacing the NetworkInterface.networkInterfaces() with static method 
which encapsulates the Stream<NetworkInterface>
creation

     public static Stream<NetworkInterface> 
getNetworkInterfacesAsStream() throws Exception {
         //return NetworkInterface.networkInterfaces();

         return 
Collections.list(NetworkInterface.getNetworkInterfaces()).stream();
     }


     public static void main(String[] args) throws Exception {
         //List<NetworkInterface> toTest = 
NetworkInterface.networkInterfaces()
         List<NetworkInterface> toTest = getNetworkInterfacesAsStream()
                         .filter(hasHardwareAddress)
                         .collect(Collectors.toList());

nonetheless execution of the upgraded test produces neat  compact 
diagnostic output with
the exceptions displayed neatly - looks good

regards
Mark

On 23/06/2017 14:47, Seán Coffey wrote:
> Thanks all. There were a few shouts from Chris in the office when he 
> saw my Enumeration code ;)
>
> I'm running this through our test system again and will push if I get 
> green results.
>
> Regards,
> Sean.
>
> On 23/06/17 14:40, Langer, Christoph wrote:
>> Hi,
>>
>> looks like a great piece of modern concurrent Java coding :) Well 
>> done! +1
>>
>> Best regards
>> Christoph
>>
>>> -----Original Message-----
>>> From: Chris Hegarty [mailto:chris.hegarty at oracle.com]
>>> Sent: Freitag, 23. Juni 2017 15:28
>>> To: Seán Coffey <sean.coffey at oracle.com>; Langer, Christoph
>>> <christoph.langer at sap.com>
>>> Cc: net-dev <net-dev at openjdk.java.net>
>>> Subject: Re: RFR : 8182672: Java 8u121 on Linux intermittently 
>>> returns null for
>>> MAC address
>>>
>>>
>>>
>>> On 23/06/17 10:56, Seán Coffey wrote:
>>>> Thanks to Christoph, Vyom and Mark for the reviews.
>>>>
>>>> I've improved the testcase as per feedback. Hope this meets all 
>>>> requests :
>>>>
>>>> http://cr.openjdk.java.net/~coffeys/webrev.8182672.jdk10.v2/webrev/
>>> The change looks good.
>>>
>>> Sean and I did a live coding session and arrived at the following
>>> version of the test.
>>>
>>> -Chris.
>>>
>>> /*
>>>    * Copyright (c) 2017, Oracle and/or its affiliates. All rights 
>>> reserved.
>>>    * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
>>>    *
>>>    * This code is free software; you can redistribute it and/or 
>>> modify it
>>>    * under the terms of the GNU General Public License version 2 
>>> only, as
>>>    * published by the Free Software Foundation.
>>>    *
>>>    * This code is distributed in the hope that it will be useful, 
>>> but WITHOUT
>>>    * ANY WARRANTY; without even the implied warranty of
>>> MERCHANTABILITY or
>>>    * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
>>> License
>>>    * version 2 for more details (a copy is included in the LICENSE 
>>> file that
>>>    * accompanied this code).
>>>    *
>>>    * You should have received a copy of the GNU General Public License
>>> version
>>>    * 2 along with this work; if not, write to the Free Software 
>>> Foundation,
>>>    * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
>>>    *
>>>    * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 
>>> 94065
>>> USA
>>>    * or visit www.oracle.com if you need additional information or 
>>> have any
>>>    * questions.
>>>    */
>>>
>>> /*
>>>    * @test
>>>    * @bug 8182672
>>>    * @summary Java 8u121 on Linux intermittently returns null for MAC
>>> address
>>>    */
>>>
>>> import java.net.NetworkInterface;
>>> import java.util.ArrayList;
>>> import java.util.List;
>>> import java.util.concurrent.Callable;
>>> import java.util.concurrent.ExecutorService;
>>> import java.util.concurrent.Executors;
>>> import java.util.concurrent.Future;
>>> import java.util.concurrent.Phaser;
>>> import java.util.function.Predicate;
>>> import java.util.stream.Collectors;
>>>
>>> public class GetMacAddress implements Callable<Exception> {
>>>       static final int NUM_THREADS = 5;
>>>       static final int NUM_ITERS = 100;
>>>       static volatile boolean failed; // false
>>>
>>>       final String threadName;
>>>       final NetworkInterface ni;
>>>       final Phaser startingGate;
>>>
>>>       public GetMacAddress(NetworkInterface ni, String name, Phaser 
>>> phaser) {
>>>           this.ni = ni;
>>>           this.threadName = name;
>>>           this.startingGate = phaser;
>>>       }
>>>
>>>       @Override
>>>       public Exception call() {
>>>           int count = 0;
>>>           startingGate.arriveAndAwaitAdvance();
>>>           try {
>>>               for (int i = 0; i < NUM_ITERS; i++) {
>>>                   ni.getMTU();
>>>                   byte[] addr = ni.getHardwareAddress();
>>>                   if (addr == null) {
>>>                       System.out.println(threadName + ". mac id is 
>>> null");
>>>                       failed = true;
>>>                   }
>>>                   count = count + 1;
>>>                   if (count % 100 == 0) {
>>>                       System.out.println(threadName + ". count is " 
>>> + count);
>>>                   }
>>>               }
>>>           } catch (Exception ex) {
>>>               System.out.println(threadName + ". Not expecting
>>> exception:" + ex.getMessage());
>>>               failed = true;
>>>               return ex;
>>>           }
>>>           return null;
>>>       }
>>>
>>>       static final Predicate<NetworkInterface> hasHardwareAddress = 
>>> ni -> {
>>>           try {
>>>               if (ni.getHardwareAddress() == null) {
>>>                   System.out.println("Not testing null addr: " +
>>> ni.getName());
>>>                   return false;
>>>               }
>>>           } catch (Exception ex) {
>>>               System.out.println("Not testing: " + ni.getName() +
>>>                       " " + ex.getMessage());
>>>           }
>>>           return true;
>>>       };
>>>
>>>       public static void main(String[] args) throws Exception {
>>>           List<NetworkInterface> toTest =
>>> NetworkInterface.networkInterfaces()
>>>                           .filter(hasHardwareAddress)
>>>                           .collect(Collectors.toList());
>>>
>>>           ExecutorService executor =
>>> Executors.newFixedThreadPool(NUM_THREADS);
>>>
>>>           for (NetworkInterface ni : toTest) {
>>>               Phaser startingGate = new Phaser(NUM_THREADS);
>>>               System.out.println("Testing: " + ni.getName());
>>>               List<Callable<Exception>> list = new ArrayList<>();
>>>               for (int i = 0; i < NUM_THREADS; i++)
>>>                   list.add(new GetMacAddress(ni, ni.getName() +
>>> "-Thread-" + i, startingGate));
>>>               List<Future<Exception>> futures = 
>>> executor.invokeAll(list);
>>>               for (Future<Exception> f : futures) {
>>>                   if (f.get() != null)
>>>                       f.get().printStackTrace(System.out);
>>>               }
>>>               if (failed)
>>>                   break;
>>>           }
>>>           executor.shutdownNow();
>>>           if (!failed) {
>>>               System.out.println("PASSED - Finished all threads");
>>>           } else {
>>>               throw new RuntimeException("Failed");
>>>           }
>>>       }
>>> }
>



More information about the net-dev mailing list