You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@gora.apache.org by rm...@apache.org on 2014/06/25 19:40:54 UTC
git commit: GORA-347
Repository: gora
Updated Branches:
refs/heads/master 64443cc75 -> 41aae36e9
GORA-347
Project: http://git-wip-us.apache.org/repos/asf/gora/repo
Commit: http://git-wip-us.apache.org/repos/asf/gora/commit/41aae36e
Tree: http://git-wip-us.apache.org/repos/asf/gora/tree/41aae36e
Diff: http://git-wip-us.apache.org/repos/asf/gora/diff/41aae36e
Branch: refs/heads/master
Commit: 41aae36e900fc730ac60af2bf8283012310728b9
Parents: 64443cc
Author: Renato Marroquin <re...@public-docking-cx-1760.ethz.ch>
Authored: Wed Jun 25 19:40:24 2014 +0200
Committer: Renato Marroquin <re...@public-docking-cx-1760.ethz.ch>
Committed: Wed Jun 25 19:40:24 2014 +0200
----------------------------------------------------------------------
.../gora/cassandra/store/CassandraClient.java | 40 +++++++++++----
.../gora/cassandra/store/CassandraMapping.java | 53 ++++++++++++++++++--
.../gora/cassandra/store/HectorUtils.java | 27 ++++++++--
.../src/test/conf/gora-cassandra-mapping.xml | 41 +++++++++++++--
4 files changed, 141 insertions(+), 20 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/gora/blob/41aae36e/gora-cassandra/src/main/java/org/apache/gora/cassandra/store/CassandraClient.java
----------------------------------------------------------------------
diff --git a/gora-cassandra/src/main/java/org/apache/gora/cassandra/store/CassandraClient.java b/gora-cassandra/src/main/java/org/apache/gora/cassandra/store/CassandraClient.java
index 7d5ebd2..50ec240 100644
--- a/gora-cassandra/src/main/java/org/apache/gora/cassandra/store/CassandraClient.java
+++ b/gora-cassandra/src/main/java/org/apache/gora/cassandra/store/CassandraClient.java
@@ -116,8 +116,13 @@ public class CassandraClient<K, T extends PersistentBase> {
cfDef.setComparatorType(ComparatorType.BYTESTYPE);
}
- keyspaceDefinition = HFactory.createKeyspaceDefinition(this.cassandraMapping.getKeyspaceName(),
- "org.apache.cassandra.locator.SimpleStrategy", 1, columnFamilyDefinitions);
+ keyspaceDefinition = HFactory.createKeyspaceDefinition(
+ this.cassandraMapping.getKeyspaceName(),
+ this.cassandraMapping.getKeyspaceReplicationStrategy(),
+ this.cassandraMapping.getKeyspaceReplicationFactor(),
+ columnFamilyDefinitions
+ );
+
this.cluster.addKeyspace(keyspaceDefinition, true);
// LOG.info("Keyspace '" + this.cassandraMapping.getKeyspaceName() + "' in cluster '" + this.cassandraMapping.getClusterName() + "' was created on host '" + this.cassandraMapping.getHostName() + "'");
@@ -174,20 +179,30 @@ public class CassandraClient<K, T extends PersistentBase> {
*/
public void addColumn(K key, String fieldName, Object value) {
if (value == null) {
+ LOG.debug( "field:"+fieldName+", its value is null.");
return;
}
ByteBuffer byteBuffer = toByteBuffer(value);
String columnFamily = this.cassandraMapping.getFamily(fieldName);
String columnName = this.cassandraMapping.getColumn(fieldName);
- String ttlAttr = this.cassandraMapping.getColumnsAttribs().get(fieldName);
- if (ttlAttr == null)
- ttlAttr = CassandraMapping.DEFAULT_COLUMNS_TTL;
-
+
if (columnName == null) {
- LOG.warn("Column name is null for field=" + fieldName + " with value=" + value.toString());
- return;
+ LOG.warn("Column name is null for field=" + fieldName );
+ return;
+ }
+
+ if( LOG.isDebugEnabled() ) LOG.debug( "fieldName:"+fieldName +" columnName:" + columnName );
+
+ String ttlAttr = this.cassandraMapping.getColumnsAttribs().get(columnName);
+
+ if ( null == ttlAttr ){
+ ttlAttr = CassandraMapping.DEFAULT_COLUMNS_TTL;
+ if( LOG.isDebugEnabled() ) LOG.debug( "ttl was not set for field:" + fieldName + " .Using " + ttlAttr );
+ } else {
+ if( LOG.isDebugEnabled() ) LOG.debug( "ttl for field:" + fieldName + " is " + ttlAttr );
}
+
synchronized(mutator) {
HectorUtils.insertColumn(mutator, key, columnFamily, columnName, byteBuffer, ttlAttr);
}
@@ -230,9 +245,14 @@ public class CassandraClient<K, T extends PersistentBase> {
String columnFamily = this.cassandraMapping.getFamily(fieldName);
String superColumnName = this.cassandraMapping.getColumn(fieldName);
- String ttlAttr = this.cassandraMapping.getColumnsAttribs().get(fieldName);
- if (ttlAttr == null)
+ String ttlAttr = this.cassandraMapping.getColumnsAttribs().get(superColumnName);
+ if ( null == ttlAttr ) {
ttlAttr = CassandraMapping.DEFAULT_COLUMNS_TTL;
+ if( LOG.isDebugEnabled() ) LOG.debug( "ttl was not set for field:" + fieldName + " .Using " + ttlAttr );
+ } else {
+ if( LOG.isDebugEnabled() ) LOG.debug( "ttl for field:" + fieldName + " is " + ttlAttr );
+ }
+
synchronized(mutator) {
HectorUtils.insertSubColumn(mutator, key, columnFamily, superColumnName, columnName, byteBuffer, ttlAttr);
}
http://git-wip-us.apache.org/repos/asf/gora/blob/41aae36e/gora-cassandra/src/main/java/org/apache/gora/cassandra/store/CassandraMapping.java
----------------------------------------------------------------------
diff --git a/gora-cassandra/src/main/java/org/apache/gora/cassandra/store/CassandraMapping.java b/gora-cassandra/src/main/java/org/apache/gora/cassandra/store/CassandraMapping.java
index f8d5315..e3b1243 100644
--- a/gora-cassandra/src/main/java/org/apache/gora/cassandra/store/CassandraMapping.java
+++ b/gora-cassandra/src/main/java/org/apache/gora/cassandra/store/CassandraMapping.java
@@ -46,12 +46,19 @@ public class CassandraMapping {
private static final String GCGRACE_SECONDS_ATTRIBUTE = "gc_grace_seconds";
private static final String COLUMNS_TTL_ATTRIBUTE = "ttl";
- public static final String DEFAULT_COLUMNS_TTL = "60";
- public static final int DEFAULT_GCGRACE_SECONDS = 30;
+ private static final String REPLICATION_FACTOR_ATTRIBUTE = "replication_factor";
+ private static final String REPLICATION_STRATEGY_ATTRIBUTE = "placement_strategy";
+
+ public static final String DEFAULT_REPLICATION_FACTOR = "1";
+ public static final String DEFAULT_REPLICATION_STRATEGY = "org.apache.cassandra.locator.SimpleStrategy";
+ public static final String DEFAULT_COLUMNS_TTL = "0";
+ public static final String DEFAULT_GCGRACE_SECONDS = "0";
private String hostName;
private String clusterName;
private String keyspaceName;
+ private String keyspaceStrategy;
+ private int keyspaceRF;
/**
@@ -106,6 +113,22 @@ public class CassandraMapping {
public String getKeyspaceName() {
return this.keyspaceName;
}
+
+ /**
+ * gets the replication strategy
+ * @return string class name to be used for strategy
+ */
+ public String getKeyspaceReplicationStrategy() {
+ return this.keyspaceStrategy;
+ }
+
+ /**
+ * gets the replication factor
+ * @return int replication factor
+ */
+ public int getKeyspaceReplicationFactor() {
+ return this.keyspaceRF;
+ }
/**
* Primary class for loading Cassandra configuration from the 'MAPPING_FILE'.
@@ -149,6 +172,26 @@ public class CassandraMapping {
}
}
+ // setting replication strategy
+ this.keyspaceStrategy = keyspace.getAttributeValue( REPLICATION_STRATEGY_ATTRIBUTE );
+ if( null == this.keyspaceStrategy ) {
+ this.keyspaceStrategy = DEFAULT_REPLICATION_STRATEGY;
+ }
+ if( LOG.isDebugEnabled() ) {
+ LOG.debug( "setting Keyspace replication strategy to " + this.keyspaceStrategy );
+ }
+
+ // setting replication factor
+ String tmp = keyspace.getAttributeValue( REPLICATION_FACTOR_ATTRIBUTE );
+ if( null == tmp ) {
+ tmp = DEFAULT_REPLICATION_FACTOR;
+ }
+ this.keyspaceRF = Integer.parseInt( tmp );
+ if( LOG.isDebugEnabled() ) {
+ LOG.debug( "setting Keyspace replication factor to " + this.keyspaceRF );
+ }
+
+
// load column family definitions
List<Element> elements = keyspace.getChildren();
for (Element element: elements) {
@@ -166,7 +209,9 @@ public class CassandraMapping {
String gcgrace_scs = element.getAttributeValue(GCGRACE_SECONDS_ATTRIBUTE);
if (gcgrace_scs == null) {
LOG.warn("Error locating gc_grace_seconds attribute for '" + familyName + "' column family");
- LOG.warn("Using default set to: " + DEFAULT_GCGRACE_SECONDS);
+ LOG.warn("Using gc_grace_seconds default value which is: " + DEFAULT_GCGRACE_SECONDS
+ + " and is viable ONLY FOR A SINGLE NODE CLUSTER");
+ LOG.warn("please update the gora-cassandra-mapping.xml file to avoid seeing this warning");
} else {
if (LOG.isDebugEnabled()) {
LOG.debug("Located gc_grace_seconds: '" + gcgrace_scs + "'" );
@@ -191,7 +236,7 @@ public class CassandraMapping {
cfDef.setComparatorType(ComparatorType.BYTESTYPE);
cfDef.setDefaultValidationClass(ComparatorType.BYTESTYPE.getClassName());
- cfDef.setGcGraceSeconds(gcgrace_scs!=null?Integer.parseInt(gcgrace_scs):DEFAULT_GCGRACE_SECONDS);
+ cfDef.setGcGraceSeconds(Integer.parseInt( gcgrace_scs!=null?gcgrace_scs:DEFAULT_GCGRACE_SECONDS));
this.columnFamilyDefinitions.put(familyName, cfDef);
}
http://git-wip-us.apache.org/repos/asf/gora/blob/41aae36e/gora-cassandra/src/main/java/org/apache/gora/cassandra/store/HectorUtils.java
----------------------------------------------------------------------
diff --git a/gora-cassandra/src/main/java/org/apache/gora/cassandra/store/HectorUtils.java b/gora-cassandra/src/main/java/org/apache/gora/cassandra/store/HectorUtils.java
index da13f04..0c20cf7 100644
--- a/gora-cassandra/src/main/java/org/apache/gora/cassandra/store/HectorUtils.java
+++ b/gora-cassandra/src/main/java/org/apache/gora/cassandra/store/HectorUtils.java
@@ -48,15 +48,36 @@ public class HectorUtils<K,T extends Persistent> {
public static<K> HColumn<ByteBuffer,ByteBuffer> createColumn(ByteBuffer name, ByteBuffer value, String ttlAttr) {
- return HFactory.createColumn(name, value, ByteBufferSerializer.get(), ByteBufferSerializer.get()).setTtl(Integer.parseInt(ttlAttr));
+ int ttl = Integer.parseInt(ttlAttr);
+ HColumn<ByteBuffer,ByteBuffer> col = HFactory.createColumn(name, value, ByteBufferSerializer.get(), ByteBufferSerializer.get());
+
+ if( 0 < ttl ) {
+ col.setTtl( ttl );
+ }
+
+ return col;
}
public static<K> HColumn<String,ByteBuffer> createColumn(String name, ByteBuffer value, String ttlAttr) {
- return HFactory.createColumn(name, value, StringSerializer.get(), ByteBufferSerializer.get()).setTtl(Integer.parseInt(ttlAttr));
+ int ttl = Integer.parseInt(ttlAttr);
+ HColumn<String,ByteBuffer> col = HFactory.createColumn(name, value, StringSerializer.get(), ByteBufferSerializer.get());
+
+ if( 0 < ttl ) {
+ col.setTtl( ttl );
+ }
+
+ return col;
}
public static<K> HColumn<Integer,ByteBuffer> createColumn(Integer name, ByteBuffer value, String ttlAttr) {
- return HFactory.createColumn(name, value, IntegerSerializer.get(), ByteBufferSerializer.get()).setTtl(Integer.parseInt(ttlAttr));
+ int ttl = Integer.parseInt(ttlAttr);
+ HColumn<Integer,ByteBuffer> col = HFactory.createColumn(name, value, IntegerSerializer.get(), ByteBufferSerializer.get());
+
+ if( 0 < ttl ) {
+ col.setTtl( ttl );
+ }
+
+ return col;
}
http://git-wip-us.apache.org/repos/asf/gora/blob/41aae36e/gora-cassandra/src/test/conf/gora-cassandra-mapping.xml
----------------------------------------------------------------------
diff --git a/gora-cassandra/src/test/conf/gora-cassandra-mapping.xml b/gora-cassandra/src/test/conf/gora-cassandra-mapping.xml
index 70e411a..7aec1ca 100644
--- a/gora-cassandra/src/test/conf/gora-cassandra-mapping.xml
+++ b/gora-cassandra/src/test/conf/gora-cassandra-mapping.xml
@@ -17,18 +17,53 @@
limitations under the License.
-->
+<!--
+ The value of 'host' attribute of keyspace tag should match exactly what is in
+ gora.properties file. Essentially this means that if you are using port number, you should
+ use it every where regardless of whether it is the default port or not.
+ At runtime Gora will otherwise try to connect to localhost
+ https://issues.apache.org/jira/browse/GORA-269
+
+ The values of 'replication_factor' and 'placement_strategy' attribute of keyspace tag
+ only apply if gora create the kyespace. they have no effect if this is being used against
+ an existing keyspace. the default value for 'replication_factor' is '1'
+
+ The value of 'placement_strategy' should be a fully qualifed class name that is known to
+ the cassansra cluster, not the application or gora. As of this writing, the classes that ship
+ with cassandra are:
+ 'org.apache.cassandra.locator.SimpleStrategy'
+ 'org.apache.cassandra.locator.NetworkTopologyStrategy'
+ gora cassandra would use SimpleStrategy by default if no value for this attribute is specified
+
+ The default value of 'gc_grace_seconds' is '0' which is ONLY VIABLE FOR SINGLE NODE
+ CLUSTER. you should update this value according to your cluster configuration.
+ https://wiki.apache.org/cassandra/StorageConfiguration
+
+ The value of 'ttl' (time to live) attribute of field tag should most likely always
+ be zero unless you want Cassandra to create Tombstones and delete portions of your
+ data once this period expires. Any positive value is read and bound to the number
+ of seconds after which the value for that field will disappear. The default value of ttl
+ is '0'
+
+ More information on gora-cassandra configuration and mapping's can be found
+ at http://gora.apache.org/current/gora-cassandra.html
+-->
+
<gora-otd>
- <keyspace name="Employee" host="localhost" cluster="Gora Cassandra Test Cluster">
+ <keyspace name="Employee" host="localhost" placement_strategy="org.apache.cassandra.locator.SimpleStrategy"
+ replication_factor="1" cluster="Gora Cassandra Test Cluster">
<family name="p" gc_grace_seconds="5"/>
<family name="sc" type="super" />
</keyspace>
- <keyspace name="WebPage" host="localhost" cluster="Gora Cassandra Test Cluster">
+ <keyspace name="WebPage" host="localhost" placement_strategy="org.apache.cassandra.locator.SimpleStrategy"
+ replication_factor="1" cluster="Gora Cassandra Test Cluster">
<family name="p" gc_grace_seconds="5"/>
<family name="sc" type="super"/>
</keyspace>
- <keyspace name="TokenDatum" host="localhost" cluster="Gora Cassandra Test Cluster">
+ <keyspace name="TokenDatum" host="localhost" placement_strategy="org.apache.cassandra.locator.SimpleStrategy"
+ replication_factor="1" cluster="Gora Cassandra Test Cluster">
<family name="p" gc_grace_seconds="5"/>
<family name="sc" type="super"/>
</keyspace>