Follow-up to CASSANDRA-10238
call invalidateCacheRings when topology is updated
patch by Stefania Alborghetti; reviewed by Branimir Lambov for
CASSANDRA-10238
diff --git a/src/java/org/apache/cassandra/locator/PropertyFileSnitch.java b/src/java/org/apache/cassandra/locator/PropertyFileSnitch.java
index 745eeb8..5b89df1 100644
--- a/src/java/org/apache/cassandra/locator/PropertyFileSnitch.java
+++ b/src/java/org/apache/cassandra/locator/PropertyFileSnitch.java
@@ -59,7 +59,7 @@
public PropertyFileSnitch() throws ConfigurationException
{
- reloadConfiguration();
+ reloadConfiguration(false);
try
{
@@ -68,8 +68,7 @@
{
protected void runMayThrow() throws ConfigurationException
{
- reloadConfiguration();
- StorageService.instance.updateTopology();
+ reloadConfiguration(true);
}
};
ResourceWatcher.watch(SNITCH_PROPERTIES_FILENAME, runnable, 60 * 1000);
@@ -131,7 +130,7 @@
return info[1];
}
- public void reloadConfiguration() throws ConfigurationException
+ public void reloadConfiguration(boolean isUpdate) throws ConfigurationException
{
HashMap<InetAddress, String[]> reloadedMap = new HashMap<InetAddress, String[]>();
@@ -198,7 +197,12 @@
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 b1b25e8..25d60f0 100644
--- a/src/java/org/apache/cassandra/locator/TokenMetadata.java
+++ b/src/java/org/apache/cassandra/locator/TokenMetadata.java
@@ -413,6 +413,7 @@
{
logger.info("Updating topology for {}", endpoint);
topology.updateEndpoint(endpoint);
+ invalidateCachedRings();
}
finally
{
@@ -431,6 +432,7 @@
{
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 e6691c4..b75fc28 100644
--- a/src/java/org/apache/cassandra/locator/YamlFileNetworkTopologySnitch.java
+++ b/src/java/org/apache/cassandra/locator/YamlFileNetworkTopologySnitch.java
@@ -103,7 +103,7 @@
throws ConfigurationException
{
this.topologyConfigFilename = topologyConfigFilename;
- loadTopologyConfiguration();
+ loadTopologyConfiguration(false);
try
{
@@ -119,8 +119,7 @@
*/
protected void runMayThrow() throws ConfigurationException
{
- loadTopologyConfiguration();
- StorageService.instance.updateTopology();
+ loadTopologyConfiguration(true);
}
};
ResourceWatcher.watch(topologyConfigFilename, runnable,
@@ -202,7 +201,7 @@
* @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 @@
{
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 c5f159e..9327b67 100644
--- a/src/java/org/apache/cassandra/service/StorageService.java
+++ b/src/java/org/apache/cassandra/service/StorageService.java
@@ -1411,7 +1411,6 @@
public void updateTopology()
{
getTokenMetadata().updateTopology();
-
}
private void updatePeerInfo(InetAddress endpoint)
@@ -3670,6 +3669,8 @@
if (oldSnitch instanceof DynamicEndpointSnitch)
((DynamicEndpointSnitch)oldSnitch).unregisterMBean();
+
+ updateTopology();
}
/**