diff --git a/src/java/org/apache/cassandra/locator/PropertyFileSnitch.java b/src/java/org/apache/cassandra/locator/PropertyFileSnitch.java index 745eeb853a..5b89df1755 100644 --- a/src/java/org/apache/cassandra/locator/PropertyFileSnitch.java +++ b/src/java/org/apache/cassandra/locator/PropertyFileSnitch.java @@ -59,7 +59,7 @@ public class PropertyFileSnitch extends AbstractNetworkTopologySnitch public PropertyFileSnitch() throws ConfigurationException { - reloadConfiguration(); + reloadConfiguration(false); try { @@ -68,8 +68,7 @@ public class PropertyFileSnitch extends AbstractNetworkTopologySnitch { protected void runMayThrow() throws ConfigurationException { - reloadConfiguration(); - StorageService.instance.updateTopology(); + reloadConfiguration(true); } }; ResourceWatcher.watch(SNITCH_PROPERTIES_FILENAME, runnable, 60 * 1000); @@ -131,7 +130,7 @@ public class PropertyFileSnitch extends AbstractNetworkTopologySnitch return info[1]; } - public void reloadConfiguration() throws ConfigurationException + public void reloadConfiguration(boolean isUpdate) throws ConfigurationException { HashMap reloadedMap = new HashMap(); @@ -198,7 +197,12 @@ public class PropertyFileSnitch extends AbstractNetworkTopologySnitch endpointMap = reloadedMap; if (StorageService.instance != null) // null check tolerates circular dependency; see CASSANDRA-4145 - StorageService.instance.getTokenMetadata().invalidateCachedRings(); + { + if (isUpdate) + StorageService.instance.updateTopology(); + else + StorageService.instance.getTokenMetadata().invalidateCachedRings(); + } if (gossipStarted) StorageService.instance.gossipSnitchInfo(); diff --git a/src/java/org/apache/cassandra/locator/TokenMetadata.java b/src/java/org/apache/cassandra/locator/TokenMetadata.java index b1b25e886b..25d60f0273 100644 --- a/src/java/org/apache/cassandra/locator/TokenMetadata.java +++ b/src/java/org/apache/cassandra/locator/TokenMetadata.java @@ -413,6 +413,7 @@ public class TokenMetadata { logger.info("Updating topology for {}", endpoint); topology.updateEndpoint(endpoint); + invalidateCachedRings(); } finally { @@ -431,6 +432,7 @@ public class TokenMetadata { logger.info("Updating topology for all endpoints that have changed"); topology.updateEndpoints(); + invalidateCachedRings(); } finally { diff --git a/src/java/org/apache/cassandra/locator/YamlFileNetworkTopologySnitch.java b/src/java/org/apache/cassandra/locator/YamlFileNetworkTopologySnitch.java index e6691c44b3..b75fc281bb 100644 --- a/src/java/org/apache/cassandra/locator/YamlFileNetworkTopologySnitch.java +++ b/src/java/org/apache/cassandra/locator/YamlFileNetworkTopologySnitch.java @@ -103,7 +103,7 @@ public class YamlFileNetworkTopologySnitch throws ConfigurationException { this.topologyConfigFilename = topologyConfigFilename; - loadTopologyConfiguration(); + loadTopologyConfiguration(false); try { @@ -119,8 +119,7 @@ public class YamlFileNetworkTopologySnitch */ protected void runMayThrow() throws ConfigurationException { - loadTopologyConfiguration(); - StorageService.instance.updateTopology(); + loadTopologyConfiguration(true); } }; ResourceWatcher.watch(topologyConfigFilename, runnable, @@ -202,7 +201,7 @@ public class YamlFileNetworkTopologySnitch * @throws ConfigurationException * on failure */ - private synchronized void loadTopologyConfiguration() + private synchronized void loadTopologyConfiguration(boolean isUpdate) throws ConfigurationException { logger.debug("Loading topology configuration from {}", @@ -354,6 +353,9 @@ public class YamlFileNetworkTopologySnitch { StorageService.instance.gossipSnitchInfo(); } + + if (isUpdate && StorageService.instance != null) + StorageService.instance.updateTopology(); } /** diff --git a/src/java/org/apache/cassandra/service/StorageService.java b/src/java/org/apache/cassandra/service/StorageService.java index c5f159e447..9327b672fe 100644 --- a/src/java/org/apache/cassandra/service/StorageService.java +++ b/src/java/org/apache/cassandra/service/StorageService.java @@ -1411,7 +1411,6 @@ public class StorageService extends NotificationBroadcasterSupport implements IE public void updateTopology() { getTokenMetadata().updateTopology(); - } private void updatePeerInfo(InetAddress endpoint) @@ -3670,6 +3669,8 @@ public class StorageService extends NotificationBroadcasterSupport implements IE if (oldSnitch instanceof DynamicEndpointSnitch) ((DynamicEndpointSnitch)oldSnitch).unregisterMBean(); + + updateTopology(); } /**