This is an automated email from the ASF dual-hosted git repository.

mblow pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/asterixdb.git

commit 4189071b4d80c23d13d645ba9439c854428af641
Author: Michael Blow <[email protected]>
AuthorDate: Thu Jan 9 16:57:29 2020 -0500

    [NO ISSUE][NET] Use unresolved address on NC reg
    
    When NCs are configured with a public cluster address, this address
    should not be resolved on the NC but rather on the CC.  Depending on
    the network configuration, the public address may resolve differently
    on the CC.
    
    This change maintains backwards compatibility with old NCs or CCs
    
    Change-Id: I8fb2a40a8407c985eb174d09c2b7bb59949812f2
    Reviewed-on: https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/4643
    Reviewed-by: Michael Blow <[email protected]>
    Tested-by: Michael Blow <[email protected]>
---
 .../apache/hyracks/api/comm/NetworkAddress.java    |  9 +++++++
 .../common/controllers/NodeRegistration.java       | 30 +++++++++++++++++++---
 .../hyracks/control/nc/NodeControllerService.java  |  7 ++---
 3 files changed, 40 insertions(+), 6 deletions(-)

diff --git 
a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/comm/NetworkAddress.java
 
b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/comm/NetworkAddress.java
index b70e0c7..4fad59a 100644
--- 
a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/comm/NetworkAddress.java
+++ 
b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/comm/NetworkAddress.java
@@ -23,6 +23,7 @@ import java.io.DataOutput;
 import java.io.IOException;
 import java.io.Serializable;
 import java.net.InetAddress;
+import java.net.InetSocketAddress;
 import java.net.UnknownHostException;
 
 import org.apache.hyracks.api.io.IWritable;
@@ -52,6 +53,14 @@ public final class NetworkAddress implements IWritable, 
Serializable {
         ipAddress = null;
     }
 
+    public NetworkAddress(InetSocketAddress socketAddress) {
+        this.address = socketAddress.getHostString();
+        this.port = socketAddress.getPort();
+        if (!socketAddress.isUnresolved()) {
+            ipAddress = socketAddress.getAddress().getAddress();
+        }
+    }
+
     public String getAddress() {
         return address;
     }
diff --git 
a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/controllers/NodeRegistration.java
 
b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/controllers/NodeRegistration.java
index b4d835d..bcf6d22 100644
--- 
a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/controllers/NodeRegistration.java
+++ 
b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/controllers/NodeRegistration.java
@@ -21,6 +21,7 @@ package org.apache.hyracks.control.common.controllers;
 import static org.apache.hyracks.util.MXHelper.osMXBean;
 import static org.apache.hyracks.util.MXHelper.runtimeMXBean;
 
+import java.io.IOException;
 import java.io.Serializable;
 import java.net.InetSocketAddress;
 import java.util.List;
@@ -31,11 +32,17 @@ import org.apache.hyracks.api.job.resource.NodeCapacity;
 import org.apache.hyracks.control.common.heartbeat.HeartbeatSchema;
 import org.apache.hyracks.util.MXHelper;
 import org.apache.hyracks.util.PidHelper;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public final class NodeRegistration implements Serializable {
     private static final long serialVersionUID = 1L;
 
-    private final InetSocketAddress ncAddress;
+    private static final Logger LOGGER = LogManager.getLogger();
+
+    private InetSocketAddress ncAddress;
+
+    private NetworkAddress ncPort;
 
     private final String nodeId;
 
@@ -77,9 +84,9 @@ public final class NodeRegistration implements Serializable {
 
     private final NodeCapacity capacity;
 
-    public NodeRegistration(InetSocketAddress ncAddress, String nodeId, 
NCConfig ncConfig, NetworkAddress dataPort,
+    public NodeRegistration(NetworkAddress ncPort, String nodeId, NCConfig 
ncConfig, NetworkAddress dataPort,
             NetworkAddress resultPort, HeartbeatSchema hbSchema, 
NetworkAddress messagingPort, NodeCapacity capacity) {
-        this.ncAddress = ncAddress;
+        this.ncPort = ncPort;
         this.nodeId = nodeId;
         this.ncConfig = ncConfig;
         this.dataPort = dataPort;
@@ -185,4 +192,21 @@ public final class NodeRegistration implements 
Serializable {
     public int getPid() {
         return pid;
     }
+
+    private void readObject(java.io.ObjectInputStream ois) throws IOException, 
ClassNotFoundException {
+        ois.defaultReadObject();
+        if (ncPort == null) {
+            // writer was old; we need to create a NetworkAddress from the 
InetSocketAddress
+            LOGGER.warn(
+                    "deserializing old NodeRegistration for {}; address may be 
incorrectly resolved as it was resolved on the NC: {}",
+                    nodeId, ncAddress);
+            ncPort = new NetworkAddress(ncAddress.getHostString(), 
ncAddress.getPort());
+        }
+    }
+
+    private void writeObject(java.io.ObjectOutputStream oos) throws 
IOException {
+        // we need to write a resolved InetSocketAddress to keep old readers 
happy
+        ncAddress = new InetSocketAddress(ncPort.getAddress(), 
ncPort.getPort());
+        oos.defaultWriteObject();
+    }
 }
diff --git 
a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/NodeControllerService.java
 
b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/NodeControllerService.java
index 653d6e0..3c456dd 100644
--- 
a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/NodeControllerService.java
+++ 
b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/NodeControllerService.java
@@ -91,6 +91,7 @@ import org.apache.hyracks.ipc.impl.IPCSystem;
 import 
org.apache.hyracks.net.protocols.muxdemux.FullFrameChannelInterfaceFactory;
 import org.apache.hyracks.util.ExitUtil;
 import org.apache.hyracks.util.MaintainedThreadNameExecutorService;
+import org.apache.hyracks.util.NetworkUtil;
 import org.apache.hyracks.util.trace.ITracer;
 import org.apache.hyracks.util.trace.TraceUtils;
 import org.apache.hyracks.util.trace.Tracer;
@@ -310,11 +311,11 @@ public class NodeControllerService implements 
IControllerService {
 
     private void initNodeControllerState() {
         // Use "public" versions of network addresses and ports, if defined
-        InetSocketAddress ncAddress;
+        NetworkAddress ncAddress;
         if (ncConfig.getClusterPublicPort() == 0) {
-            ncAddress = ipc.getSocketAddress();
+            ncAddress = new NetworkAddress(ipc.getSocketAddress());
         } else {
-            ncAddress = new 
InetSocketAddress(ncConfig.getClusterPublicAddress(), 
ncConfig.getClusterPublicPort());
+            ncAddress = new NetworkAddress(ncConfig.getClusterPublicAddress(), 
ncConfig.getClusterPublicPort());
         }
         HeartbeatSchema.GarbageCollectorInfo[] gcInfos = new 
HeartbeatSchema.GarbageCollectorInfo[gcMXBeans.size()];
         for (int i = 0; i < gcInfos.length; ++i) {

Reply via email to