Repository: usergrid Updated Branches: refs/heads/master f91960371 -> 5095891dd
Initial commit introducing Datastax cassandra driver. Project: http://git-wip-us.apache.org/repos/asf/usergrid/repo Commit: http://git-wip-us.apache.org/repos/asf/usergrid/commit/a6319750 Tree: http://git-wip-us.apache.org/repos/asf/usergrid/tree/a6319750 Diff: http://git-wip-us.apache.org/repos/asf/usergrid/diff/a6319750 Branch: refs/heads/master Commit: a6319750e65d0b04aaa211e83ac220875120d9a5 Parents: a958b05 Author: Michael Russo <[email protected]> Authored: Mon Feb 8 18:04:36 2016 -0800 Committer: Michael Russo <[email protected]> Committed: Mon Feb 8 18:04:36 2016 -0800 ---------------------------------------------------------------------- stack/core/pom.xml | 810 ++++++++++--------- .../UniqueValueSerializationStrategyImpl.java | 2 +- stack/corepersistence/common/pom.xml | 40 + .../core/astyanax/CassandraConfig.java | 2 +- .../core/astyanax/CassandraConfigImpl.java | 10 +- .../persistence/core/astyanax/CassandraFig.java | 56 +- .../core/datastax/DataStaxCluster.java | 33 + .../core/datastax/DatastaxSessionProvider.java | 23 + .../core/datastax/impl/DatastaxClusterImpl.java | 169 ++++ .../persistence/core/guice/CommonModule.java | 4 + .../core/datastax/DatastaxClusterTest.java | 24 + stack/corepersistence/pom.xml | 1 + stack/pom.xml | 6 + stack/test-utils/pom.xml | 4 + 14 files changed, 765 insertions(+), 419 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/usergrid/blob/a6319750/stack/core/pom.xml ---------------------------------------------------------------------- diff --git a/stack/core/pom.xml b/stack/core/pom.xml index 76ff694..7083687 100644 --- a/stack/core/pom.xml +++ b/stack/core/pom.xml @@ -17,30 +17,30 @@ --> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> - <modelVersion>4.0.0</modelVersion> - <parent> - <groupId>org.apache.usergrid</groupId> - <artifactId>usergrid</artifactId> - <version>2.1.1-SNAPSHOT</version> - <relativePath>../</relativePath> - </parent> - - <artifactId>usergrid-core</artifactId> - <name>Usergrid Core</name> - <description>Core services for Usergrid system.</description> - <packaging>jar</packaging> - - <reporting> - <plugins> - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-javadoc-plugin</artifactId> - </plugin> - </plugins> - </reporting> - - - <build> + <modelVersion>4.0.0</modelVersion> + <parent> + <groupId>org.apache.usergrid</groupId> + <artifactId>usergrid</artifactId> + <version>2.1.1-SNAPSHOT</version> + <relativePath>../</relativePath> + </parent> + + <artifactId>usergrid-core</artifactId> + <name>Usergrid Core</name> + <description>Core services for Usergrid system.</description> + <packaging>jar</packaging> + + <reporting> + <plugins> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-javadoc-plugin</artifactId> + </plugin> + </plugins> + </reporting> + + + <build> <resources> <resource> @@ -55,384 +55,388 @@ </includes> </resource> </resources> - <testResources> - <testResource> - <directory>src/test/resources</directory> - <filtering>true</filtering> - <includes> - <include>**/*.yaml</include> - <include>**/*.properties</include> - <include>**/*.xml</include> - </includes> - </testResource> - <testResource> - <directory>src/test/resources</directory> - <filtering>true</filtering> - <includes> - <include>largeentity.json</include> - </includes> - </testResource> - </testResources> - - <plugins> - - <!-- - Do not need to configure surefire plugin here, parent POM configuration is sufficient. - --> - - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-jar-plugin</artifactId> - <executions> - <execution> - <id>test-jar-execution</id> - <phase>package</phase> - <goals> - <goal>test-jar</goal> - </goals> - <configuration> - <includes> - <include>**/org/apache/usergrid/**</include> - </includes> - </configuration> - </execution> - </executions> - </plugin> - - </plugins> - </build> - - <dependencies> - - - <!-- dependent on wiring guice and spring --> - <dependency> - <groupId>com.google.inject.extensions</groupId> - <artifactId>guice-spring</artifactId> - <version>4.0-beta5</version> - </dependency> - - <!-- Apache Dependencies --> - - <dependency> - <groupId>org.apache.cassandra</groupId> - <artifactId>cassandra-all</artifactId> - <!-- Exclude the old and problematic Snappy --> - <exclusions> - <exclusion> - <artifactId>snappy-java</artifactId> - <groupId>org.xerial.snappy</groupId> - </exclusion> - <exclusion> - <artifactId>antlr</artifactId> - <groupId>org.antlr</groupId> - </exclusion> - </exclusions> - </dependency> - - <dependency> - <groupId>org.apache.cassandra</groupId> - <artifactId>cassandra-thrift</artifactId> - </dependency> - - <!-- Include the slighly newer and less problematic snappy --> - <dependency> - <artifactId>snappy-java</artifactId> - <groupId>org.xerial.snappy</groupId> - <version>1.0.5</version> - </dependency> - - <dependency> - <groupId>org.apache.httpcomponents</groupId> - <artifactId>httpclient</artifactId> - </dependency> - - <dependency> - <groupId>commons-collections</groupId> - <artifactId>commons-collections</artifactId> - </dependency> - - <dependency> - <groupId>commons-io</groupId> - <artifactId>commons-io</artifactId> - </dependency> - - <dependency> - <groupId>commons-codec</groupId> - <artifactId>commons-codec</artifactId> - </dependency> - - <dependency> - <groupId>commons-lang</groupId> - <artifactId>commons-lang</artifactId> - </dependency> - - <dependency> - <groupId>commons-cli</groupId> - <artifactId>commons-cli</artifactId> - </dependency> - - <dependency> - <groupId>commons-beanutils</groupId> - <artifactId>commons-beanutils</artifactId> - </dependency> - - <!-- SUN, Javax Package, and Other Commercial Dependencies --> - - <dependency> - <groupId>com.beust</groupId> - <artifactId>jcommander</artifactId> - </dependency> - - <dependency> - <groupId>com.sun.mail</groupId> - <artifactId>javax.mail</artifactId> - </dependency> - - <dependency> - <groupId>javax.activation</groupId> - <artifactId>activation</artifactId> - </dependency> - - <dependency> - <groupId>javax.persistence</groupId> - <artifactId>persistence-api</artifactId> - </dependency> - - <dependency> - <groupId>com.fasterxml.uuid</groupId> - <artifactId>java-uuid-generator</artifactId> - </dependency> - - <dependency> - <groupId>com.hazelcast</groupId> - <artifactId>hazelcast-all</artifactId> - </dependency> - - <dependency> - <groupId>com.netflix.curator</groupId> - <artifactId>curator-recipes</artifactId> - </dependency> - - <dependency> - <groupId>com.netflix.astyanax</groupId> - <artifactId>astyanax-recipes</artifactId> - </dependency> - - <dependency> - <groupId>com.google.guava</groupId> - <artifactId>guava</artifactId> - </dependency> - - <!-- Codehaus, Spring and Other Org Dependencies --> - - <dependency> - <groupId>org.hectorclient</groupId> - <artifactId>hector-core</artifactId> - </dependency> - - <dependency> - <groupId>org.springframework</groupId> - <artifactId>spring-core</artifactId> - </dependency> - - <dependency> - <groupId>org.springframework</groupId> - <artifactId>spring-expression</artifactId> - </dependency> - - <dependency> - <groupId>org.springframework</groupId> - <artifactId>spring-beans</artifactId> - </dependency> - - <dependency> - <groupId>org.springframework</groupId> - <artifactId>spring-aop</artifactId> - </dependency> - - <dependency> - <groupId>aopalliance</groupId> - <artifactId>aopalliance</artifactId> - </dependency> - - <dependency> - <groupId>org.springframework</groupId> - <artifactId>spring-context</artifactId> - </dependency> - - <dependency> - <groupId>org.springframework</groupId> - <artifactId>spring-context-support</artifactId> - </dependency> - - <dependency> - <groupId>org.springframework</groupId> - <artifactId>spring-web</artifactId> - </dependency> - - <dependency> - <groupId>org.yaml</groupId> - <artifactId>snakeyaml</artifactId> - </dependency> - - <dependency> - <groupId>org.jsoup</groupId> - <artifactId>jsoup</artifactId> - </dependency> - - <dependency> - <groupId>org.perf4j</groupId> - <artifactId>perf4j</artifactId> - </dependency> - - <dependency> - <groupId>org.aspectj</groupId> - <artifactId>aspectjweaver</artifactId> - </dependency> - - <dependency> - <groupId>org.aspectj</groupId> - <artifactId>aspectjrt</artifactId> - </dependency> - - <dependency> - <groupId>cglib</groupId> - <artifactId>cglib-nodep</artifactId> - </dependency> - - <dependency> - <groupId>jline</groupId> - <artifactId>jline</artifactId> - </dependency> - - <dependency> - <groupId>org.jboss.netty</groupId> - <artifactId>netty</artifactId> - </dependency> - - <!-- Test and Logging Dependencies --> - - <dependency> - <groupId>org.apache.usergrid</groupId> - <artifactId>usergrid-config</artifactId> - <version>${project.version}</version> - <scope>test</scope> - <classifier>tests</classifier> - </dependency> - - <dependency> - <groupId>org.hectorclient</groupId> - <artifactId>hector-test</artifactId> - <scope>test</scope> - </dependency> - - - <dependency> - <groupId>org.mockito</groupId> - <artifactId>mockito-core</artifactId> - <version>${mockito.version}</version> - <scope>test</scope> - </dependency> - - <dependency> - <groupId>org.jvnet.mock-javamail</groupId> - <artifactId>mock-javamail</artifactId> - <scope>test</scope> - </dependency> - - <dependency> - <groupId>org.apache.usergrid</groupId> - <artifactId>usergrid-test-utils</artifactId> - <version>${project.version}</version> - <scope>test</scope> - </dependency> - - <dependency> - <groupId>org.springframework</groupId> - <artifactId>spring-test</artifactId> - <scope>test</scope> - </dependency> - - - <dependency> - <groupId>org.apache.usergrid</groupId> - <artifactId>common</artifactId> - <version>2.1.1-SNAPSHOT</version> - <type>test-jar</type> - <scope>test</scope> - </dependency> - - - <!-- Core Persistence deps --> - <dependency> - <groupId>org.apache.usergrid</groupId> - <artifactId>collection</artifactId> - <version>2.1.1-SNAPSHOT</version> - <type>jar</type> - <exclusions> - <exclusion> - <artifactId>antlr</artifactId> - <groupId>org.antlr</groupId> - </exclusion> - <exclusion> - <artifactId>antlr</artifactId> - <groupId>antlr</groupId> - </exclusion> - </exclusions> - </dependency> - - - <dependency> - <groupId>org.apache.usergrid</groupId> - <artifactId>queryindex</artifactId> - <version>2.1.1-SNAPSHOT</version> - <type>jar</type> - </dependency> - - <dependency> - <groupId>org.apache.usergrid</groupId> - <artifactId>graph</artifactId> - <version>2.1.1-SNAPSHOT</version> - <type>jar</type> - </dependency> - - <dependency> - <groupId>org.apache.usergrid</groupId> - <artifactId>map</artifactId> - <version>2.1.1-SNAPSHOT</version> - <type>jar</type> - </dependency> - - <dependency> - <groupId>org.apache.usergrid</groupId> - <artifactId>cache</artifactId> - <version>2.1.1-SNAPSHOT</version> - </dependency> - - <dependency> - <groupId>org.apache.usergrid</groupId> - <artifactId>queue</artifactId> - <version>2.1.1-SNAPSHOT</version> - <type>jar</type> - </dependency> - - <dependency> - <groupId>com.codahale.metrics</groupId> - <artifactId>metrics-core</artifactId> - <version>${metrics.version}</version> - </dependency> - - <dependency> - <groupId>com.codahale.metrics</groupId> - <artifactId>metrics-graphite</artifactId> - <version>${metrics.version}</version> - </dependency> - - </dependencies> - - <!-- - Do not need jacoco profile here because we do not override the surefire plugin in this POM - --> + <testResources> + <testResource> + <directory>src/test/resources</directory> + <filtering>true</filtering> + <includes> + <include>**/*.yaml</include> + <include>**/*.properties</include> + <include>**/*.xml</include> + </includes> + </testResource> + <testResource> + <directory>src/test/resources</directory> + <filtering>true</filtering> + <includes> + <include>largeentity.json</include> + </includes> + </testResource> + </testResources> + + <plugins> + + <!-- + Do not need to configure surefire plugin here, parent POM configuration is sufficient. + --> + + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-jar-plugin</artifactId> + <executions> + <execution> + <id>test-jar-execution</id> + <phase>package</phase> + <goals> + <goal>test-jar</goal> + </goals> + <configuration> + <includes> + <include>**/org/apache/usergrid/**</include> + </includes> + </configuration> + </execution> + </executions> + </plugin> + + </plugins> + </build> + + <dependencies> + + + <!-- dependent on wiring guice and spring --> + <dependency> + <groupId>com.google.inject.extensions</groupId> + <artifactId>guice-spring</artifactId> + <version>4.0-beta5</version> + </dependency> + + <!-- Apache Dependencies --> + + <dependency> + <groupId>org.apache.cassandra</groupId> + <artifactId>cassandra-all</artifactId> + <!-- Exclude the old and problematic Snappy --> + <exclusions> + <exclusion> + <artifactId>snappy-java</artifactId> + <groupId>org.xerial.snappy</groupId> + </exclusion> + <exclusion> + <artifactId>antlr</artifactId> + <groupId>org.antlr</groupId> + </exclusion> + <exclusion> + <groupId>net.jpountz.lz4</groupId> + <artifactId>*</artifactId> + </exclusion> + </exclusions> + </dependency> + + <dependency> + <groupId>org.apache.cassandra</groupId> + <artifactId>cassandra-thrift</artifactId> + </dependency> + + <!-- Include the slighly newer and less problematic snappy --> + <dependency> + <artifactId>snappy-java</artifactId> + <groupId>org.xerial.snappy</groupId> + <version>1.0.5</version> + </dependency> + + <dependency> + <groupId>org.apache.httpcomponents</groupId> + <artifactId>httpclient</artifactId> + </dependency> + + <dependency> + <groupId>commons-collections</groupId> + <artifactId>commons-collections</artifactId> + </dependency> + + <dependency> + <groupId>commons-io</groupId> + <artifactId>commons-io</artifactId> + </dependency> + + <dependency> + <groupId>commons-codec</groupId> + <artifactId>commons-codec</artifactId> + </dependency> + + <dependency> + <groupId>commons-lang</groupId> + <artifactId>commons-lang</artifactId> + </dependency> + + <dependency> + <groupId>commons-cli</groupId> + <artifactId>commons-cli</artifactId> + </dependency> + + <dependency> + <groupId>commons-beanutils</groupId> + <artifactId>commons-beanutils</artifactId> + </dependency> + + <!-- SUN, Javax Package, and Other Commercial Dependencies --> + + <dependency> + <groupId>com.beust</groupId> + <artifactId>jcommander</artifactId> + </dependency> + + <dependency> + <groupId>com.sun.mail</groupId> + <artifactId>javax.mail</artifactId> + </dependency> + + <dependency> + <groupId>javax.activation</groupId> + <artifactId>activation</artifactId> + </dependency> + + <dependency> + <groupId>javax.persistence</groupId> + <artifactId>persistence-api</artifactId> + </dependency> + + <dependency> + <groupId>com.fasterxml.uuid</groupId> + <artifactId>java-uuid-generator</artifactId> + </dependency> + + <dependency> + <groupId>com.hazelcast</groupId> + <artifactId>hazelcast-all</artifactId> + </dependency> + + <dependency> + <groupId>com.netflix.curator</groupId> + <artifactId>curator-recipes</artifactId> + </dependency> + + <dependency> + <groupId>com.netflix.astyanax</groupId> + <artifactId>astyanax-recipes</artifactId> + </dependency> + + <dependency> + <groupId>com.google.guava</groupId> + <artifactId>guava</artifactId> + </dependency> + + <!-- Codehaus, Spring and Other Org Dependencies --> + + <dependency> + <groupId>org.hectorclient</groupId> + <artifactId>hector-core</artifactId> + </dependency> + + <dependency> + <groupId>org.springframework</groupId> + <artifactId>spring-core</artifactId> + </dependency> + + <dependency> + <groupId>org.springframework</groupId> + <artifactId>spring-expression</artifactId> + </dependency> + + <dependency> + <groupId>org.springframework</groupId> + <artifactId>spring-beans</artifactId> + </dependency> + + <dependency> + <groupId>org.springframework</groupId> + <artifactId>spring-aop</artifactId> + </dependency> + + <dependency> + <groupId>aopalliance</groupId> + <artifactId>aopalliance</artifactId> + </dependency> + + <dependency> + <groupId>org.springframework</groupId> + <artifactId>spring-context</artifactId> + </dependency> + + <dependency> + <groupId>org.springframework</groupId> + <artifactId>spring-context-support</artifactId> + </dependency> + + <dependency> + <groupId>org.springframework</groupId> + <artifactId>spring-web</artifactId> + </dependency> + + <dependency> + <groupId>org.yaml</groupId> + <artifactId>snakeyaml</artifactId> + </dependency> + + <dependency> + <groupId>org.jsoup</groupId> + <artifactId>jsoup</artifactId> + </dependency> + + <dependency> + <groupId>org.perf4j</groupId> + <artifactId>perf4j</artifactId> + </dependency> + + <dependency> + <groupId>org.aspectj</groupId> + <artifactId>aspectjweaver</artifactId> + </dependency> + + <dependency> + <groupId>org.aspectj</groupId> + <artifactId>aspectjrt</artifactId> + </dependency> + + <dependency> + <groupId>cglib</groupId> + <artifactId>cglib-nodep</artifactId> + </dependency> + + <dependency> + <groupId>jline</groupId> + <artifactId>jline</artifactId> + </dependency> + + <dependency> + <groupId>org.jboss.netty</groupId> + <artifactId>netty</artifactId> + </dependency> + + <!-- Test and Logging Dependencies --> + + <dependency> + <groupId>org.apache.usergrid</groupId> + <artifactId>usergrid-config</artifactId> + <version>${project.version}</version> + <scope>test</scope> + <classifier>tests</classifier> + </dependency> + + <dependency> + <groupId>org.hectorclient</groupId> + <artifactId>hector-test</artifactId> + <scope>test</scope> + </dependency> + + + <dependency> + <groupId>org.mockito</groupId> + <artifactId>mockito-core</artifactId> + <version>${mockito.version}</version> + <scope>test</scope> + </dependency> + + <dependency> + <groupId>org.jvnet.mock-javamail</groupId> + <artifactId>mock-javamail</artifactId> + <scope>test</scope> + </dependency> + + <dependency> + <groupId>org.apache.usergrid</groupId> + <artifactId>usergrid-test-utils</artifactId> + <version>${project.version}</version> + <scope>test</scope> + </dependency> + + <dependency> + <groupId>org.springframework</groupId> + <artifactId>spring-test</artifactId> + <scope>test</scope> + </dependency> + + + <dependency> + <groupId>org.apache.usergrid</groupId> + <artifactId>common</artifactId> + <version>2.1.1-SNAPSHOT</version> + <type>test-jar</type> + <scope>test</scope> + </dependency> + + + <!-- Core Persistence deps --> + <dependency> + <groupId>org.apache.usergrid</groupId> + <artifactId>collection</artifactId> + <version>2.1.1-SNAPSHOT</version> + <type>jar</type> + <exclusions> + <exclusion> + <artifactId>antlr</artifactId> + <groupId>org.antlr</groupId> + </exclusion> + <exclusion> + <artifactId>antlr</artifactId> + <groupId>antlr</groupId> + </exclusion> + </exclusions> + </dependency> + + + <dependency> + <groupId>org.apache.usergrid</groupId> + <artifactId>queryindex</artifactId> + <version>2.1.1-SNAPSHOT</version> + <type>jar</type> + </dependency> + + <dependency> + <groupId>org.apache.usergrid</groupId> + <artifactId>graph</artifactId> + <version>2.1.1-SNAPSHOT</version> + <type>jar</type> + </dependency> + + <dependency> + <groupId>org.apache.usergrid</groupId> + <artifactId>map</artifactId> + <version>2.1.1-SNAPSHOT</version> + <type>jar</type> + </dependency> + + <dependency> + <groupId>org.apache.usergrid</groupId> + <artifactId>cache</artifactId> + <version>2.1.1-SNAPSHOT</version> + </dependency> + + <dependency> + <groupId>org.apache.usergrid</groupId> + <artifactId>queue</artifactId> + <version>2.1.1-SNAPSHOT</version> + <type>jar</type> + </dependency> + + <dependency> + <groupId>com.codahale.metrics</groupId> + <artifactId>metrics-core</artifactId> + <version>${metrics.version}</version> + </dependency> + + <dependency> + <groupId>com.codahale.metrics</groupId> + <artifactId>metrics-graphite</artifactId> + <version>${metrics.version}</version> + </dependency> + + </dependencies> + + <!-- + Do not need jacoco profile here because we do not override the surefire plugin in this POM + --> </project> http://git-wip-us.apache.org/repos/asf/usergrid/blob/a6319750/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyImpl.java ---------------------------------------------------------------------- diff --git a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyImpl.java b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyImpl.java index 622ebef..1795511 100644 --- a/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyImpl.java +++ b/stack/corepersistence/collection/src/main/java/org/apache/usergrid/persistence/collection/serialization/impl/UniqueValueSerializationStrategyImpl.java @@ -240,7 +240,7 @@ public abstract class UniqueValueSerializationStrategyImpl<FieldKey, EntityKey> @Override public UniqueValueSet load( final ApplicationScope colScope, final String type, final Collection<Field> fields ) throws ConnectionException { - return load( colScope, ConsistencyLevel.valueOf( cassandraFig.getReadCL() ), type, fields ); + return load( colScope, ConsistencyLevel.valueOf( cassandraFig.getAstyanaxReadCL() ), type, fields ); } http://git-wip-us.apache.org/repos/asf/usergrid/blob/a6319750/stack/corepersistence/common/pom.xml ---------------------------------------------------------------------- diff --git a/stack/corepersistence/common/pom.xml b/stack/corepersistence/common/pom.xml index b47706c..6b617cf 100644 --- a/stack/corepersistence/common/pom.xml +++ b/stack/corepersistence/common/pom.xml @@ -55,6 +55,12 @@ <groupId>org.apache.cassandra</groupId> <artifactId>cassandra-all</artifactId> <version>${cassandra.version}</version> + <exclusions> + <exclusion> + <groupId>net.jpountz.lz4</groupId> + <artifactId>*</artifactId> + </exclusion> + </exclusions> </dependency> <dependency> @@ -176,6 +182,40 @@ <artifactId>metrics-graphite</artifactId> <version>${metrics.version}</version> </dependency> + + <!-- Use the shaded jar dependency so we don't conflict on other Netty versions in the application --> + <dependency> + <groupId>com.datastax.cassandra</groupId> + <artifactId>cassandra-driver-core</artifactId> + <version>${datastax.version}</version> + <classifier>shaded</classifier> + <exclusions> + <exclusion> + <groupId>io.netty</groupId> + <artifactId>*</artifactId> + </exclusion> + </exclusions> + </dependency> + <dependency> + <groupId>com.datastax.cassandra</groupId> + <artifactId>cassandra-driver-mapping</artifactId> + <version>${datastax.version}</version> + <exclusions> + <exclusion> + <groupId>com.datastax.cassandra</groupId> + <artifactId>cassandra-driver-core</artifactId> + </exclusion> + </exclusions> + </dependency> + + <!-- LZ4 compression used for Datastax Java Driver: + https://datastax.github.io/java-driver/2.1.7/features/compression/ --> + <dependency> + <groupId>net.jpountz.lz4</groupId> + <artifactId>lz4</artifactId> + <version>1.2.0</version> + </dependency> + </dependencies> <profiles> http://git-wip-us.apache.org/repos/asf/usergrid/blob/a6319750/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/astyanax/CassandraConfig.java ---------------------------------------------------------------------- diff --git a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/astyanax/CassandraConfig.java b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/astyanax/CassandraConfig.java index dba3646..c506d2d 100644 --- a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/astyanax/CassandraConfig.java +++ b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/astyanax/CassandraConfig.java @@ -37,7 +37,7 @@ public interface CassandraConfig { ConsistencyLevel getReadCL(); /** - * Get the currently configured ReadCL that is more consitent than getReadCL + * Get the currently configured ReadCL that is more consitent than getAstyanaxReadCL * @return */ ConsistencyLevel getConsistentReadCL(); http://git-wip-us.apache.org/repos/asf/usergrid/blob/a6319750/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/astyanax/CassandraConfigImpl.java ---------------------------------------------------------------------- diff --git a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/astyanax/CassandraConfigImpl.java b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/astyanax/CassandraConfigImpl.java index 7373322..a9b37fd 100644 --- a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/astyanax/CassandraConfigImpl.java +++ b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/astyanax/CassandraConfigImpl.java @@ -45,13 +45,13 @@ public class CassandraConfigImpl implements CassandraConfig { @Inject public CassandraConfigImpl( final CassandraFig cassandraFig ) { - this.readCl = ConsistencyLevel.valueOf( cassandraFig.getReadCL() ); + this.readCl = ConsistencyLevel.valueOf( cassandraFig.getAstyanaxReadCL() ); - this.writeCl = ConsistencyLevel.valueOf( cassandraFig.getWriteCL() ); + this.writeCl = ConsistencyLevel.valueOf( cassandraFig.getAstyanaxWriteCL() ); this.shardSettings = parseShardSettings( cassandraFig.getShardValues() ); - this.consistentCl = ConsistencyLevel.valueOf(cassandraFig.getConsistentReadCL()); + this.consistentCl = ConsistencyLevel.valueOf(cassandraFig.getAstyanaxConsistentReadCL()); //add the listeners to update the values cassandraFig.addPropertyChangeListener( new PropertyChangeListener() { @@ -59,11 +59,11 @@ public class CassandraConfigImpl implements CassandraConfig { public void propertyChange( final PropertyChangeEvent evt ) { final String propName = evt.getPropertyName(); - if ( CassandraFig.READ_CL.equals( propName ) ) { + if ( CassandraFig.ASTYANAX_READ_CL.equals( propName ) ) { readCl = ConsistencyLevel.valueOf( evt.getNewValue().toString() ); } - else if ( CassandraFig.WRITE_CL.equals( propName ) ) { + else if ( CassandraFig.ASTYANAX_WRITE_CL.equals( propName ) ) { writeCl = ConsistencyLevel.valueOf( evt.getNewValue().toString() ); } else if (CassandraFig.SHARD_VALUES.equals(propName)){ http://git-wip-us.apache.org/repos/asf/usergrid/blob/a6319750/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/astyanax/CassandraFig.java ---------------------------------------------------------------------- diff --git a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/astyanax/CassandraFig.java b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/astyanax/CassandraFig.java index e30ba9c..78c4fbc 100644 --- a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/astyanax/CassandraFig.java +++ b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/astyanax/CassandraFig.java @@ -25,17 +25,22 @@ import org.safehaus.guicyfig.GuicyFig; import org.safehaus.guicyfig.Key; - /** * Cassandra configuration interface. */ @FigSingleton public interface CassandraFig extends GuicyFig { + // cassndra properties used by datastax driver + String READ_CL = "cassandra.readcl"; + String WRITE_CL = "cassandra.writecl"; + String STRATEGY = "cassandra.strategy"; + String STRATEGY_OPTIONS = "cassandra.strategy.options"; + // main application cassandra properties - String READ_CONSISTENT_CL = "usergrid.consistent.read.cl"; - String READ_CL = "usergrid.read.cl"; - String WRITE_CL = "usergrid.write.cl"; + String ASTYANAX_READ_CONSISTENT_CL = "usergrid.consistent.read.cl"; + String ASTYANAX_READ_CL = "usergrid.read.cl"; + String ASTYANAX_WRITE_CL = "usergrid.write.cl"; String SHARD_VALUES = "cassandra.shardvalues"; String THRIFT_TRANSPORT_SIZE = "cassandra.thrift.transport.frame"; @@ -54,6 +59,9 @@ public interface CassandraFig extends GuicyFig { // re-usable default values String DEFAULT_CONNECTION_POOLSIZE = "15"; String DEFAULT_LOCKS_EXPIRATION = "3600000"; // 1 hour + String DEFAULT_LOCAL_DC = ""; + String DEFAULT_USERNAME = ""; + String DEFAULT_PASSWORD = ""; @Key( "cassandra.hosts" ) @@ -75,7 +83,16 @@ public interface CassandraFig extends GuicyFig { @Default( "9160" ) int getThriftPort(); + @Key( "cassandra.username" ) + @Default( DEFAULT_USERNAME ) + String getUsername(); + + @Key( "cassandra.password" ) + @Default( DEFAULT_PASSWORD ) + String getPassword(); + @Key( "cassandra.datacenter.local" ) + @Default( DEFAULT_LOCAL_DC ) String getLocalDataCenter(); @Key( "cassandra.connections" ) @@ -86,22 +103,43 @@ public interface CassandraFig extends GuicyFig { @Default( "10000" ) int getTimeout(); + @Key( "cassandra.timeout.pool" ) + @Default( "5000" ) + int getPoolTimeout(); + @Key("cassandra.discovery") @Default( "RING_DESCRIBE" ) String getDiscoveryType(); @Default("CL_LOCAL_QUORUM") - @Key(READ_CL) - String getReadCL(); + @Key(ASTYANAX_READ_CL) + String getAstyanaxReadCL(); @Default("CL_QUORUM") - @Key(READ_CONSISTENT_CL) - String getConsistentReadCL(); + @Key(ASTYANAX_READ_CONSISTENT_CL) + String getAstyanaxConsistentReadCL(); @Default("CL_LOCAL_QUORUM") + @Key(ASTYANAX_WRITE_CL) + String getAstyanaxWriteCL(); + + + @Default("LOCAL_QUORUM") + @Key(READ_CL) + String getReadCl(); + + @Default("LOCAL_QUORUM") @Key(WRITE_CL) - String getWriteCL(); + String getWriteCl(); + + @Default("SimpleStrategy") + @Key( STRATEGY ) + String getStrategy(); + + @Default("replication_factor:1") + @Key( STRATEGY_OPTIONS ) + String getStrategyOptions(); /** * Return the history of all shard values which are immutable. For instance, if shard values http://git-wip-us.apache.org/repos/asf/usergrid/blob/a6319750/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/DataStaxCluster.java ---------------------------------------------------------------------- diff --git a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/DataStaxCluster.java b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/DataStaxCluster.java new file mode 100644 index 0000000..7515bf5 --- /dev/null +++ b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/DataStaxCluster.java @@ -0,0 +1,33 @@ +/* + * 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. + */ +package org.apache.usergrid.persistence.core.datastax; + + +import com.datastax.driver.core.Cluster; +import com.datastax.driver.core.Session; + +public interface DataStaxCluster { + + Cluster getCluster(); + + Session getClusterSession(); + + Session getApplicationSession(); + +} http://git-wip-us.apache.org/repos/asf/usergrid/blob/a6319750/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/DatastaxSessionProvider.java ---------------------------------------------------------------------- diff --git a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/DatastaxSessionProvider.java b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/DatastaxSessionProvider.java new file mode 100644 index 0000000..eeca763 --- /dev/null +++ b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/DatastaxSessionProvider.java @@ -0,0 +1,23 @@ +package org.apache.usergrid.persistence.core.datastax; + + +import com.datastax.driver.core.Session; +import com.google.inject.Inject; +import com.google.inject.Provider; + +public class DatastaxSessionProvider implements Provider<Session> { + + private final DataStaxCluster dataStaxCluster; + + @Inject + public DatastaxSessionProvider( final DataStaxCluster dataStaxCluster){ + + this.dataStaxCluster = dataStaxCluster; + } + + @Override + public Session get(){ + + return dataStaxCluster.getApplicationSession(); + } +} http://git-wip-us.apache.org/repos/asf/usergrid/blob/a6319750/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/impl/DatastaxClusterImpl.java ---------------------------------------------------------------------- diff --git a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/impl/DatastaxClusterImpl.java b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/impl/DatastaxClusterImpl.java new file mode 100644 index 0000000..0582c4e --- /dev/null +++ b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/datastax/impl/DatastaxClusterImpl.java @@ -0,0 +1,169 @@ +/* + * 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. + */ +package org.apache.usergrid.persistence.core.datastax.impl; + +import com.datastax.driver.core.*; +import com.datastax.driver.core.policies.DCAwareRoundRobinPolicy; +import com.datastax.driver.core.policies.LoadBalancingPolicy; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.google.inject.Inject; +import com.google.inject.Singleton; +import org.apache.usergrid.persistence.core.astyanax.CassandraFig; +import org.apache.usergrid.persistence.core.datastax.DataStaxCluster; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + + +@Singleton +public class DatastaxClusterImpl implements DataStaxCluster { + + private static final Logger logger = LoggerFactory.getLogger( DatastaxClusterImpl.class ); + + + private final CassandraFig cassandraFig; + private final Cluster cluster; + private Session applicationSession; + private Session clusterSession; + + @Inject + public DatastaxClusterImpl( final CassandraFig cassandraFig ) throws Exception { + this.cassandraFig = cassandraFig; + + ConsistencyLevel defaultConsistencyLevel; + try { + defaultConsistencyLevel = ConsistencyLevel.valueOf(cassandraFig.getReadCl()); + } catch (IllegalArgumentException e){ + + logger.error("Unable to parse provided consistency level in property: {}, defaulting to: {}", + CassandraFig.READ_CL, + ConsistencyLevel.LOCAL_QUORUM); + + defaultConsistencyLevel = ConsistencyLevel.LOCAL_QUORUM; + } + + + LoadBalancingPolicy loadBalancingPolicy; + if( !cassandraFig.getLocalDataCenter().isEmpty() ){ + + loadBalancingPolicy = new DCAwareRoundRobinPolicy.Builder() + .withLocalDc( cassandraFig.getLocalDataCenter() ).build(); + }else{ + loadBalancingPolicy = new DCAwareRoundRobinPolicy.Builder().build(); + } + + final PoolingOptions poolingOptions = new PoolingOptions() + .setCoreConnectionsPerHost(HostDistance.LOCAL, cassandraFig.getConnections() / 2) + .setMaxConnectionsPerHost(HostDistance.LOCAL, cassandraFig.getConnections()) + .setIdleTimeoutSeconds(cassandraFig.getTimeout() / 1000) + .setPoolTimeoutMillis(cassandraFig.getPoolTimeout()); + + final QueryOptions queryOptions = new QueryOptions() + .setConsistencyLevel(defaultConsistencyLevel); + + final Cluster.Builder datastaxCluster = Cluster.builder() + .withClusterName(cassandraFig.getClusterName()) + .addContactPoints(cassandraFig.getHosts().split(",")) + .withCompression(ProtocolOptions.Compression.LZ4) + .withLoadBalancingPolicy(loadBalancingPolicy) + .withPoolingOptions(poolingOptions) + .withQueryOptions(queryOptions) + .withProtocolVersion(ProtocolVersion.NEWEST_SUPPORTED); + + // only add auth credentials if they were provided + if ( !cassandraFig.getUsername().isEmpty() && !cassandraFig.getPassword().isEmpty() ){ + datastaxCluster.withCredentials( + cassandraFig.getUsername(), + cassandraFig.getPassword() + ); + } + + this.cluster = datastaxCluster.build(); + this.clusterSession = cluster.connect(); + logger.info("Initialized datastax client cluster. Hosts={}, Idle Timeout={}s, Request Timeout={}s", + cluster.getMetadata().getAllHosts().toString(), + cluster.getConfiguration().getPoolingOptions().getIdleTimeoutSeconds(), + cluster.getConfiguration().getPoolingOptions().getPoolTimeoutMillis() / 1000); + + logger.info("Creating keyspaces if they do not already exist."); + createKeyspaces(); + this.applicationSession = cluster.connect( "\""+cassandraFig.getApplicationKeyspace()+"\"" ); + + + + + } + + public Cluster getCluster(){ + return cluster; + } + + public Session getClusterSession(){ + return clusterSession; + } + + public Session getApplicationSession(){ + return applicationSession; + } + + private void createKeyspaces() throws Exception{ + + final String createApplicationKeyspace = String.format( + "CREATE KEYSPACE IF NOT EXISTS \"%s\" WITH replication = %s", + cassandraFig.getApplicationKeyspace(), + getFormattedReplication( cassandraFig.getStrategy(), cassandraFig.getStrategyOptions() ) + + ); + + final String createLocksKeyspace = String.format( + "CREATE KEYSPACE IF NOT EXISTS \"%s\" WITH replication = %s", + cassandraFig.getLocksKeyspace(), + getFormattedReplication( + cassandraFig.getLocksKeyspaceStrategy(), + cassandraFig.getLocksKeyspaceReplication() + ) + ); + + logger.info("Creating application keyspace with the following CQL: {}", createApplicationKeyspace); + clusterSession.execute(createApplicationKeyspace); + + logger.info("Creating locks keyspace with the following CQL: {}", createLocksKeyspace); + clusterSession.execute(createLocksKeyspace); + + + } + + private String getFormattedReplication(String strategy, String strategyOptions) throws JsonProcessingException{ + + Map<String, String> replicationSettings = new HashMap<>(); + replicationSettings.put("class", strategy); + String[] strategyOptionsSplit = strategyOptions.split(","); + for ( String option : strategyOptionsSplit){ + String[] splitOptions = option.split(":"); + replicationSettings.put(splitOptions[0], splitOptions[1]); + } + ObjectMapper mapper = new ObjectMapper(); + return mapper.writeValueAsString(replicationSettings).replace("\"", "'"); + } + +} http://git-wip-us.apache.org/repos/asf/usergrid/blob/a6319750/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/guice/CommonModule.java ---------------------------------------------------------------------- diff --git a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/guice/CommonModule.java b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/guice/CommonModule.java index f7a9926..a06a6e7 100644 --- a/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/guice/CommonModule.java +++ b/stack/corepersistence/common/src/main/java/org/apache/usergrid/persistence/core/guice/CommonModule.java @@ -21,6 +21,7 @@ package org.apache.usergrid.persistence.core.guice; import com.netflix.astyanax.Keyspace; import org.apache.usergrid.persistence.core.astyanax.*; +import org.apache.usergrid.persistence.core.datastax.impl.DatastaxClusterImpl; import org.safehaus.guicyfig.GuicyFigModule; import org.apache.usergrid.persistence.core.consistency.TimeService; @@ -61,6 +62,9 @@ public class CommonModule extends AbstractModule { // bind our Cassandra cluster to the Astyanax Implementation bind(CassandraCluster.class).to(CassandraClusterImpl.class).asEagerSingleton(); + // bind our Datastax cluster + bind(DatastaxClusterImpl.class).asEagerSingleton(); + // bind our keyspace to the AstyanaxKeyspaceProvider bind(Keyspace.class).toProvider(AstyanaxKeyspaceProvider.class).asEagerSingleton(); http://git-wip-us.apache.org/repos/asf/usergrid/blob/a6319750/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/datastax/DatastaxClusterTest.java ---------------------------------------------------------------------- diff --git a/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/datastax/DatastaxClusterTest.java b/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/datastax/DatastaxClusterTest.java new file mode 100644 index 0000000..477a205 --- /dev/null +++ b/stack/corepersistence/common/src/test/java/org/apache/usergrid/persistence/core/datastax/DatastaxClusterTest.java @@ -0,0 +1,24 @@ +package org.apache.usergrid.persistence.core.datastax; + +/* + * 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. + */ +public class DatastaxClusterTest { + + //TODO +} http://git-wip-us.apache.org/repos/asf/usergrid/blob/a6319750/stack/corepersistence/pom.xml ---------------------------------------------------------------------- diff --git a/stack/corepersistence/pom.xml b/stack/corepersistence/pom.xml index 0d8609b..869cbd4 100644 --- a/stack/corepersistence/pom.xml +++ b/stack/corepersistence/pom.xml @@ -80,6 +80,7 @@ limitations under the License. <commons.collections.version>3.2.1</commons.collections.version> <commons.io.version>2.4</commons.io.version> <commons.lang.version>3.1</commons.lang.version> + <datastax.version>2.1.9</datastax.version> <elasticsearch.version>1.4.4</elasticsearch.version> <fasterxml-uuid.version>3.1.3</fasterxml-uuid.version> <guava.version>18.0</guava.version> http://git-wip-us.apache.org/repos/asf/usergrid/blob/a6319750/stack/pom.xml ---------------------------------------------------------------------- diff --git a/stack/pom.xml b/stack/pom.xml index f052bf9..2dd1034 100644 --- a/stack/pom.xml +++ b/stack/pom.xml @@ -467,6 +467,12 @@ <artifactId>snappy-java</artifactId> <groupId>org.xerial.snappy</groupId> </exclusion> + + <exclusion> + <groupId>net.jpountz.lz4</groupId> + <artifactId>*</artifactId> + + </exclusion> </exclusions> </dependency> http://git-wip-us.apache.org/repos/asf/usergrid/blob/a6319750/stack/test-utils/pom.xml ---------------------------------------------------------------------- diff --git a/stack/test-utils/pom.xml b/stack/test-utils/pom.xml index c104f0a..e07abf6 100644 --- a/stack/test-utils/pom.xml +++ b/stack/test-utils/pom.xml @@ -101,6 +101,10 @@ <artifactId>snappy-java</artifactId> <groupId>org.xerial.snappy</groupId> </exclusion> + <exclusion> + <groupId>net.jpountz.lz4</groupId> + <artifactId>*</artifactId> + </exclusion> </exclusions> </dependency>
