You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by gd...@apache.org on 2010/02/08 20:38:17 UTC

svn commit: r907771 - /incubator/cassandra/trunk/src/java/org/apache/cassandra/service/StorageService.java

Author: gdusbabek
Date: Mon Feb  8 19:38:16 2010
New Revision: 907771

URL: http://svn.apache.org/viewvc?rev=907771&view=rev
Log:
Avoid deadlocks by creating all replication strategies when SS in instantiated. Patch by Gary Dusbabek, reviewed by Jonthan Ellis. CASSANDRA-778 (regression introduced in CASSANDRA-620).

Modified:
    incubator/cassandra/trunk/src/java/org/apache/cassandra/service/StorageService.java

Modified: incubator/cassandra/trunk/src/java/org/apache/cassandra/service/StorageService.java
URL: http://svn.apache.org/viewvc/incubator/cassandra/trunk/src/java/org/apache/cassandra/service/StorageService.java?rev=907771&r1=907770&r2=907771&view=diff
==============================================================================
--- incubator/cassandra/trunk/src/java/org/apache/cassandra/service/StorageService.java (original)
+++ incubator/cassandra/trunk/src/java/org/apache/cassandra/service/StorageService.java Mon Feb  8 19:38:16 2010
@@ -136,7 +136,7 @@
                                                                                    new NamedThreadFactory("CONSISTENCY-MANAGER"));
 
     /* We use this interface to determine where replicas need to be placed */
-    private Map<String, AbstractReplicationStrategy> replicationStrategies = new HashMap<String, AbstractReplicationStrategy>();
+    private Map<String, AbstractReplicationStrategy> replicationStrategies;
 
     /* Are we starting this node in bootstrap mode? */
     private boolean isBootstrapMode;
@@ -219,17 +219,23 @@
         MessagingService.instance.registerVerbHandlers(Verb.GOSSIP_DIGEST_SYN, new Gossiper.GossipDigestSynVerbHandler());
         MessagingService.instance.registerVerbHandlers(Verb.GOSSIP_DIGEST_ACK, new Gossiper.GossipDigestAckVerbHandler());
         MessagingService.instance.registerVerbHandlers(Verb.GOSSIP_DIGEST_ACK2, new Gossiper.GossipDigestAck2VerbHandler());
-    }
 
-    public synchronized AbstractReplicationStrategy getReplicationStrategy(String table)
-    {
-        AbstractReplicationStrategy strat = replicationStrategies.get(table);
-        if (strat == null)
+        replicationStrategies = new HashMap<String, AbstractReplicationStrategy>();
+        for (String table : DatabaseDescriptor.getNonSystemTables())
         {
-            strat = StorageService.getReplicationStrategy(tokenMetadata_, table);
+            AbstractReplicationStrategy strat = getReplicationStrategy(tokenMetadata_, table);
             replicationStrategies.put(table, strat);
         }
-        return strat;
+        replicationStrategies = Collections.unmodifiableMap(replicationStrategies);
+    }
+
+    public AbstractReplicationStrategy getReplicationStrategy(String table)
+    {
+        AbstractReplicationStrategy ars = replicationStrategies.get(table);
+        if (ars == null)
+            throw new RuntimeException(String.format("No replica strategy configured for %s", table));
+        else
+            return ars;
     }
 
     public static AbstractReplicationStrategy getReplicationStrategy(TokenMetadata tokenMetadata, String table)