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;
+ }
+
+}