This is an automated email from the ASF dual-hosted git repository. mboehm7 pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/systemds.git
commit 5a2277fe5d9cca7ded9b7318fc381fabf5664ba1 Author: Matthias Boehm <[email protected]> AuthorDate: Fri Jun 30 15:12:55 2023 +0200 [MINOR] Robust IP address extraction w/ multiple network interfaces This patch adds a more robust IP address extraction, to filter local addresses such as 192.168.0.x but keeps the original logic by default. --- src/main/java/org/apache/sysds/api/DMLScript.java | 4 +-- .../federated/FederatedLocalData.java | 2 +- .../controlprogram/federated/FederatedRequest.java | 2 +- .../controlprogram/parfor/util/IDHandler.java | 37 ++++++++++++++++++---- 4 files changed, 34 insertions(+), 11 deletions(-) diff --git a/src/main/java/org/apache/sysds/api/DMLScript.java b/src/main/java/org/apache/sysds/api/DMLScript.java index ad386e29e8..04b047127e 100644 --- a/src/main/java/org/apache/sysds/api/DMLScript.java +++ b/src/main/java/org/apache/sysds/api/DMLScript.java @@ -605,7 +605,7 @@ public class DMLScript if(debug) LOG.debug("DML script: \n" + dmlScriptString); if(info) - LOG.info("Process id: " + IDHandler.obtainProcessID()); + LOG.info("Process id: " + IDHandler.getProcessID()); } private static void registerForMonitoring() { @@ -622,7 +622,7 @@ public class DMLScript // TODO fix and replace localhost identifyer with hostname in federated instructions SYSTEMDS-3440 // https://issues.apache.org/jira/browse/SYSTEMDS-3440 model.host = "localhost"; - model.processId = Long.parseLong(IDHandler.obtainProcessID()); + model.processId = Long.parseLong(IDHandler.getProcessID()); String requestBody = objectMapper .writerWithDefaultPrettyPrinter() diff --git a/src/main/java/org/apache/sysds/runtime/controlprogram/federated/FederatedLocalData.java b/src/main/java/org/apache/sysds/runtime/controlprogram/federated/FederatedLocalData.java index de56a1a52e..03b800bc29 100644 --- a/src/main/java/org/apache/sysds/runtime/controlprogram/federated/FederatedLocalData.java +++ b/src/main/java/org/apache/sysds/runtime/controlprogram/federated/FederatedLocalData.java @@ -42,7 +42,7 @@ public class FederatedLocalData extends FederatedData { _fwh = new FederatedWorkerHandler(_flt, _frc, _fan); _data = data; - long pid = Long.valueOf(IDHandler.obtainProcessID()); + long pid = Long.valueOf(IDHandler.getProcessID()); ExecutionContextMap ecm = _flt.getECM(FederatedLookupTable.NOHOST, pid); synchronized(ecm) { ecm.get(-1).setVariable(Long.toString(id), _data); diff --git a/src/main/java/org/apache/sysds/runtime/controlprogram/federated/FederatedRequest.java b/src/main/java/org/apache/sysds/runtime/controlprogram/federated/FederatedRequest.java index f2b01619ee..78e4349096 100644 --- a/src/main/java/org/apache/sysds/runtime/controlprogram/federated/FederatedRequest.java +++ b/src/main/java/org/apache/sysds/runtime/controlprogram/federated/FederatedRequest.java @@ -84,7 +84,7 @@ public class FederatedRequest implements Serializable { _method = method; _id = id; _data = data; - _pid = Long.valueOf(IDHandler.obtainProcessID()); + _pid = Long.valueOf(IDHandler.getProcessID()); setCheckPrivacy(); } diff --git a/src/main/java/org/apache/sysds/runtime/controlprogram/parfor/util/IDHandler.java b/src/main/java/org/apache/sysds/runtime/controlprogram/parfor/util/IDHandler.java index f863562097..37c5834dc0 100644 --- a/src/main/java/org/apache/sysds/runtime/controlprogram/parfor/util/IDHandler.java +++ b/src/main/java/org/apache/sysds/runtime/controlprogram/parfor/util/IDHandler.java @@ -21,6 +21,10 @@ package org.apache.sysds.runtime.controlprogram.parfor.util; import java.lang.management.ManagementFactory; import java.net.InetAddress; +import java.net.NetworkInterface; +import java.net.SocketException; +import java.net.UnknownHostException; +import java.util.Enumeration; /** * Functionalities for extracting numeric IDs from Hadoop taskIDs and other @@ -77,12 +81,8 @@ public class IDHandler String uuid = null; try { - String pid = obtainProcessID(); - - //get ip address - InetAddress addr = InetAddress.getLocalHost(); - String host = addr.getHostAddress(); - + String pid = getProcessID(); + String host = getIPAddress(false); uuid = pid + "_" + host; } catch(Exception ex) { @@ -92,7 +92,7 @@ public class IDHandler return uuid; } - public static String obtainProcessID() { + public static String getProcessID() { //get process id String pname = ManagementFactory.getRuntimeMXBean().getName(); //pid@hostname String pid = pname.split("@")[0]; @@ -101,6 +101,29 @@ public class IDHandler // pid = ProcessHandle.current().pid(); return pid; } + + public static String getIPAddress(boolean noLocal) throws SocketException, UnknownHostException { + // a host might have many network interfaces, in order to extract the + // best IP we explicitly filter out 192.168.0.x, 127.0.0.1, and network interfaces + String ipAddr = null; + if( noLocal ) { + Enumeration<NetworkInterface> e = NetworkInterface.getNetworkInterfaces(); + while(e.hasMoreElements()) { + Enumeration<InetAddress> ee = e.nextElement().getInetAddresses(); + while (ee.hasMoreElements()) { + String tmp = ee.nextElement().getHostAddress(); + if( tmp!=null && !tmp.contains("192.168.0.") && !tmp.contains("127.0.0.1") && !tmp.contains(":") ) + ipAddr = tmp; + } + } + } + + if( ipAddr == null ) { + //default, which might give local network addresses (e.g., 192.168.0.xxx) + ipAddr = InetAddress.getLocalHost().getHostAddress(); + } + return ipAddr; + } private static long extractID( String taskID, int maxlen ) { //in: e.g., task_local_0002_m_000009 or task_201203111647_0898_m_000001
