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

Reply via email to