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();
     }
 
     /**