[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 <mblow@apache.org>
Tested-by: Michael Blow <mblow@apache.org>
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.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 @@
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 @@
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.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 @@
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 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 653d6e01..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.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 @@
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) {