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.hega...@oracle.com]
Sent: Freitag, 23. Juni 2017 15:28
To: Seán Coffey <sean.cof...@oracle.com>; Langer, Christoph
<christoph.lan...@sap.com>
Cc: net-dev <net-dev@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");
          }
      }
}

Reply via email to