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) {
