From a062ff5f9f0d3221deaaaaf8fccbcd21e933e7cd Mon Sep 17 00:00:00 2001 From: Jon Meredith Date: Wed, 26 Aug 2020 12:58:10 -0700 Subject: [PATCH] Resolve JMX output inconsistencies from CASSANDRA-7544 storage-port-configurable-per-node patch by Jon Meredith; reviewed by David Capwell for CASSANDRA-15937 --- CHANGES.txt | 1 + .../org/apache/cassandra/gms/Gossiper.java | 2 +- .../apache/cassandra/gms/GossiperEvent.java | 2 +- .../apache/cassandra/gms/VersionedValue.java | 12 +- .../org/apache/cassandra/hints/HintEvent.java | 2 +- .../locator/DynamicEndpointSnitch.java | 4 +- .../locator/DynamicEndpointSnitchMBean.java | 2 +- .../locator/Ec2MultiRegionSnitch.java | 2 +- .../locator/GossipingPropertyFileSnitch.java | 2 +- .../cassandra/locator/InetAddressAndPort.java | 58 +++++++- .../cassandra/metrics/ClientMetrics.java | 2 +- .../metrics/InternodeInboundMetrics.java | 2 +- .../metrics/InternodeOutboundMetrics.java | 2 +- .../repair/SystemDistributedKeyspace.java | 2 +- .../repair/consistent/LocalSessionInfo.java | 2 +- .../repair/consistent/LocalSessions.java | 2 +- .../schema/SchemaMigrationEvent.java | 2 +- .../cassandra/service/StorageProxy.java | 2 +- .../cassandra/service/StorageService.java | 6 +- .../cassandra/streaming/StreamSession.java | 10 +- .../impl/DistributedTestSnitch.java | 2 +- .../distributed/test/GossipSettlesTest.java | 128 +++++++++++++++++- .../test/RepairCoordinatorNeighbourDown.java | 8 +- .../distributed/test/SimpleReadWriteTest.java | 8 +- .../distributed/test/TopologyChangeTest.java | 7 +- .../cassandra/gms/EndpointStateTest.java | 9 +- .../GossipingPropertyFileSnitchTest.java | 2 +- .../locator/InetAddressAndPortTest.java | 47 ++++++- .../locator/PropertyFileSnitchTest.java | 50 +++---- .../service/ActiveRepairServiceTest.java | 2 +- 30 files changed, 298 insertions(+), 84 deletions(-) diff --git a/CHANGES.txt b/CHANGES.txt index 123efdf7e4..3c33a6b25b 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -18,6 +18,7 @@ * Fix version parsing logic when upgrading from 3.0 (CASSANDRA-15973) * Optimize NoSpamLogger use in hot paths (CASSANDRA-15766) * Verify sstable components on startup (CASSANDRA-15945) + * Resolve JMX output inconsistencies from CASSANDRA-7544 storage-port-configurable-per-node (CASSANDRA-15937) Merged from 3.11: * Correctly interpret SASI's `max_compaction_flush_memory_in_mb` setting in megabytes not bytes (CASSANDRA-16071) * Fix short read protection for GROUP BY queries (CASSANDRA-15459) diff --git a/src/java/org/apache/cassandra/gms/Gossiper.java b/src/java/org/apache/cassandra/gms/Gossiper.java index 37ad6bb8fd..9e1082a2c9 100644 --- a/src/java/org/apache/cassandra/gms/Gossiper.java +++ b/src/java/org/apache/cassandra/gms/Gossiper.java @@ -1949,7 +1949,7 @@ public class Gossiper implements IFailureDetectionEventListener, GossiperMBean hosts = new ArrayList<>(); results.put(stringVersion, hosts); } - hosts.add(host.getHostAddress(true)); + hosts.add(host.getHostAddressAndPort()); } return results; diff --git a/src/java/org/apache/cassandra/gms/GossiperEvent.java b/src/java/org/apache/cassandra/gms/GossiperEvent.java index ef7bd8d54e..4ec0cf4d10 100644 --- a/src/java/org/apache/cassandra/gms/GossiperEvent.java +++ b/src/java/org/apache/cassandra/gms/GossiperEvent.java @@ -95,7 +95,7 @@ public final class GossiperEvent extends DiagnosticEvent { // be extra defensive against nulls and bugs HashMap ret = new HashMap<>(); - if (endpoint != null) ret.put("endpoint", endpoint.getHostAddress(true)); + if (endpoint != null) ret.put("endpoint", endpoint.getHostAddressAndPort()); ret.put("quarantineExpiration", quarantineExpiration); ret.put("localState", String.valueOf(localState)); ret.put("endpointStateMap", String.valueOf(endpointStateMap)); diff --git a/src/java/org/apache/cassandra/gms/VersionedValue.java b/src/java/org/apache/cassandra/gms/VersionedValue.java index 94b8cb86d5..caf6ce90d6 100644 --- a/src/java/org/apache/cassandra/gms/VersionedValue.java +++ b/src/java/org/apache/cassandra/gms/VersionedValue.java @@ -143,7 +143,7 @@ public class VersionedValue implements Comparable public VersionedValue bootReplacingWithPort(InetAddressAndPort oldNode) { - return new VersionedValue(versionString(VersionedValue.STATUS_BOOTSTRAPPING_REPLACE, oldNode.toString())); + return new VersionedValue(versionString(VersionedValue.STATUS_BOOTSTRAPPING_REPLACE, oldNode.getHostAddressAndPort())); } public VersionedValue bootstrapping(Collection tokens) @@ -258,7 +258,7 @@ public class VersionedValue implements Comparable public VersionedValue nativeaddressAndPort(InetAddressAndPort address) { - return new VersionedValue(address.toString()); + return new VersionedValue(address.getHostAddressAndPort()); } public VersionedValue releaseVersion() @@ -277,14 +277,14 @@ public class VersionedValue implements Comparable return new VersionedValue(String.valueOf(MessagingService.current_version)); } - public VersionedValue internalIP(String private_ip) + public VersionedValue internalIP(InetAddress private_ip) { - return new VersionedValue(private_ip); + return new VersionedValue(private_ip.getHostAddress()); } - public VersionedValue internalAddressAndPort(InetAddressAndPort address) + public VersionedValue internalAddressAndPort(InetAddressAndPort private_ip_and_port) { - return new VersionedValue(address.toString()); + return new VersionedValue(private_ip_and_port.getHostAddressAndPort()); } public VersionedValue severity(double value) diff --git a/src/java/org/apache/cassandra/hints/HintEvent.java b/src/java/org/apache/cassandra/hints/HintEvent.java index 011f248f09..d8b6943c0b 100644 --- a/src/java/org/apache/cassandra/hints/HintEvent.java +++ b/src/java/org/apache/cassandra/hints/HintEvent.java @@ -89,7 +89,7 @@ final class HintEvent extends DiagnosticEvent // be extra defensive against nulls and bugs HashMap ret = new HashMap<>(); ret.put("targetHostId", targetHostId); - ret.put("targetAddress", targetAddress.getHostAddress(true)); + ret.put("targetAddress", targetAddress.getHostAddressAndPort()); if (dispatchResult != null) ret.put("dispatchResult", dispatchResult.name()); if (pageHintsSuccessful != null || pageHintsFailed != null || pageHintsTimeout != null) { diff --git a/src/java/org/apache/cassandra/locator/DynamicEndpointSnitch.java b/src/java/org/apache/cassandra/locator/DynamicEndpointSnitch.java index 218bdd6a73..976e1dab22 100644 --- a/src/java/org/apache/cassandra/locator/DynamicEndpointSnitch.java +++ b/src/java/org/apache/cassandra/locator/DynamicEndpointSnitch.java @@ -323,9 +323,9 @@ public class DynamicEndpointSnitch extends AbstractEndpointSnitch implements Lat return scores.entrySet().stream().collect(Collectors.toMap(address -> address.getKey().address, Map.Entry::getValue)); } - public Map getScoresWithPort() + public Map getScoresWithPort() { - return scores; + return scores.entrySet().stream().collect(Collectors.toMap(address -> address.getKey().toString(true), Map.Entry::getValue)); } public int getUpdateInterval() diff --git a/src/java/org/apache/cassandra/locator/DynamicEndpointSnitchMBean.java b/src/java/org/apache/cassandra/locator/DynamicEndpointSnitchMBean.java index 61f0d9779d..e036ff97a6 100644 --- a/src/java/org/apache/cassandra/locator/DynamicEndpointSnitchMBean.java +++ b/src/java/org/apache/cassandra/locator/DynamicEndpointSnitchMBean.java @@ -24,7 +24,7 @@ import java.util.List; public interface DynamicEndpointSnitchMBean { - public Map getScoresWithPort(); + public Map getScoresWithPort(); @Deprecated public Map getScores(); public int getUpdateInterval(); diff --git a/src/java/org/apache/cassandra/locator/Ec2MultiRegionSnitch.java b/src/java/org/apache/cassandra/locator/Ec2MultiRegionSnitch.java index 2a6c7e9c02..f9de755c8e 100644 --- a/src/java/org/apache/cassandra/locator/Ec2MultiRegionSnitch.java +++ b/src/java/org/apache/cassandra/locator/Ec2MultiRegionSnitch.java @@ -73,7 +73,7 @@ public class Ec2MultiRegionSnitch extends Ec2Snitch throw new RuntimeException(e); } Gossiper.instance.addLocalApplicationState(ApplicationState.INTERNAL_ADDRESS_AND_PORT, StorageService.instance.valueFactory.internalAddressAndPort(address)); - Gossiper.instance.addLocalApplicationState(ApplicationState.INTERNAL_IP, StorageService.instance.valueFactory.internalIP(localPrivateAddress)); + Gossiper.instance.addLocalApplicationState(ApplicationState.INTERNAL_IP, StorageService.instance.valueFactory.internalIP(address.address)); Gossiper.instance.register(new ReconnectableSnitchHelper(this, ec2region, true)); } } diff --git a/src/java/org/apache/cassandra/locator/GossipingPropertyFileSnitch.java b/src/java/org/apache/cassandra/locator/GossipingPropertyFileSnitch.java index 75b56851f6..5aa7791e63 100644 --- a/src/java/org/apache/cassandra/locator/GossipingPropertyFileSnitch.java +++ b/src/java/org/apache/cassandra/locator/GossipingPropertyFileSnitch.java @@ -140,7 +140,7 @@ public class GossipingPropertyFileSnitch extends AbstractNetworkTopologySnitch// Gossiper.instance.addLocalApplicationState(ApplicationState.INTERNAL_ADDRESS_AND_PORT, StorageService.instance.valueFactory.internalAddressAndPort(FBUtilities.getLocalAddressAndPort())); Gossiper.instance.addLocalApplicationState(ApplicationState.INTERNAL_IP, - StorageService.instance.valueFactory.internalIP(FBUtilities.getJustLocalAddress().getHostAddress())); + StorageService.instance.valueFactory.internalIP(FBUtilities.getJustLocalAddress())); loadGossiperState(); } diff --git a/src/java/org/apache/cassandra/locator/InetAddressAndPort.java b/src/java/org/apache/cassandra/locator/InetAddressAndPort.java index 6821f13986..06c4ea6340 100644 --- a/src/java/org/apache/cassandra/locator/InetAddressAndPort.java +++ b/src/java/org/apache/cassandra/locator/InetAddressAndPort.java @@ -24,6 +24,8 @@ import java.net.Inet6Address; import java.net.InetAddress; import java.net.UnknownHostException; import java.nio.ByteBuffer; +import java.util.Objects; +import java.util.regex.Pattern; import com.google.common.base.Preconditions; import com.google.common.net.HostAndPort; @@ -119,11 +121,30 @@ public final class InetAddressAndPort implements Comparable, return Integer.compare(port, o.port); } + public String getHostAddressAndPort() + { + return getHostAddress(true); + } + + private static final Pattern JMX_INCOMPATIBLE_CHARS = Pattern.compile("[\\[\\]:]"); + + + /** + * Return a version of getHostAddressAndPort suitable for use in JMX object names without + * requiring any escaping. Replaces each character invalid for JMX names with an underscore. + * + * @return String with JMX-safe representation of the IP address and port + */ + public String getHostAddressAndPortForJMX() + { + return JMX_INCOMPATIBLE_CHARS.matcher(getHostAddressAndPort()).replaceAll("_"); + } + public String getHostAddress(boolean withPort) { if (withPort) { - return toString(); + return HostAndPort.fromParts(address.getHostAddress(), port).toString(); } else { @@ -149,9 +170,42 @@ public final class InetAddressAndPort implements Comparable, } } + /** Format an InetAddressAndPort in the same style as InetAddress.toString. + * The string returned is of the form: hostname / literal IP address : port + * (without the whitespace). Literal IPv6 addresses will be wrapped with [ ] + * to make the port number clear. + * + * If the host name is unresolved, no reverse name service lookup + * is performed. The hostname part will be represented by an empty string. + * + * @param address InetAddress to convert String + * @param port Port number to convert to String + * @return String representation of the IP address and port + */ public static String toString(InetAddress address, int port) { - return HostAndPort.fromParts(address.getHostAddress(), port).toString(); + String addressToString = address.toString(); // cannot use getHostName as it resolves + int nameLength = addressToString.lastIndexOf('/'); // use last index to prevent ambiguity if host name contains / + assert nameLength >= 0 : "InetAddress.toString format may have changed, expecting /"; + + // Check if need to wrap address with [ ] for IPv6 addresses + if (addressToString.indexOf(':', nameLength) >= 0) + { + StringBuilder sb = new StringBuilder(addressToString.length() + 16); + sb.append(addressToString, 0, nameLength + 1); // append optional host and / char + sb.append('['); + sb.append(addressToString, nameLength + 1, addressToString.length()); + sb.append("]:"); + sb.append(port); + return sb.toString(); + } + else // can just append :port + { + StringBuilder sb = new StringBuilder(addressToString); // will have enough capacity for port + sb.append(":"); + sb.append(port); + return sb.toString(); + } } public static InetAddressAndPort getByName(String name) throws UnknownHostException diff --git a/src/java/org/apache/cassandra/metrics/ClientMetrics.java b/src/java/org/apache/cassandra/metrics/ClientMetrics.java index 7599096ae9..0a4ae1ab50 100644 --- a/src/java/org/apache/cassandra/metrics/ClientMetrics.java +++ b/src/java/org/apache/cassandra/metrics/ClientMetrics.java @@ -136,7 +136,7 @@ public final class ClientMetrics for (Server server : servers) for (ClientStat stat : server.recentClientStats()) - stats.add(stat.asMap()); + stats.add(new HashMap(stat.asMap())); // asMap returns guava, so need to convert to java for jmx stats.sort(Comparator.comparing(map -> map.get(ClientStat.PROTOCOL_VERSION))); diff --git a/src/java/org/apache/cassandra/metrics/InternodeInboundMetrics.java b/src/java/org/apache/cassandra/metrics/InternodeInboundMetrics.java index cc3c1c0d2d..cc8dae9f4c 100644 --- a/src/java/org/apache/cassandra/metrics/InternodeInboundMetrics.java +++ b/src/java/org/apache/cassandra/metrics/InternodeInboundMetrics.java @@ -50,7 +50,7 @@ public class InternodeInboundMetrics public InternodeInboundMetrics(InetAddressAndPort peer, InboundMessageHandlers handlers) { // ipv6 addresses will contain colons, which are invalid in a JMX ObjectName - MetricNameFactory factory = new DefaultNameFactory("InboundConnection", peer.toString().replace(':', '_')); + MetricNameFactory factory = new DefaultNameFactory("InboundConnection", peer.getHostAddressAndPortForJMX()); register(corruptFramesRecovered = factory.createMetricName("CorruptFramesRecovered"), handlers::corruptFramesRecovered); register(corruptFramesUnrecovered = factory.createMetricName("CorruptFramesUnrecovered"), handlers::corruptFramesUnrecovered); diff --git a/src/java/org/apache/cassandra/metrics/InternodeOutboundMetrics.java b/src/java/org/apache/cassandra/metrics/InternodeOutboundMetrics.java index f04b42877b..2b0348eb55 100644 --- a/src/java/org/apache/cassandra/metrics/InternodeOutboundMetrics.java +++ b/src/java/org/apache/cassandra/metrics/InternodeOutboundMetrics.java @@ -117,7 +117,7 @@ public class InternodeOutboundMetrics public InternodeOutboundMetrics(InetAddressAndPort ip, final OutboundConnections messagingPool) { // ipv6 addresses will contain colons, which are invalid in a JMX ObjectName - address = ip.toString().replace(':', '_'); + address = ip.getHostAddressAndPortForJMX(); factory = new DefaultNameFactory("Connection", address); diff --git a/src/java/org/apache/cassandra/repair/SystemDistributedKeyspace.java b/src/java/org/apache/cassandra/repair/SystemDistributedKeyspace.java index 2e3b981352..c62818a14a 100644 --- a/src/java/org/apache/cassandra/repair/SystemDistributedKeyspace.java +++ b/src/java/org/apache/cassandra/repair/SystemDistributedKeyspace.java @@ -223,7 +223,7 @@ public final class SystemDistributedKeyspace for (InetAddressAndPort endpoint : commonRange.endpoints) { participants.add(endpoint.getHostAddress(false)); - participants_v2.add(endpoint.toString()); + participants_v2.add(endpoint.getHostAddressAndPort()); } String query = diff --git a/src/java/org/apache/cassandra/repair/consistent/LocalSessionInfo.java b/src/java/org/apache/cassandra/repair/consistent/LocalSessionInfo.java index 98b883a7d5..f1f927b02a 100644 --- a/src/java/org/apache/cassandra/repair/consistent/LocalSessionInfo.java +++ b/src/java/org/apache/cassandra/repair/consistent/LocalSessionInfo.java @@ -63,7 +63,7 @@ public class LocalSessionInfo m.put(LAST_UPDATE, Integer.toString(session.getLastUpdate())); m.put(COORDINATOR, session.coordinator.toString()); m.put(PARTICIPANTS, Joiner.on(',').join(Iterables.transform(session.participants.stream().map(peer -> peer.address).collect(Collectors.toList()), InetAddress::getHostAddress))); - m.put(PARTICIPANTS_WP, Joiner.on(',').join(Iterables.transform(session.participants, InetAddressAndPort::toString))); + m.put(PARTICIPANTS_WP, Joiner.on(',').join(Iterables.transform(session.participants, InetAddressAndPort::getHostAddressAndPort))); m.put(TABLES, Joiner.on(',').join(Iterables.transform(session.tableIds, LocalSessionInfo::tableString))); return m; diff --git a/src/java/org/apache/cassandra/repair/consistent/LocalSessions.java b/src/java/org/apache/cassandra/repair/consistent/LocalSessions.java index 55fe2f0416..0c65ba01d5 100644 --- a/src/java/org/apache/cassandra/repair/consistent/LocalSessions.java +++ b/src/java/org/apache/cassandra/repair/consistent/LocalSessions.java @@ -502,7 +502,7 @@ public class LocalSessions session.coordinator.address, session.coordinator.port, session.participants.stream().map(participant -> participant.address).collect(Collectors.toSet()), - session.participants.stream().map(participant -> participant.toString()).collect(Collectors.toSet()), + session.participants.stream().map(participant -> participant.getHostAddressAndPort()).collect(Collectors.toSet()), serializeRanges(session.ranges), tableIdToUuid(session.tableIds)); diff --git a/src/java/org/apache/cassandra/schema/SchemaMigrationEvent.java b/src/java/org/apache/cassandra/schema/SchemaMigrationEvent.java index 45844b3403..0e6b7a3a04 100644 --- a/src/java/org/apache/cassandra/schema/SchemaMigrationEvent.java +++ b/src/java/org/apache/cassandra/schema/SchemaMigrationEvent.java @@ -100,7 +100,7 @@ final class SchemaMigrationEvent extends DiagnosticEvent public Map toMap() { HashMap ret = new HashMap<>(); - if (endpoint != null) ret.put("endpoint", endpoint.getHostAddress(true)); + if (endpoint != null) ret.put("endpoint", endpoint.getHostAddressAndPort()); ret.put("endpointSchemaVersion", Schema.schemaVersionToString(endpointSchemaVersion)); ret.put("localSchemaVersion", Schema.schemaVersionToString(localSchemaVersion)); if (endpointMessagingVersion != null) ret.put("endpointMessagingVersion", endpointMessagingVersion); diff --git a/src/java/org/apache/cassandra/service/StorageProxy.java b/src/java/org/apache/cassandra/service/StorageProxy.java index 4006e3257a..c3715dd6b7 100644 --- a/src/java/org/apache/cassandra/service/StorageProxy.java +++ b/src/java/org/apache/cassandra/service/StorageProxy.java @@ -2813,7 +2813,7 @@ public class StorageProxy implements StorageProxyMBean public String getIdealConsistencyLevel() { - return DatabaseDescriptor.getIdealConsistencyLevel().toString(); + return Objects.toString(DatabaseDescriptor.getIdealConsistencyLevel(), ""); } public String setIdealConsistencyLevel(String cl) diff --git a/src/java/org/apache/cassandra/service/StorageService.java b/src/java/org/apache/cassandra/service/StorageService.java index 6c8d7292d9..f7c0441dc0 100644 --- a/src/java/org/apache/cassandra/service/StorageService.java +++ b/src/java/org/apache/cassandra/service/StorageService.java @@ -1754,7 +1754,7 @@ public class StorageService extends NotificationBroadcasterSupport implements IE public String getNativeaddress(InetAddressAndPort endpoint, boolean withPort) { if (endpoint.equals(FBUtilities.getBroadcastAddressAndPort())) - return FBUtilities.getBroadcastNativeAddressAndPort().toString(withPort); + return FBUtilities.getBroadcastNativeAddressAndPort().getHostAddress(withPort); else if (Gossiper.instance.getEndpointStateForEndpoint(endpoint).getApplicationState(ApplicationState.NATIVE_ADDRESS_AND_PORT) != null) { try @@ -3127,7 +3127,7 @@ public class StorageService extends NotificationBroadcasterSupport implements IE map.put(entry.getKey().getHostAddress(withPort), FileUtils.stringifyFileSize(entry.getValue())); } // gossiper doesn't see its own updates, so we need to special-case the local node - map.put(withPort ? FBUtilities.getJustBroadcastAddress().getHostAddress() : FBUtilities.getBroadcastAddressAndPort().toString(), getLoadString()); + map.put(FBUtilities.getBroadcastAddressAndPort().getHostAddress(withPort), getLoadString()); return map; } @@ -3226,7 +3226,7 @@ public class StorageService extends NotificationBroadcasterSupport implements IE for (Pair node : tokenMetadata.getMovingEndpoints()) { - endpoints.add(node.right.toString()); + endpoints.add(node.right.getHostAddressAndPort()); } return endpoints; diff --git a/src/java/org/apache/cassandra/streaming/StreamSession.java b/src/java/org/apache/cassandra/streaming/StreamSession.java index 9c3a0edbe3..02819520de 100644 --- a/src/java/org/apache/cassandra/streaming/StreamSession.java +++ b/src/java/org/apache/cassandra/streaming/StreamSession.java @@ -652,7 +652,7 @@ public class StreamSession implements IEndpointStateChangeSubscriber { logger.error("[Stream #{}] Socket closed before session completion, peer {} is probably down.", planId(), - peer.address.getHostAddress(), + peer.getHostAddressAndPort(), e); return closeSession(State.FAILED); @@ -673,16 +673,16 @@ public class StreamSession implements IEndpointStateChangeSubscriber { logger.error("[Stream #{}] Did not receive response from peer {}{} for {} secs. Is peer down? " + "If not, maybe try increasing streaming_keep_alive_period_in_secs.", planId(), - peer.getHostAddress(true), - template.connectTo == null ? "" : " through " + template.connectTo.getHostAddress(true), + peer.getHostAddressAndPort(), + template.connectTo == null ? "" : " through " + template.connectTo.getHostAddressAndPort(), 2 * DatabaseDescriptor.getStreamingKeepAlivePeriod(), e); } else { logger.error("[Stream #{}] Streaming error occurred on session with peer {}{}", planId(), - peer.getHostAddress(true), - template.connectTo == null ? "" : " through " + template.connectTo.getHostAddress(true), + peer.getHostAddressAndPort(), + template.connectTo == null ? "" : " through " + template.connectTo.getHostAddressAndPort(), e); } } diff --git a/test/distributed/org/apache/cassandra/distributed/impl/DistributedTestSnitch.java b/test/distributed/org/apache/cassandra/distributed/impl/DistributedTestSnitch.java index e671f4d9bc..fbfda3a230 100644 --- a/test/distributed/org/apache/cassandra/distributed/impl/DistributedTestSnitch.java +++ b/test/distributed/org/apache/cassandra/distributed/impl/DistributedTestSnitch.java @@ -123,6 +123,6 @@ public class DistributedTestSnitch extends AbstractNetworkTopologySnitch Gossiper.instance.addLocalApplicationState(ApplicationState.INTERNAL_ADDRESS_AND_PORT, StorageService.instance.valueFactory.internalAddressAndPort(FBUtilities.getLocalAddressAndPort())); Gossiper.instance.addLocalApplicationState(ApplicationState.INTERNAL_IP, - StorageService.instance.valueFactory.internalIP(FBUtilities.getJustLocalAddress().getHostAddress())); + StorageService.instance.valueFactory.internalIP(FBUtilities.getJustLocalAddress())); } } diff --git a/test/distributed/org/apache/cassandra/distributed/test/GossipSettlesTest.java b/test/distributed/org/apache/cassandra/distributed/test/GossipSettlesTest.java index 509fe6f006..5b9629a891 100644 --- a/test/distributed/org/apache/cassandra/distributed/test/GossipSettlesTest.java +++ b/test/distributed/org/apache/cassandra/distributed/test/GossipSettlesTest.java @@ -18,9 +18,26 @@ package org.apache.cassandra.distributed.test; +import java.net.InetAddress; +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.regex.Pattern; +import java.util.stream.Collectors; + +import org.junit.Assert; import org.junit.Test; -import org.apache.cassandra.distributed.api.ICluster; +import org.apache.cassandra.config.DatabaseDescriptor; +import org.apache.cassandra.distributed.Cluster; +import org.apache.cassandra.gms.FailureDetector; +import org.apache.cassandra.gms.Gossiper; +import org.apache.cassandra.net.MessagingService; +import org.apache.cassandra.repair.SystemDistributedKeyspace; +import org.apache.cassandra.schema.SchemaConstants; +import org.apache.cassandra.service.StorageProxy; +import org.apache.cassandra.service.StorageService; +import org.apache.cassandra.utils.ByteBufferUtil; import static org.apache.cassandra.distributed.api.Feature.GOSSIP; import static org.apache.cassandra.distributed.api.Feature.NETWORK; @@ -28,17 +45,116 @@ import static org.apache.cassandra.distributed.api.Feature.NETWORK; // TODO: this test should be removed after running in-jvm dtests is set up via the shared API repository public class GossipSettlesTest extends TestBaseImpl { - @Test public void testGossipSettles() throws Throwable { /* Use withSubnet(1) to prove seed provider is set correctly - without the fix to pass a seed provider, this test fails */ - try (ICluster cluster = builder().withNodes(3) - .withConfig(config -> config.with(GOSSIP).with(NETWORK)) - .withSubnet(1) - .start()) + try (Cluster cluster = builder().withNodes(3) + .withConfig(config -> config.with(GOSSIP).with(NETWORK)) + .withSubnet(1) + .start()) { + // Verify the 4.0 WithPort versions of status reporting methods match their InetAddress + // counterparts. Disable Gossip first to prevent any bump in heartbeats that would + // invalidate the comparison. Compare the newer WithPort versions by adding the + // storage port to IP addresses in keys/values/strings as appropriate. + cluster.forEach(i -> i.runOnInstance(() -> { Gossiper.instance.stop(); })); + cluster.get(1).runOnInstance(() -> { + + // First prove that the storage port is added + Assert.assertEquals("stuff 127.0.0.1:7012 morestuff 127.0.0.2:7012", addStoragePortToIP("stuff 127.0.0.1 morestuff 127.0.0.2")); + + FailureDetector fd = ((FailureDetector) FailureDetector.instance); + Assert.assertEquals(addStoragePortToInstanceName(fd.getAllEndpointStates(false)), + fd.getAllEndpointStates(true)); + Assert.assertEquals(addPortToKeys(fd.getSimpleStates()), fd.getSimpleStatesWithPort()); + + StorageProxy sp = StorageProxy.instance; + Assert.assertEquals(addPortToSchemaVersions(sp.getSchemaVersions()), sp.getSchemaVersionsWithPort()); + + StorageService ss = StorageService.instance; + Assert.assertEquals(addPortToValues(ss.getTokenToEndpointMap()), ss.getTokenToEndpointWithPortMap()); + Assert.assertEquals(addPortToKeys(ss.getEndpointToHostId()), ss.getEndpointWithPortToHostId()); + Assert.assertEquals(addPortToValues(ss.getHostIdToEndpoint()), ss.getHostIdToEndpointWithPort()); + Assert.assertEquals(addPortToKeys(ss.getLoadMap()), ss.getLoadMapWithPort()); + Assert.assertEquals(addPortToList(ss.getLiveNodes()), ss.getLiveNodesWithPort()); + List naturalEndpointsAddedPort = ss.getNaturalEndpoints(SchemaConstants.DISTRIBUTED_KEYSPACE_NAME, + SystemDistributedKeyspace.VIEW_BUILD_STATUS, "dummy").stream() + .map(e -> addStoragePortToIP(e.getHostAddress())).collect(Collectors.toList()); + Assert.assertEquals(naturalEndpointsAddedPort, + ss.getNaturalEndpointsWithPort(SchemaConstants.DISTRIBUTED_KEYSPACE_NAME, + SystemDistributedKeyspace.VIEW_BUILD_STATUS, "dummy")); + naturalEndpointsAddedPort = ss.getNaturalEndpoints(SchemaConstants.DISTRIBUTED_KEYSPACE_NAME, ByteBufferUtil.EMPTY_BYTE_BUFFER).stream() + .map(e -> addStoragePortToIP(e.getHostAddress())).collect(Collectors.toList()); + Assert.assertEquals(naturalEndpointsAddedPort, + ss.getNaturalEndpointsWithPort(SchemaConstants.DISTRIBUTED_KEYSPACE_NAME, ByteBufferUtil.EMPTY_BYTE_BUFFER)); + + + // Difference in key type... convert to String and add the port to the older format + Map getOwnershipKeyAddedPort = ss.getOwnership().entrySet().stream() + .collect(Collectors., String, Float>toMap( + e -> addStoragePortToIP(e.getKey().toString()), + Map.Entry::getValue)); + Assert.assertEquals(getOwnershipKeyAddedPort, ss.getOwnershipWithPort()); + + MessagingService ms = MessagingService.instance(); + Assert.assertEquals(addPortToKeys(ms.getTimeoutsPerHost()), ms.getTimeoutsPerHostWithPort()); + Assert.assertEquals(addPortToKeys(ms.getLargeMessagePendingTasks()), ms.getLargeMessagePendingTasksWithPort()); + Assert.assertEquals(addPortToKeys(ms.getLargeMessageCompletedTasks()), ms.getLargeMessageCompletedTasksWithPort()); + Assert.assertEquals(addPortToKeys(ms.getLargeMessageDroppedTasks()), ms.getLargeMessageDroppedTasksWithPort()); + Assert.assertEquals(addPortToKeys(ms.getSmallMessagePendingTasks()), ms.getSmallMessagePendingTasksWithPort()); + Assert.assertEquals(addPortToKeys(ms.getSmallMessageCompletedTasks()), ms.getSmallMessageCompletedTasksWithPort()); + Assert.assertEquals(addPortToKeys(ms.getSmallMessageDroppedTasks()), ms.getSmallMessageDroppedTasksWithPort()); + Assert.assertEquals(addPortToKeys(ms.getGossipMessagePendingTasks()), ms.getGossipMessagePendingTasksWithPort()); + Assert.assertEquals(addPortToKeys(ms.getGossipMessageCompletedTasks()), ms.getGossipMessageCompletedTasksWithPort()); + Assert.assertEquals(addPortToKeys(ms.getGossipMessageDroppedTasks()), ms.getGossipMessageDroppedTasksWithPort()); + }); } } + + final static Pattern IP4_ADDRESS = Pattern.compile("(127\\.0\\.\\d{1,3}\\.\\d{1,3})"); + + static String addStoragePortToIP(String s) + { + return IP4_ADDRESS.matcher(s).replaceAll("$1:" + DatabaseDescriptor.getStoragePort()); + } + + static String addStoragePortToInstanceName(String s) + { + return Arrays.stream(s.split("\n")).map(line -> { + if (line.startsWith(" ")) + { + return line; + } + else // Host header line + { + return addStoragePortToIP(line); + } + }).collect(Collectors.joining("\n", "", "\n")); // to match final blank line + } + + static Map addPortToKeys(Map source) + { + return source.entrySet().stream().collect(Collectors.toMap(entry -> addStoragePortToIP(entry.getKey()), + Map.Entry::getValue)); + } + + static Map addPortToValues(Map source) + { + return source.entrySet().stream().collect(Collectors.toMap(Map.Entry::getKey, + entry -> addStoragePortToIP(entry.getValue()))); + } + + static List addPortToList(List list) + { + return list.stream().map(GossipSettlesTest::addStoragePortToIP).collect(Collectors.toList()); + } + + static Map> addPortToSchemaVersions(Map> source) + { + return source.entrySet().stream() + .collect(Collectors.toMap(Map.Entry::getKey, + hostAndPortEntry -> addPortToList(hostAndPortEntry.getValue()))); + } } diff --git a/test/distributed/org/apache/cassandra/distributed/test/RepairCoordinatorNeighbourDown.java b/test/distributed/org/apache/cassandra/distributed/test/RepairCoordinatorNeighbourDown.java index dd6e2c4811..aa367d477b 100644 --- a/test/distributed/org/apache/cassandra/distributed/test/RepairCoordinatorNeighbourDown.java +++ b/test/distributed/org/apache/cassandra/distributed/test/RepairCoordinatorNeighbourDown.java @@ -74,7 +74,7 @@ public abstract class RepairCoordinatorNeighbourDown extends RepairCoordinatorBa String table = tableName("neighbourdown"); assertTimeoutPreemptively(Duration.ofMinutes(1), () -> { CLUSTER.schemaChange(format("CREATE TABLE %s.%s (key text, value text, PRIMARY KEY (key))", KEYSPACE, table)); - String downNodeAddress = CLUSTER.get(2).callOnInstance(() -> FBUtilities.getBroadcastAddressAndPort().toString()); + String downNodeAddress = CLUSTER.get(2).callOnInstance(() -> FBUtilities.getBroadcastAddressAndPort().getHostAddressAndPort()); Future shutdownFuture = CLUSTER.get(2).shutdown(); try { @@ -170,8 +170,8 @@ public abstract class RepairCoordinatorNeighbourDown extends RepairCoordinatorBa if (withNotifications) { result.asserts() - .errorContains("Endpoint 127.0.0.2:7012 died") - .notificationContains(NodeToolResult.ProgressEventType.ERROR, "Endpoint 127.0.0.2:7012 died") + .errorContains("/127.0.0.2:7012 died") + .notificationContains(NodeToolResult.ProgressEventType.ERROR, "/127.0.0.2:7012 died") .notificationContains(NodeToolResult.ProgressEventType.COMPLETE, "finished with error"); } else @@ -188,7 +188,7 @@ public abstract class RepairCoordinatorNeighbourDown extends RepairCoordinatorBa Assert.assertEquals(repairExceptions + 1, getRepairExceptions(CLUSTER, 1)); if (repairType != RepairType.PREVIEW) { - assertParentRepairFailedWithMessageContains(CLUSTER, KEYSPACE, table, "Endpoint 127.0.0.2:7012 died"); + assertParentRepairFailedWithMessageContains(CLUSTER, KEYSPACE, table, "/127.0.0.2:7012 died"); } else { diff --git a/test/distributed/org/apache/cassandra/distributed/test/SimpleReadWriteTest.java b/test/distributed/org/apache/cassandra/distributed/test/SimpleReadWriteTest.java index a547c76477..fb0537f409 100644 --- a/test/distributed/org/apache/cassandra/distributed/test/SimpleReadWriteTest.java +++ b/test/distributed/org/apache/cassandra/distributed/test/SimpleReadWriteTest.java @@ -238,8 +238,8 @@ public class SimpleReadWriteTest extends TestBaseImpl // I suppose it has to do with some classloader manipulation going on Assert.assertTrue(e.getClass().toString().contains("WriteFailureException")); // we may see 1 or 2 failures in here, because of the fail-fast behavior of AbstractWriteResponseHandler - Assert.assertTrue(e.getMessage().contains("INCOMPATIBLE_SCHEMA from 127.0.0.2") - || e.getMessage().contains("INCOMPATIBLE_SCHEMA from 127.0.0.3")); + Assert.assertTrue(e.getMessage().contains("INCOMPATIBLE_SCHEMA from ") && + (e.getMessage().contains("/127.0.0.2") || e.getMessage().contains("/127.0.0.3"))); } } @@ -270,8 +270,8 @@ public class SimpleReadWriteTest extends TestBaseImpl // I suppose it has to do with some classloader manipulation going on Assert.assertTrue(e.getClass().toString().contains("ReadFailureException")); // we may see 1 or 2 failures in here, because of the fail-fast behavior of ReadCallback - Assert.assertTrue(e.getMessage().contains("INCOMPATIBLE_SCHEMA from 127.0.0.2") - || e.getMessage().contains("INCOMPATIBLE_SCHEMA from 127.0.0.3")); + Assert.assertTrue(e.getMessage().contains("INCOMPATIBLE_SCHEMA from ") && + (e.getMessage().contains("/127.0.0.2") || e.getMessage().contains("/127.0.0.3"))); } } diff --git a/test/distributed/org/apache/cassandra/distributed/test/TopologyChangeTest.java b/test/distributed/org/apache/cassandra/distributed/test/TopologyChangeTest.java index f766775deb..731a87e702 100644 --- a/test/distributed/org/apache/cassandra/distributed/test/TopologyChangeTest.java +++ b/test/distributed/org/apache/cassandra/distributed/test/TopologyChangeTest.java @@ -18,6 +18,7 @@ package org.apache.cassandra.distributed.test; +import java.net.InetSocketAddress; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; @@ -63,19 +64,19 @@ public class TopologyChangeTest extends TestBaseImpl static class Event { - String host; + InetSocketAddress host; EventType type; Event(EventType type, Host host) { this.type = type; - this.host = host.getBroadcastSocketAddress().toString(); + this.host = host.getBroadcastSocketAddress(); } public Event(EventType type, IInvokableInstance iInvokableInstance) { this.type = type; - this.host = iInvokableInstance.broadcastAddress().toString(); + this.host = iInvokableInstance.broadcastAddress(); } diff --git a/test/unit/org/apache/cassandra/gms/EndpointStateTest.java b/test/unit/org/apache/cassandra/gms/EndpointStateTest.java index 6e0cc75a0f..103653edf3 100644 --- a/test/unit/org/apache/cassandra/gms/EndpointStateTest.java +++ b/test/unit/org/apache/cassandra/gms/EndpointStateTest.java @@ -18,6 +18,8 @@ package org.apache.cassandra.gms; +import java.net.InetAddress; +import java.net.UnknownHostException; import java.util.Collections; import java.util.EnumMap; import java.util.List; @@ -31,6 +33,7 @@ import org.junit.Test; import org.apache.cassandra.config.DatabaseDescriptor; import org.apache.cassandra.dht.Token; +import org.apache.cassandra.locator.InetAddressAndPort; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; @@ -105,7 +108,7 @@ public class EndpointStateTest } @Test - public void testMultiThreadWriteConsistency() throws InterruptedException + public void testMultiThreadWriteConsistency() throws InterruptedException, UnknownHostException { for (int i = 0; i < 500; i++) innerTestMultiThreadWriteConsistency(); @@ -114,11 +117,11 @@ public class EndpointStateTest /** * Test that two threads can update the state map concurrently. */ - private void innerTestMultiThreadWriteConsistency() throws InterruptedException + private void innerTestMultiThreadWriteConsistency() throws InterruptedException, UnknownHostException { final Token token = DatabaseDescriptor.getPartitioner().getRandomToken(); final List tokens = Collections.singletonList(token); - final String ip = "127.0.0.1"; + final InetAddress ip = InetAddress.getByAddress(null, new byte[] { 127, 0, 0, 1}); final UUID hostId = UUID.randomUUID(); final HeartBeatState hb = new HeartBeatState(0); final EndpointState state = new EndpointState(hb); diff --git a/test/unit/org/apache/cassandra/locator/GossipingPropertyFileSnitchTest.java b/test/unit/org/apache/cassandra/locator/GossipingPropertyFileSnitchTest.java index da260038ca..dcd182d23e 100644 --- a/test/unit/org/apache/cassandra/locator/GossipingPropertyFileSnitchTest.java +++ b/test/unit/org/apache/cassandra/locator/GossipingPropertyFileSnitchTest.java @@ -61,6 +61,6 @@ public class GossipingPropertyFileSnitchTest public void testLoadConfig() throws Exception { final GossipingPropertyFileSnitch snitch = new GossipingPropertyFileSnitch(); - checkEndpoint(snitch, FBUtilities.getBroadcastAddressAndPort().toString(), "DC1", "RAC1"); + checkEndpoint(snitch, FBUtilities.getBroadcastAddressAndPort().getHostAddressAndPort(), "DC1", "RAC1"); } } diff --git a/test/unit/org/apache/cassandra/locator/InetAddressAndPortTest.java b/test/unit/org/apache/cassandra/locator/InetAddressAndPortTest.java index c32b9a952b..78b9a6f56a 100644 --- a/test/unit/org/apache/cassandra/locator/InetAddressAndPortTest.java +++ b/test/unit/org/apache/cassandra/locator/InetAddressAndPortTest.java @@ -119,12 +119,51 @@ public class InetAddressAndPortTest @Test public void toStringTest() throws Exception { - String ipv4 = "127.0.0.1:42"; - String ipv6 = "[2001:db8:0:0:0:ff00:42:8329]:42"; - assertEquals(ipv4, InetAddressAndPort.getByName(ipv4).toString()); - assertEquals(ipv6, InetAddressAndPort.getByName(ipv6).toString()); + InetAddress resolvedIPv4 = InetAddress.getByAddress("resolved4", new byte[] { 127, 0, 0, 1}); + assertEquals("resolved4", resolvedIPv4.getHostName()); + assertEquals("resolved4/127.0.0.1:42", InetAddressAndPort.getByAddressOverrideDefaults(resolvedIPv4, 42).toString()); + + InetAddress strangeIPv4 = InetAddress.getByAddress("strange/host/name4", new byte[] { 127, 0, 0, 1}); + assertEquals("strange/host/name4", strangeIPv4.getHostName()); + assertEquals("strange/host/name4/127.0.0.1:42", InetAddressAndPort.getByAddressOverrideDefaults(strangeIPv4, 42).toString()); + + InetAddress unresolvedIPv4 = InetAddress.getByAddress(null, new byte[] { 127, 0, 0, 1}); // don't call getHostName and resolve + assertEquals("/127.0.0.1:42", InetAddressAndPort.getByAddressOverrideDefaults(unresolvedIPv4, 42).toString()); + + InetAddress resolvedIPv6 = InetAddress.getByAddress("resolved6", new byte[] { 0x20, 0x01, 0xd, (byte) 0xb8, 0, 0, 0, 0, 0, 0, (byte) 0xff, 0, 0x00, 0x42, (byte) 0x83, 0x29}); + assertEquals("resolved6", resolvedIPv6.getHostName()); + assertEquals("resolved6/[2001:db8:0:0:0:ff00:42:8329]:42", InetAddressAndPort.getByAddressOverrideDefaults(resolvedIPv6, 42).toString()); + + InetAddress strangeIPv6 = InetAddress.getByAddress("strange/host/name6", new byte[] { 0x20, 0x01, 0xd, (byte) 0xb8, 0, 0, 0, 0, 0, 0, (byte) 0xff, 0, 0x00, 0x42, (byte) 0x83, 0x29}); + assertEquals("strange/host/name6", strangeIPv6.getHostName()); + assertEquals("strange/host/name6/[2001:db8:0:0:0:ff00:42:8329]:42", InetAddressAndPort.getByAddressOverrideDefaults(strangeIPv6, 42).toString()); + + InetAddress unresolvedIPv6 = InetAddress.getByAddress(null, new byte[] { 0x20, 0x01, 0xd, (byte) 0xb8, 0, 0, 0, 0, 0, 0, (byte) 0xff, 0, 0x00, 0x42, (byte) 0x83, 0x29}); + assertEquals("/[2001:db8:0:0:0:ff00:42:8329]:42", InetAddressAndPort.getByAddressOverrideDefaults(unresolvedIPv6, 42).toString()); } + @Test + public void getHostAddressAndPortTest() throws Exception + { + String ipv4withoutPort = "127.0.0.1"; + String ipv6withoutPort = "2001:db8:0:0:0:ff00:42:8329"; + String ipv4 = ipv4withoutPort + ":42"; + String ipv6 = "[" + ipv6withoutPort + "]:42"; + String ipv4forJMX = ipv4.replace("[", "_").replace("]", "_").replace(":","_"); + String ipv6forJMX = ipv6.replace("[", "_").replace("]", "_").replace(":","_"); + + assertEquals(ipv4, InetAddressAndPort.getByName(ipv4).getHostAddressAndPort()); + assertEquals(ipv6, InetAddressAndPort.getByName(ipv6).getHostAddressAndPort()); + + assertEquals(ipv4, InetAddressAndPort.getByName(ipv4).getHostAddress(true)); + assertEquals(ipv6, InetAddressAndPort.getByName(ipv6).getHostAddress(true)); + + assertEquals(ipv4withoutPort, InetAddressAndPort.getByName(ipv4).getHostAddress(false)); + assertEquals(ipv6withoutPort, InetAddressAndPort.getByName(ipv6).getHostAddress(false)); + + assertEquals(ipv4forJMX, InetAddressAndPort.getByName(ipv4).getHostAddressAndPortForJMX()); + assertEquals(ipv6forJMX, InetAddressAndPort.getByName(ipv6).getHostAddressAndPortForJMX()); + } private void shouldThrow(ThrowingRunnable t, Class expectedClass) { diff --git a/test/unit/org/apache/cassandra/locator/PropertyFileSnitchTest.java b/test/unit/org/apache/cassandra/locator/PropertyFileSnitchTest.java index bd8f8867f1..23bcf1bd8a 100644 --- a/test/unit/org/apache/cassandra/locator/PropertyFileSnitchTest.java +++ b/test/unit/org/apache/cassandra/locator/PropertyFileSnitchTest.java @@ -120,13 +120,13 @@ public class PropertyFileSnitchTest if (info.length == 2 && !line.startsWith("#") && !line.startsWith("default=")) { InetAddressAndPort address = InetAddressAndPort.getByName(info[0].replaceAll(Matcher.quoteReplacement("\\:"), ":")); - String replacement = replacements.get(address.toString()); + String replacement = replacements.get(address.getHostAddressAndPort()); if (replacement != null) { if (!replacement.isEmpty()) // empty means remove this line newLines.add(info[0] + '=' + replacement); - replaced.add(address.toString()); + replaced.add(address.getHostAddressAndPort()); } else { @@ -189,23 +189,23 @@ public class PropertyFileSnitchTest { final InetAddressAndPort host = InetAddressAndPort.getByName("127.0.0.1"); final PropertyFileSnitch snitch = new PropertyFileSnitch(/*refreshPeriodInSeconds*/1); - checkEndpoint(snitch, host.toString(), "DC1", "RAC1"); + checkEndpoint(snitch, host.getHostAddressAndPort(), "DC1", "RAC1"); try { setNodeLive(host); Files.copy(effectiveFile, backupFile); - replaceConfigFile(Collections.singletonMap(host.toString(), "DC1:RAC2")); + replaceConfigFile(Collections.singletonMap(host.getHostAddressAndPort(), "DC1:RAC2")); Thread.sleep(1500); - checkEndpoint(snitch, host.toString(), "DC1", "RAC1"); + checkEndpoint(snitch, host.getHostAddressAndPort(), "DC1", "RAC1"); setNodeShutdown(host); - replaceConfigFile(Collections.singletonMap(host.toString(), "DC1:RAC2")); + replaceConfigFile(Collections.singletonMap(host.getHostAddressAndPort(), "DC1:RAC2")); Thread.sleep(1500); - checkEndpoint(snitch, host.toString(), "DC1", "RAC2"); + checkEndpoint(snitch, host.getHostAddressAndPort(), "DC1", "RAC2"); } finally { @@ -223,23 +223,23 @@ public class PropertyFileSnitchTest { final InetAddressAndPort host = InetAddressAndPort.getByName("127.0.0.1"); final PropertyFileSnitch snitch = new PropertyFileSnitch(/*refreshPeriodInSeconds*/1); - checkEndpoint(snitch, host.toString(), "DC1", "RAC1"); + checkEndpoint(snitch, host.getHostAddressAndPort(), "DC1", "RAC1"); try { setNodeLive(host); Files.copy(effectiveFile, backupFile); - replaceConfigFile(Collections.singletonMap(host.toString(), "DC2:RAC1")); + replaceConfigFile(Collections.singletonMap(host.getHostAddressAndPort(), "DC2:RAC1")); Thread.sleep(1500); - checkEndpoint(snitch, host.toString(), "DC1", "RAC1"); + checkEndpoint(snitch, host.getHostAddressAndPort(), "DC1", "RAC1"); setNodeShutdown(host); - replaceConfigFile(Collections.singletonMap(host.toString(), "DC2:RAC1")); + replaceConfigFile(Collections.singletonMap(host.getHostAddressAndPort(), "DC2:RAC1")); Thread.sleep(1500); - checkEndpoint(snitch, host.toString(), "DC2", "RAC1"); + checkEndpoint(snitch, host.getHostAddressAndPort(), "DC2", "RAC1"); } finally { @@ -258,23 +258,23 @@ public class PropertyFileSnitchTest { final InetAddressAndPort host = InetAddressAndPort.getByName("127.0.0.9"); final PropertyFileSnitch snitch = new PropertyFileSnitch(/*refreshPeriodInSeconds*/1); - checkEndpoint(snitch, host.toString(), "DC1", "r1"); // default + checkEndpoint(snitch, host.getHostAddressAndPort(), "DC1", "r1"); // default try { setNodeLive(host); Files.copy(effectiveFile, backupFile); - replaceConfigFile(Collections.singletonMap(host.toString(), "DC2:RAC2")); // add this line if not yet there + replaceConfigFile(Collections.singletonMap(host.getHostAddressAndPort(), "DC2:RAC2")); // add this line if not yet there Thread.sleep(1500); - checkEndpoint(snitch, host.toString(), "DC1", "r1"); // unchanged + checkEndpoint(snitch, host.getHostAddressAndPort(), "DC1", "r1"); // unchanged setNodeShutdown(host); - replaceConfigFile(Collections.singletonMap(host.toString(), "DC2:RAC2")); // add this line if not yet there + replaceConfigFile(Collections.singletonMap(host.getHostAddressAndPort(), "DC2:RAC2")); // add this line if not yet there Thread.sleep(1500); - checkEndpoint(snitch, host.toString(), "DC2", "RAC2"); // changed + checkEndpoint(snitch, host.getHostAddressAndPort(), "DC2", "RAC2"); // changed } finally { @@ -293,23 +293,23 @@ public class PropertyFileSnitchTest { final InetAddressAndPort host = InetAddressAndPort.getByName("127.0.0.2"); final PropertyFileSnitch snitch = new PropertyFileSnitch(/*refreshPeriodInSeconds*/1); - checkEndpoint(snitch, host.toString(), "DC1", "RAC2"); + checkEndpoint(snitch, host.getHostAddressAndPort(), "DC1", "RAC2"); try { setNodeLive(host); Files.copy(effectiveFile, backupFile); - replaceConfigFile(Collections.singletonMap(host.toString(), "")); // removes line if found + replaceConfigFile(Collections.singletonMap(host.getHostAddressAndPort(), "")); // removes line if found Thread.sleep(1500); - checkEndpoint(snitch, host.toString(), "DC1", "RAC2"); // unchanged + checkEndpoint(snitch, host.getHostAddressAndPort(), "DC1", "RAC2"); // unchanged setNodeShutdown(host); - replaceConfigFile(Collections.singletonMap(host.toString(), "")); // removes line if found + replaceConfigFile(Collections.singletonMap(host.getHostAddressAndPort(), "")); // removes line if found Thread.sleep(1500); - checkEndpoint(snitch, host.toString(), "DC1", "r1"); // default + checkEndpoint(snitch, host.getHostAddressAndPort(), "DC1", "r1"); // default } finally { @@ -328,7 +328,7 @@ public class PropertyFileSnitchTest { final InetAddressAndPort host = InetAddressAndPort.getByName("127.0.0.9"); final PropertyFileSnitch snitch = new PropertyFileSnitch(/*refreshPeriodInSeconds*/1); - checkEndpoint(snitch, host.toString(), "DC1", "r1"); // default + checkEndpoint(snitch, host.getHostAddressAndPort(), "DC1", "r1"); // default try { @@ -338,13 +338,13 @@ public class PropertyFileSnitchTest replaceConfigFile(Collections.singletonMap("default", "DC2:r2")); // change default Thread.sleep(1500); - checkEndpoint(snitch, host.toString(), "DC1", "r1"); // unchanged + checkEndpoint(snitch, host.getHostAddressAndPort(), "DC1", "r1"); // unchanged setNodeShutdown(host); replaceConfigFile(Collections.singletonMap("default", "DC2:r2")); // change default again (refresh file update) Thread.sleep(1500); - checkEndpoint(snitch, host.toString(), "DC2", "r2"); // default updated + checkEndpoint(snitch, host.getHostAddressAndPort(), "DC2", "r2"); // default updated } finally { diff --git a/test/unit/org/apache/cassandra/service/ActiveRepairServiceTest.java b/test/unit/org/apache/cassandra/service/ActiveRepairServiceTest.java index 8883f21502..45e55c3cc3 100644 --- a/test/unit/org/apache/cassandra/service/ActiveRepairServiceTest.java +++ b/test/unit/org/apache/cassandra/service/ActiveRepairServiceTest.java @@ -216,7 +216,7 @@ public class ActiveRepairServiceTest } expected.remove(FBUtilities.getBroadcastAddressAndPort()); - Collection hosts = Arrays.asList(FBUtilities.getBroadcastAddressAndPort().toString(),expected.get(0).toString()); + Collection hosts = Arrays.asList(FBUtilities.getBroadcastAddressAndPort().getHostAddressAndPort(),expected.get(0).getHostAddressAndPort()); Iterable> ranges = StorageService.instance.getLocalReplicas(KEYSPACE5).ranges(); assertEquals(expected.get(0), ActiveRepairService.getNeighbors(KEYSPACE5, ranges,