You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by al...@apache.org on 2015/09/18 13:44:29 UTC

[1/4] cassandra git commit: Follow-up to CASSANDRA-10238

Repository: cassandra
Updated Branches:
  refs/heads/cassandra-3.0 b99c86315 -> 3355caf15


Follow-up to CASSANDRA-10238

call invalidateCacheRings when topology is updated

patch by Stefania Alborghetti; reviewed by Branimir Lambov for
CASSANDRA-10238


Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo
Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/c4de7527
Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/c4de7527
Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/c4de7527

Branch: refs/heads/cassandra-3.0
Commit: c4de752758c3cf7f5de5a92e4ede30e430a36255
Parents: 6f8e07a
Author: Stefania Alborghetti <st...@datastax.com>
Authored: Fri Sep 18 08:57:53 2015 +0800
Committer: Aleksey Yeschenko <al...@apache.org>
Committed: Fri Sep 18 12:33:51 2015 +0100

----------------------------------------------------------------------
 .../apache/cassandra/locator/PropertyFileSnitch.java  | 14 +++++++++-----
 .../org/apache/cassandra/locator/TokenMetadata.java   |  2 ++
 .../locator/YamlFileNetworkTopologySnitch.java        | 10 ++++++----
 .../org/apache/cassandra/service/StorageService.java  |  3 ++-
 4 files changed, 19 insertions(+), 10 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/c4de7527/src/java/org/apache/cassandra/locator/PropertyFileSnitch.java
----------------------------------------------------------------------
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 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<InetAddress, String[]> reloadedMap = new HashMap<InetAddress, String[]>();
 
@@ -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();

http://git-wip-us.apache.org/repos/asf/cassandra/blob/c4de7527/src/java/org/apache/cassandra/locator/TokenMetadata.java
----------------------------------------------------------------------
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 @@ 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
         {

http://git-wip-us.apache.org/repos/asf/cassandra/blob/c4de7527/src/java/org/apache/cassandra/locator/YamlFileNetworkTopologySnitch.java
----------------------------------------------------------------------
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 @@ 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();
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/cassandra/blob/c4de7527/src/java/org/apache/cassandra/service/StorageService.java
----------------------------------------------------------------------
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 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();
     }
 
     /**


[3/4] cassandra git commit: Merge branch 'cassandra-2.1' into cassandra-2.2

Posted by al...@apache.org.
Merge branch 'cassandra-2.1' into cassandra-2.2


Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo
Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/32457e7d
Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/32457e7d
Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/32457e7d

Branch: refs/heads/cassandra-3.0
Commit: 32457e7dff55e35c29b517b8f9cc523ed71eae36
Parents: 1de63e9 a2f0da0
Author: Aleksey Yeschenko <al...@apache.org>
Authored: Fri Sep 18 12:42:51 2015 +0100
Committer: Aleksey Yeschenko <al...@apache.org>
Committed: Fri Sep 18 12:42:51 2015 +0100

----------------------------------------------------------------------
 .../locator/GossipingPropertyFileSnitch.java          | 14 +++++++++-----
 .../apache/cassandra/locator/PropertyFileSnitch.java  | 14 +++++++++-----
 .../org/apache/cassandra/locator/TokenMetadata.java   |  2 ++
 .../org/apache/cassandra/service/StorageService.java  |  3 ++-
 4 files changed, 22 insertions(+), 11 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/32457e7d/src/java/org/apache/cassandra/locator/PropertyFileSnitch.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cassandra/blob/32457e7d/src/java/org/apache/cassandra/locator/TokenMetadata.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cassandra/blob/32457e7d/src/java/org/apache/cassandra/service/StorageService.java
----------------------------------------------------------------------


[2/4] cassandra git commit: Merge branch 'cassandra-2.0' into cassandra-2.1

Posted by al...@apache.org.
Merge branch 'cassandra-2.0' into cassandra-2.1


Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo
Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/a2f0da07
Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/a2f0da07
Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/a2f0da07

Branch: refs/heads/cassandra-3.0
Commit: a2f0da07315a13cd24a6f253b63c4bed6bfe6ed3
Parents: 98c4a7c c4de752
Author: Aleksey Yeschenko <al...@apache.org>
Authored: Fri Sep 18 12:40:25 2015 +0100
Committer: Aleksey Yeschenko <al...@apache.org>
Committed: Fri Sep 18 12:40:25 2015 +0100

----------------------------------------------------------------------
 CHANGES.txt                                           |  1 +
 .../locator/GossipingPropertyFileSnitch.java          | 14 +++++++++-----
 .../apache/cassandra/locator/PropertyFileSnitch.java  | 14 +++++++++-----
 .../org/apache/cassandra/locator/TokenMetadata.java   |  2 ++
 .../locator/YamlFileNetworkTopologySnitch.java        | 10 ++++++----
 .../org/apache/cassandra/service/StorageService.java  |  3 ++-
 6 files changed, 29 insertions(+), 15 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/a2f0da07/CHANGES.txt
----------------------------------------------------------------------
diff --cc CHANGES.txt
index 166106d,658c19f..f629050
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@@ -1,50 -1,8 +1,51 @@@
 -2.0.17
 +2.1.10
 + * Prevent ALTER TYPE from creating circular references (CASSANDRA-10339)
 + * Fix cache handling of 2i and base tables (CASSANDRA-10155, 10359)
 + * Fix NPE in nodetool compactionhistory (CASSANDRA-9758)
 + * (Pig) support BulkOutputFormat as a URL parameter (CASSANDRA-7410)
 + * BATCH statement is broken in cqlsh (CASSANDRA-10272)
 + * Added configurable warning threshold for GC duration (CASSANDRA-8907)
 + * (cqlsh) Make cqlsh PEP8 compliant (CASSANDRA-10066)
 + * (cqlsh) Fix error when starting cqlsh with --debug (CASSANDRA-10282)
 + * Scrub, Cleanup and Upgrade do not unmark compacting until all operations
 +   have completed, regardless of the occurence of exceptions (CASSANDRA-10274)
 + * Fix handling of streaming EOF (CASSANDRA-10206)
 + * Only check KeyCache when it is enabled
 + * Change streaming_socket_timeout_in_ms default to 1 hour (CASSANDRA-8611)
 + * (cqlsh) update list of CQL keywords (CASSANDRA-9232)
 +Merged from 2.0:
+  * Fix rare race where older gossip states can be shadowed (CASSANDRA-10366)
   * Fix consolidating racks violating the RF contract (CASSANDRA-10238)
   * Disallow decommission when node is in drained state (CASSANDRA-8741)
 - * Backport CASSANDRA-8013 to 2.0 (CASSANDRA-10144)
 +
 +
 +2.1.9
 + * Avoid race condition during read repair (CASSANDRA-9460)
 + * (cqlsh) default load-from-file encoding to utf-8 (CASSANDRA-9898)
 + * Avoid returning Permission.NONE when failing to query users table (CASSANDRA-10168)
 + * (cqlsh) Allow encoding to be set through command line (CASSANDRA-10004)
 + * Add new JMX methods to change local compaction strategy (CASSANDRA-9965)
 + * Write hints for paxos commits (CASSANDRA-7342)
 + * (cqlsh) Fix timestamps before 1970 on Windows, always
 +   use UTC for timestamp display (CASSANDRA-10000)
 + * (cqlsh) Avoid overwriting new config file with old config
 +   when both exist (CASSANDRA-9777)
 + * Release snapshot selfRef when doing snapshot repair (CASSANDRA-9998)
 + * Cannot replace token does not exist - DN node removed as Fat Client (CASSANDRA-9871)
 + * Fix handling of enable/disable autocompaction (CASSANDRA-9899)
 + * Commit log segment recycling is disabled by default (CASSANDRA-9896)
 + * Add consistency level to tracing ouput (CASSANDRA-9827)
 + * Fix MarshalException when upgrading superColumn family (CASSANDRA-9582)
 + * Fix broken logging for "empty" flushes in Memtable (CASSANDRA-9837)
 + * Handle corrupt files on startup (CASSANDRA-9686)
 + * Fix clientutil jar and tests (CASSANDRA-9760)
 + * (cqlsh) Allow the SSL protocol version to be specified through the
 +   config file or environment variables (CASSANDRA-9544)
 + * Remove repair snapshot leftover on startup (CASSANDRA-7357)
 + * Use random nodes for batch log when only 2 racks (CASSANDRA-8735)
 + * Ensure atomicity inside thrift and stream session (CASSANDRA-7757)
 + * Fix nodetool info error when the node is not joined (CASSANDRA-9031)
 +Merged from 2.0:
   * Make getFullyExpiredSSTables less expensive (CASSANDRA-9882)
   * Add tool to find why expired sstables are not getting dropped (CASSANDRA-10015)
   * Remove erroneous pending HH tasks from tpstats/jmx (CASSANDRA-9129)

http://git-wip-us.apache.org/repos/asf/cassandra/blob/a2f0da07/src/java/org/apache/cassandra/locator/GossipingPropertyFileSnitch.java
----------------------------------------------------------------------
diff --cc src/java/org/apache/cassandra/locator/GossipingPropertyFileSnitch.java
index da43600,dd1637d..f3f38a0
--- a/src/java/org/apache/cassandra/locator/GossipingPropertyFileSnitch.java
+++ b/src/java/org/apache/cassandra/locator/GossipingPropertyFileSnitch.java
@@@ -41,30 -38,23 +41,30 @@@ public class GossipingPropertyFileSnitc
      private static final Logger logger = LoggerFactory.getLogger(GossipingPropertyFileSnitch.class);
  
      private PropertyFileSnitch psnitch;
 -    private String myDC;
 -    private String myRack;
 +
 +    private volatile String myDC;
 +    private volatile String myRack;
 +    private volatile boolean preferLocal;
 +    private AtomicReference<ReconnectableSnitchHelper> snitchHelperReference;
 +    private volatile boolean gossipStarted;
 +
      private Map<InetAddress, Map<String, String>> savedEndpoints;
 -    private String DEFAULT_DC = "UNKNOWN_DC";
 -    private String DEFAULT_RACK = "UNKNOWN_RACK";
 -    private final boolean preferLocal;
 +    private static final String DEFAULT_DC = "UNKNOWN_DC";
 +    private static final String DEFAULT_RACK = "UNKNOWN_RACK";
  
 +    private static final int DEFAULT_REFRESH_PERIOD_IN_SECONDS = 60;
 +    
      public GossipingPropertyFileSnitch() throws ConfigurationException
      {
 -        myDC = SnitchProperties.get("dc", null);
 -        myRack = SnitchProperties.get("rack", null);
 -        if (myDC == null || myRack == null)
 -            throw new ConfigurationException("DC or rack not found in snitch properties, check your configuration in: " + SnitchProperties.RACKDC_PROPERTY_FILENAME);
 +        this(DEFAULT_REFRESH_PERIOD_IN_SECONDS);
 +    }
 +
 +    public GossipingPropertyFileSnitch(int refreshPeriodInSeconds) throws ConfigurationException
 +    {
 +        snitchHelperReference = new AtomicReference<ReconnectableSnitchHelper>();
 +
-         reloadConfiguration();
++        reloadConfiguration(false);
  
 -        myDC = myDC.trim();
 -        myRack = myRack.trim();
 -        preferLocal = Boolean.parseBoolean(SnitchProperties.get("prefer_local", "false"));
          try
          {
              psnitch = new PropertyFileSnitch();
@@@ -72,25 -62,7 +72,24 @@@
          }
          catch (ConfigurationException e)
          {
 -            logger.info("Unable to load " + PropertyFileSnitch.SNITCH_PROPERTIES_FILENAME + "; compatibility mode disabled");
 +            logger.info("Unable to load {}; compatibility mode disabled", PropertyFileSnitch.SNITCH_PROPERTIES_FILENAME);
 +        }
 +
 +        try
 +        {
 +            FBUtilities.resourceToFile(SnitchProperties.RACKDC_PROPERTY_FILENAME);
 +            Runnable runnable = new WrappedRunnable()
 +            {
 +                protected void runMayThrow() throws ConfigurationException
 +                {
-                     reloadConfiguration();
-                     StorageService.instance.updateTopology(FBUtilities.getBroadcastAddress());
++                    reloadConfiguration(true);
 +                }
 +            };
 +            ResourceWatcher.watch(SnitchProperties.RACKDC_PROPERTY_FILENAME, runnable, refreshPeriodInSeconds * 1000);
 +        }
 +        catch (ConfigurationException ex)
 +        {
 +            logger.error("{} found, but does not look like a plain file. Will not watch it for changes", SnitchProperties.RACKDC_PROPERTY_FILENAME);
          }
      }
  
@@@ -153,55 -125,8 +152,60 @@@
      public void gossiperStarting()
      {
          super.gossiperStarting();
 +
          Gossiper.instance.addLocalApplicationState(ApplicationState.INTERNAL_IP,
 -                                                   StorageService.instance.valueFactory.internalIP(FBUtilities.getLocalAddress().getHostAddress()));
 -        Gossiper.instance.register(new ReconnectableSnitchHelper(this, myDC, preferLocal));
 +                StorageService.instance.valueFactory.internalIP(FBUtilities.getLocalAddress().getHostAddress()));
 +
 +        reloadGossiperState();
 +
 +        gossipStarted = true;
 +    }
 +    
-     private void reloadConfiguration() throws ConfigurationException
++    private void reloadConfiguration(boolean isUpdate) throws ConfigurationException
 +    {
 +        final SnitchProperties properties = new SnitchProperties();
 +
 +        String newDc = properties.get("dc", null);
 +        String newRack = properties.get("rack", null);
 +        if (newDc == null || newRack == null)
 +            throw new ConfigurationException("DC or rack not found in snitch properties, check your configuration in: " + SnitchProperties.RACKDC_PROPERTY_FILENAME);
 +
 +        newDc = newDc.trim();
 +        newRack = newRack.trim();
 +        final boolean newPreferLocal = Boolean.parseBoolean(properties.get("prefer_local", "false"));
 +
 +        if (!newDc.equals(myDC) || !newRack.equals(myRack) || (preferLocal != newPreferLocal))
 +        {
 +            myDC = newDc;
 +            myRack = newRack;
 +            preferLocal = newPreferLocal;
 +
 +            reloadGossiperState();
 +
 +            if (StorageService.instance != null)
-                 StorageService.instance.getTokenMetadata().invalidateCachedRings();
++            {
++                if (isUpdate)
++                    StorageService.instance.updateTopology(FBUtilities.getBroadcastAddress());
++                else
++                    StorageService.instance.getTokenMetadata().invalidateCachedRings();
++            }
 +
 +            if (gossipStarted)
 +                StorageService.instance.gossipSnitchInfo();
 +        }
 +    }
 +
 +    private void reloadGossiperState()
 +    {
 +        if (Gossiper.instance != null)
 +        {
 +            ReconnectableSnitchHelper pendingHelper = new ReconnectableSnitchHelper(this, myDC, preferLocal);
 +            Gossiper.instance.register(pendingHelper);
 +            
 +            pendingHelper = snitchHelperReference.getAndSet(pendingHelper);
 +            if (pendingHelper != null)
 +                Gossiper.instance.unregister(pendingHelper);
 +        }
 +        // else this will eventually rerun at gossiperStarting()
      }
  }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/a2f0da07/src/java/org/apache/cassandra/locator/PropertyFileSnitch.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cassandra/blob/a2f0da07/src/java/org/apache/cassandra/locator/TokenMetadata.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cassandra/blob/a2f0da07/src/java/org/apache/cassandra/locator/YamlFileNetworkTopologySnitch.java
----------------------------------------------------------------------
diff --cc src/java/org/apache/cassandra/locator/YamlFileNetworkTopologySnitch.java
index 57fc1a3,b75fc28..4139662
--- a/src/java/org/apache/cassandra/locator/YamlFileNetworkTopologySnitch.java
+++ b/src/java/org/apache/cassandra/locator/YamlFileNetworkTopologySnitch.java
@@@ -102,9 -102,8 +102,9 @@@ public class YamlFileNetworkTopologySni
      YamlFileNetworkTopologySnitch(final String topologyConfigFilename)
              throws ConfigurationException
      {
 +        logger.warn("YamlFileNetworkTopologySnitch is deprecated; switch to GossipingPropertyFileSnitch instead");
          this.topologyConfigFilename = topologyConfigFilename;
-         loadTopologyConfiguration();
+         loadTopologyConfiguration(false);
  
          try
          {

http://git-wip-us.apache.org/repos/asf/cassandra/blob/a2f0da07/src/java/org/apache/cassandra/service/StorageService.java
----------------------------------------------------------------------


[4/4] cassandra git commit: Merge branch 'cassandra-2.2' into cassandra-3.0

Posted by al...@apache.org.
Merge branch 'cassandra-2.2' into cassandra-3.0


Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo
Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/3355caf1
Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/3355caf1
Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/3355caf1

Branch: refs/heads/cassandra-3.0
Commit: 3355caf15388b8e964948d5dcdc26babaf4e3eb2
Parents: b99c863 32457e7
Author: Aleksey Yeschenko <al...@apache.org>
Authored: Fri Sep 18 12:43:16 2015 +0100
Committer: Aleksey Yeschenko <al...@apache.org>
Committed: Fri Sep 18 12:43:16 2015 +0100

----------------------------------------------------------------------
 .../locator/GossipingPropertyFileSnitch.java          | 14 +++++++++-----
 .../apache/cassandra/locator/PropertyFileSnitch.java  | 14 +++++++++-----
 .../org/apache/cassandra/locator/TokenMetadata.java   |  2 ++
 .../org/apache/cassandra/service/StorageService.java  |  3 ++-
 4 files changed, 22 insertions(+), 11 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/3355caf1/src/java/org/apache/cassandra/locator/TokenMetadata.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cassandra/blob/3355caf1/src/java/org/apache/cassandra/service/StorageService.java
----------------------------------------------------------------------