Author: jbellis
Date: Tue Apr 27 17:06:04 2010
New Revision: 938568

URL: http://svn.apache.org/viewvc?rev=938568&view=rev
Log:
move per-datacenter replication factor into datacenters.properties
patch by jbellis; reviewed by eevans for CASSANDRA-994

Added:
    cassandra/trunk/conf/datacenters.properties
    cassandra/trunk/test/conf/datacenters.properties
    
cassandra/trunk/test/unit/org/apache/cassandra/locator/DatacenterStrategyTest.java
Removed:
    
cassandra/trunk/src/java/org/apache/cassandra/locator/DatacenterEndpointSnitch.java
Modified:
    
cassandra/trunk/src/java/org/apache/cassandra/locator/DatacenterShardStrategy.java
    
cassandra/trunk/src/java/org/apache/cassandra/service/DatacenterSyncWriteResponseHandler.java
    
cassandra/trunk/src/java/org/apache/cassandra/service/DatacenterWriteResponseHandler.java

Added: cassandra/trunk/conf/datacenters.properties
URL: 
http://svn.apache.org/viewvc/cassandra/trunk/conf/datacenters.properties?rev=938568&view=auto
==============================================================================
--- cassandra/trunk/conf/datacenters.properties (added)
+++ cassandra/trunk/conf/datacenters.properties Tue Apr 27 17:06:04 2010
@@ -0,0 +1,20 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# datacenter=replication factor
+dc1=3
+dc2=5
+dc3=1

Modified: 
cassandra/trunk/src/java/org/apache/cassandra/locator/DatacenterShardStrategy.java
URL: 
http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/locator/DatacenterShardStrategy.java?rev=938568&r1=938567&r2=938568&view=diff
==============================================================================
--- 
cassandra/trunk/src/java/org/apache/cassandra/locator/DatacenterShardStrategy.java
 (original)
+++ 
cassandra/trunk/src/java/org/apache/cassandra/locator/DatacenterShardStrategy.java
 Tue Apr 27 17:06:04 2010
@@ -21,13 +21,16 @@ package org.apache.cassandra.locator;
  */
 
 
+import java.io.FileReader;
 import java.io.IOException;
 import java.io.IOError;
 import java.net.InetAddress;
+import java.net.URL;
 import java.net.UnknownHostException;
 import java.util.*;
 import java.util.Map.Entry;
 
+import org.apache.cassandra.config.ConfigurationException;
 import org.apache.cassandra.dht.Token;
 import org.apache.cassandra.service.*;
 import org.apache.cassandra.thrift.ConsistencyLevel;
@@ -50,6 +53,7 @@ public class DatacenterShardStrategy ext
     ArrayList<Token> tokens;
 
     private List<InetAddress> localEndpoints = new ArrayList<InetAddress>();
+    private static final String DATACENTER_PROPERTIES_FILENAME = 
"datacenters.properties";
 
     private List<InetAddress> getLocalEndpoints()
     {
@@ -65,15 +69,15 @@ public class DatacenterShardStrategy ext
      * This Method will get the required information of the Endpoint from the
      * DataCenterEndpointSnitch and poopulates this singleton class.
      */
-    private synchronized void loadEndpoints(TokenMetadata metadata) throws 
IOException
+    private synchronized void loadEndpoints(TokenMetadata metadata) throws 
UnknownHostException
     {
         this.tokens = new ArrayList<Token>(metadata.sortedTokens());
-        String localDC = 
((DatacenterEndpointSnitch)snitch_).getDatacenter(InetAddress.getLocalHost());
+        String localDC = 
((AbstractRackAwareSnitch)snitch_).getDatacenter(InetAddress.getLocalHost());
         dcMap = new HashMap<String, List<Token>>();
         for (Token token : this.tokens)
         {
             InetAddress endpoint = metadata.getEndpoint(token);
-            String dataCenter = 
((DatacenterEndpointSnitch)snitch_).getDatacenter(endpoint);
+            String dataCenter = 
((AbstractRackAwareSnitch)snitch_).getDatacenter(endpoint);
             if (dataCenter.equals(localDC))
             {
                 localEndpoints.add(endpoint);
@@ -92,7 +96,6 @@ public class DatacenterShardStrategy ext
             Collections.sort(valueList);
             dcMap.put(entry.getKey(), valueList);
         }
-        dcReplicationFactor = 
((DatacenterEndpointSnitch)snitch_).getMapReplicationFactor();
         for (Entry<String, Integer> entry : dcReplicationFactor.entrySet())
         {
             String datacenter = entry.getKey();
@@ -105,13 +108,33 @@ public class DatacenterShardStrategy ext
         }
     }
 
-    public DatacenterShardStrategy(TokenMetadata tokenMetadata, 
IEndpointSnitch snitch)
-    throws UnknownHostException
+    public DatacenterShardStrategy(TokenMetadata tokenMetadata, 
IEndpointSnitch snitch) throws ConfigurationException
     {
         super(tokenMetadata, snitch);
-        if ((!(snitch instanceof DatacenterEndpointSnitch)))
+        if (!(snitch instanceof AbstractRackAwareSnitch))
         {
-            throw new IllegalArgumentException("DatacenterShardStrategy 
requires DatacenterEndpointSnitch");
+            throw new IllegalArgumentException("DatacenterShardStrategy 
requires a rack-aware endpointsnitch");
+        }
+
+        // load replication factors for each DC
+        ClassLoader loader = PropertyFileSnitch.class.getClassLoader();
+        URL scpurl = loader.getResource(DATACENTER_PROPERTIES_FILENAME);
+        if (scpurl == null)
+            throw new ConfigurationException("unable to locate " + 
DATACENTER_PROPERTIES_FILENAME);
+
+        String rackPropertyFilename = scpurl.getFile();
+        try
+        {
+            Properties p = new Properties();
+            p.load(new FileReader(rackPropertyFilename));
+            for (Entry<Object, Object> entry : p.entrySet())
+            {
+                dcReplicationFactor.put((String)entry.getKey(), 
Integer.valueOf((String)entry.getValue()));
+            }
+        }
+        catch (IOException ioe)
+        {
+            throw new ConfigurationException("Could not process " + 
rackPropertyFilename, ioe);
         }
     }
 
@@ -224,4 +247,9 @@ public class DatacenterShardStrategy ext
         }
         return super.getWriteResponseHandler(blockFor, consistency_level, 
table);
     }
+
+    int getReplicationFactor(String datacenter)
+    {
+        return dcReplicationFactor.get(datacenter);
+    }
 }

Modified: 
cassandra/trunk/src/java/org/apache/cassandra/service/DatacenterSyncWriteResponseHandler.java
URL: 
http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/service/DatacenterSyncWriteResponseHandler.java?rev=938568&r1=938567&r2=938568&view=diff
==============================================================================
--- 
cassandra/trunk/src/java/org/apache/cassandra/service/DatacenterSyncWriteResponseHandler.java
 (original)
+++ 
cassandra/trunk/src/java/org/apache/cassandra/service/DatacenterSyncWriteResponseHandler.java
 Tue Apr 27 17:06:04 2010
@@ -29,7 +29,7 @@ import java.util.HashMap;
 import java.util.Map;
 
 import org.apache.cassandra.config.DatabaseDescriptor;
-import org.apache.cassandra.locator.DatacenterEndpointSnitch;
+import org.apache.cassandra.locator.AbstractRackAwareSnitch;
 import org.apache.cassandra.net.Message;
 
 /**
@@ -41,14 +41,14 @@ public class DatacenterSyncWriteResponse
 {
     private final Map<String, Integer> dcResponses = new HashMap<String, 
Integer>();
     private final Map<String, Integer> responseCounts;
-    private final DatacenterEndpointSnitch endpointSnitch;
+    private final AbstractRackAwareSnitch endpointSnitch;
 
     public DatacenterSyncWriteResponseHandler(Map<String, Integer> 
responseCounts, String table)
     {
         // Response is been managed by the map so make it 1 for the superclass.
         super(1, table);
         this.responseCounts = responseCounts;
-        endpointSnitch = (DatacenterEndpointSnitch) 
DatabaseDescriptor.getEndpointSnitch();
+        endpointSnitch = (AbstractRackAwareSnitch) 
DatabaseDescriptor.getEndpointSnitch();
     }
 
     @Override

Modified: 
cassandra/trunk/src/java/org/apache/cassandra/service/DatacenterWriteResponseHandler.java
URL: 
http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/service/DatacenterWriteResponseHandler.java?rev=938568&r1=938567&r2=938568&view=diff
==============================================================================
--- 
cassandra/trunk/src/java/org/apache/cassandra/service/DatacenterWriteResponseHandler.java
 (original)
+++ 
cassandra/trunk/src/java/org/apache/cassandra/service/DatacenterWriteResponseHandler.java
 Tue Apr 27 17:06:04 2010
@@ -29,7 +29,7 @@ import java.net.UnknownHostException;
 import java.util.concurrent.atomic.AtomicInteger;
 
 import org.apache.cassandra.config.DatabaseDescriptor;
-import org.apache.cassandra.locator.DatacenterEndpointSnitch;
+import org.apache.cassandra.locator.AbstractRackAwareSnitch;
 import org.apache.cassandra.net.Message;
 import org.apache.cassandra.utils.FBUtilities;
 
@@ -41,7 +41,7 @@ import org.apache.cassandra.utils.FBUtil
 public class DatacenterWriteResponseHandler extends WriteResponseHandler
 {
     private final AtomicInteger blockFor;
-    private final DatacenterEndpointSnitch endpointsnitch;
+    private final AbstractRackAwareSnitch endpointsnitch;
     private final InetAddress localEndpoint;
 
     public DatacenterWriteResponseHandler(int blockFor, String table)
@@ -49,7 +49,7 @@ public class DatacenterWriteResponseHand
         // Response is been managed by the map so the waitlist size really 
doesnt matter.
         super(blockFor, table);
         this.blockFor = new AtomicInteger(blockFor);
-        endpointsnitch = (DatacenterEndpointSnitch) 
DatabaseDescriptor.getEndpointSnitch();
+        endpointsnitch = (AbstractRackAwareSnitch) 
DatabaseDescriptor.getEndpointSnitch();
         localEndpoint = FBUtilities.getLocalAddress();
     }
 

Added: cassandra/trunk/test/conf/datacenters.properties
URL: 
http://svn.apache.org/viewvc/cassandra/trunk/test/conf/datacenters.properties?rev=938568&view=auto
==============================================================================
--- cassandra/trunk/test/conf/datacenters.properties (added)
+++ cassandra/trunk/test/conf/datacenters.properties Tue Apr 27 17:06:04 2010
@@ -0,0 +1,20 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# datacenter=replication factor
+dc1=3
+dc2=5
+dc3=1

Added: 
cassandra/trunk/test/unit/org/apache/cassandra/locator/DatacenterStrategyTest.java
URL: 
http://svn.apache.org/viewvc/cassandra/trunk/test/unit/org/apache/cassandra/locator/DatacenterStrategyTest.java?rev=938568&view=auto
==============================================================================
--- 
cassandra/trunk/test/unit/org/apache/cassandra/locator/DatacenterStrategyTest.java
 (added)
+++ 
cassandra/trunk/test/unit/org/apache/cassandra/locator/DatacenterStrategyTest.java
 Tue Apr 27 17:06:04 2010
@@ -0,0 +1,18 @@
+package org.apache.cassandra.locator;
+
+import org.junit.Test;
+
+import org.apache.cassandra.config.ConfigurationException;
+
+public class DatacenterStrategyTest
+{
+    @Test
+    public void testProperties() throws ConfigurationException
+    {
+        DatacenterShardStrategy strategy = new DatacenterShardStrategy(new 
TokenMetadata(), new RackInferringSnitch());
+        assert strategy.getReplicationFactor("dc1") == 3;
+        assert strategy.getReplicationFactor("dc2") == 5;
+        assert strategy.getReplicationFactor("dc3") == 1;
+    }
+
+}


Reply via email to