Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP

Loading…

Added Cassandra CQL binding. #145

Closed
wants to merge 1 commit into from

4 participants

@cmatser
Collaborator

Cassandra CQL is the newer query language for accessing Cassandra DB. It's been around for a while and seems to be the language of choice going forward with Cassandra. It's very similar to SQL. As such, the learning curve to using Cassandra is easier through CQL.

@apokluda

Hi,

I'm trying to use your patched version of YCSB to benchmark Cassandra 2.0.2 on a four node cluster; however, when I run YCSB, I see lots of TTransportExceptions in Cassandra's system log and NoHostAvailable exceptions reported by YCSB. My guess is that there is some sort of protocol version mismatch. Can you help me figure out what I'm doing wrong?

Thank you!

Exceptions in Cassandra's system log:

DEBUG [Thrift:16] 2013-12-01 18:48:58,509 CustomTThreadPoolServer.java (line 204) Thrift transport error occurred during processing of message.
org.apache.thrift.transport.TTransportException: Frame size (16777217) larger than max length (15728640)!
at org.apache.thrift.transport.TFramedTransport.readFrame(TFramedTransport.java:137)
at org.apache.thrift.transport.TFramedTransport.read(TFramedTransport.java:101)
at org.apache.thrift.transport.TTransport.readAll(TTransport.java:84)
at org.apache.thrift.protocol.TBinaryProtocol.readAll(TBinaryProtocol.java:362)
at org.apache.thrift.protocol.TBinaryProtocol.readI32(TBinaryProtocol.java:284)
at org.apache.thrift.protocol.TBinaryProtocol.readMessageBegin(TBinaryProtocol.java:191)
at org.apache.thrift.TBaseProcessor.process(TBaseProcessor.java:27)
at org.apache.cassandra.thrift.CustomTThreadPoolServer$WorkerProcess.run(CustomTThreadPoolServer.java:194)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:744)

Exceptions reported by YCSB:

com.yahoo.ycsb.DBException: com.datastax.driver.core.exceptions.NoHostAvailableException: All host(s) tried for query failed (tried: [ec2-54-208-12-98.compute-1.amazonaws.com/10.0.0.76, ec2-54-209-107-174.compute-1.amazonaws.com/10.0.0.206, ec2-54-209-105-163.compute-1.amazonaws.com/10.0.0.35, ec2-54-209-107-38.compute-1.amazonaws.com/10.0.0.190] - use getErrors() for details)
at com.yahoo.ycsb.db.CassandraCQLClient.init(CassandraCQLClient.java:158)
at com.yahoo.ycsb.DBWrapper.init(DBWrapper.java:63)
at com.yahoo.ycsb.ClientThread.run(Client.java:189)
Caused by: com.datastax.driver.core.exceptions.NoHostAvailableException: All host(s) tried for query failed (tried: [ec2-54-208-12-98.compute-1.amazonaws.com/10.0.0.76, ec2-54-209-107-174.compute-1.amazonaws.com/10.0.0.206, ec2-54-209-105-163.compute-1.amazonaws.com/10.0.0.35, ec2-54-209-107-38.compute-1.amazonaws.com/10.0.0.190] - use getErrors() for details)
at com.datastax.driver.core.ControlConnection.reconnectInternal(ControlConnection.java:186)
at com.datastax.driver.core.ControlConnection.connect(ControlConnection.java:81)
at com.datastax.driver.core.Cluster$Manager.init(Cluster.java:644)
at com.datastax.driver.core.Cluster$Manager.access$100(Cluster.java:586)
at com.datastax.driver.core.Cluster.(Cluster.java:69)
at com.datastax.driver.core.Cluster.buildFrom(Cluster.java:96)
at com.datastax.driver.core.Cluster$Builder.build(Cluster.java:567)
at com.yahoo.ycsb.db.CassandraCQLClient.init(CassandraCQLClient.java:131)
... 2 more

I figured it out. The cassandra-cql database layer seems to be using the wrong port number by default. I added port=9042 to the properties file that I'm using for the Cassandra workload and now it's working. Thanks for sharing your code.

@busbey
Collaborator

thanks for the contribution and sorry for the lag. I intend to merge this in by the end of the week. I just have a couple of feedback points.

If you're not still working on this, I can make the modifications myself.

@busbey busbey commented on the diff
@@ -67,7 +68,7 @@
<module>dynamodb</module>
<module>elasticsearch</module>
<!--<module>gemfire</module>-->
- <module>infinispan</module>
@busbey Collaborator
busbey added a note

please don't include changes to other modules. if infinispan currently isn't building, we can disable it as a different PR.

@cmatser Collaborator
cmatser added a note

Good point. Please update this PR for me.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
@busbey busbey commented on the diff
@@ -45,7 +45,8 @@
<properties>
<maven.assembly.version>2.2.1</maven.assembly.version>
<hbase.version>0.92.1</hbase.version>
- <cassandra.version>0.7.0</cassandra.version>
+ <cassandra.version>1.2.9</cassandra.version>
@busbey Collaborator
busbey added a note

does this change mean we can't work with pre-1.2 servers?

@cmatser Collaborator
cmatser added a note

I added the new binding as a separate class CassandraCQLClient and left the previous bindings untouched. So, you can use those with pre-1.2 servers. But this property is used in the maven build to pull in the right dependencies for the new CassandraCQLClient. I don't know if the dependencies for the pre-1.2 version are still being pulled in with this change.

I suppose I could have created a "cassandracql.version" property? Then both old and new jars would be pulled, but I'm skeptical about that working. Some dependency jars could get clobbered with older or newer versions. I might tend towards creating it as a separate binding completely, with its own directory if we need old and new to work side-by-side.

I'm not sure this answers your question. The folks at Datastax told me that Cassandra CQL was the direction of the data store moving forward. They did not recommend using the older binding. I did not test with it.

Thanks for your work! Unfortunately, I don't have access to the environment I had when I did this work, but I'll help as much as I can.

@busbey Collaborator
busbey added a note

that helps a bunch, thanks for getting back to me.

I suspect separate bindings are the way to go, but I agree that still working with older versions can be something we worry about later.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
@busbey busbey referenced this pull request from a commit in busbey/YCSB
@cmatser cmatser [cassandra] Added support for Cassandra CQL binding.
This includes changes to main pom for latest cassandra driver.

closes #145
d0b7f6f
@busbey busbey closed this pull request from a commit
@cmatser cmatser [cassandra] Added support for Cassandra CQL binding.
This includes changes to main pom for the v1.2.9 cassandra driver.

closes #145
5146047
@busbey busbey closed this in 5146047
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Commits on Oct 17, 2013
  1. @cmatser

    Added support for Cassandra CQL binding. This includes changes to mai…

    cmatser authored
    …n pom
    
    for latest cassandra driver.
This page is out of date. Refresh to see the latest.
View
1  bin/ycsb
@@ -28,6 +28,7 @@ DATABASES = {
"cassandra-7" : "com.yahoo.ycsb.db.CassandraClient7",
"cassandra-8" : "com.yahoo.ycsb.db.CassandraClient8",
"cassandra-10" : "com.yahoo.ycsb.db.CassandraClient10",
+ "cassandra-cql": "com.yahoo.ycsb.db.CassandraCQLClient",
"dynamodb" : "com.yahoo.ycsb.db.DynamoDBClient",
"elasticsearch": "com.yahoo.ycsb.db.ElasticSearchClient",
"gemfire" : "com.yahoo.ycsb.db.GemFireClient",
View
6 cassandra/pom.xml
@@ -17,6 +17,12 @@
<artifactId>cassandra-all</artifactId>
<version>${cassandra.version}</version>
</dependency>
+ <!-- CQL driver -->
+ <dependency>
+ <groupId>com.datastax.cassandra</groupId>
+ <artifactId>cassandra-driver-core</artifactId>
+ <version>${cassandra.cql.version}</version>
+ </dependency>
<dependency>
<groupId>com.yahoo.ycsb</groupId>
<artifactId>core</artifactId>
View
418 cassandra/src/main/java/com/yahoo/ycsb/db/CassandraCQLClient.java
@@ -0,0 +1,418 @@
+/**
+ * Copyright (c) 2013 Yahoo! Inc. All rights reserved.
+ *
+ * Licensed 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. See accompanying LICENSE file.
+ *
+ * Submitted by Chrisjan Matser on 10/11/2010.
+ */
+package com.yahoo.ycsb.db;
+
+import com.datastax.driver.core.*;
+import com.datastax.driver.core.querybuilder.Insert;
+import com.datastax.driver.core.querybuilder.QueryBuilder;
+import com.datastax.driver.core.querybuilder.Select;
+import com.yahoo.ycsb.*;
+import java.nio.ByteBuffer;
+
+import java.util.Map;
+import java.util.Set;
+import java.util.HashMap;
+import java.util.Vector;
+import java.util.concurrent.atomic.AtomicInteger;
+
+
+/**
+ * Tested with Cassandra 2.0, CQL client for YCSB framework
+ *
+ * In CQLSH, create keyspace and table. Something like:
+ * cqlsh> create keyspace ycsb
+ * WITH REPLICATION = {'class' : 'SimpleStrategy', 'replication_factor': 1 };
+ * cqlsh> create table usertable (
+ * y_id varchar primary key,
+ * field0 varchar,
+ * field1 varchar,
+ * field2 varchar,
+ * field3 varchar,
+ * field4 varchar,
+ * field5 varchar,
+ * field6 varchar,
+ * field7 varchar,
+ * field8 varchar,
+ * field9 varchar);
+ *
+ * @author cmatser
+ */
+public class CassandraCQLClient extends DB {
+
+ private static Cluster cluster = null;
+ private static Session session = null;
+
+ private static ConsistencyLevel readConsistencyLevel = ConsistencyLevel.ONE;
+ private static ConsistencyLevel writeConsistencyLevel = ConsistencyLevel.ONE;
+
+ public static final int OK = 0;
+ public static final int ERR = -1;
+
+ public static final String YCSB_KEY = "y_id";
+ public static final String KEYSPACE_PROPERTY = "cassandra.keyspace";
+ public static final String KEYSPACE_PROPERTY_DEFAULT = "ycsb";
+ public static final String USERNAME_PROPERTY = "cassandra.username";
+ public static final String PASSWORD_PROPERTY = "cassandra.password";
+
+ public static final String READ_CONSISTENCY_LEVEL_PROPERTY = "cassandra.readconsistencylevel";
+ public static final String READ_CONSISTENCY_LEVEL_PROPERTY_DEFAULT = "ONE";
+ public static final String WRITE_CONSISTENCY_LEVEL_PROPERTY = "cassandra.writeconsistencylevel";
+ public static final String WRITE_CONSISTENCY_LEVEL_PROPERTY_DEFAULT = "ONE";
+
+ /** Count the number of times initialized to teardown on the last {@link #cleanup()}. */
+ private static final AtomicInteger initCount = new AtomicInteger(0);
+
+ private static boolean _debug = false;
+
+ /**
+ * Initialize any state for this DB. Called once per DB instance; there is
+ * one DB instance per client thread.
+ */
+ @Override
+ public void init() throws DBException {
+
+ //Keep track of number of calls to init (for later cleanup)
+ initCount.incrementAndGet();
+
+ //Synchronized so that we only have a single
+ // cluster/session instance for all the threads.
+ synchronized (initCount) {
+
+ //Check if the cluster has already been initialized
+ if (cluster != null) {
+ return;
+ }
+
+ try {
+
+ _debug = Boolean.parseBoolean(getProperties().getProperty("debug", "false"));
+
+ String host = getProperties().getProperty("host");
+ if (host == null) {
+ throw new DBException("Required property \"host\" missing for CassandraClient");
+ }
+ String hosts[] = host.split(" ");
+ String port = getProperties().getProperty("port", "9160");
+ if (port == null) {
+ throw new DBException("Required property \"port\" missing for CassandraClient");
+ }
+
+ String username = getProperties().getProperty(USERNAME_PROPERTY);
+ String password = getProperties().getProperty(PASSWORD_PROPERTY);
+
+ String keyspace = getProperties().getProperty(KEYSPACE_PROPERTY, KEYSPACE_PROPERTY_DEFAULT);
+
+ readConsistencyLevel = ConsistencyLevel.valueOf(getProperties().getProperty(READ_CONSISTENCY_LEVEL_PROPERTY, READ_CONSISTENCY_LEVEL_PROPERTY_DEFAULT));
+ writeConsistencyLevel = ConsistencyLevel.valueOf(getProperties().getProperty(WRITE_CONSISTENCY_LEVEL_PROPERTY, WRITE_CONSISTENCY_LEVEL_PROPERTY_DEFAULT));
+
+ // public void connect(String node) {}
+ if ((username != null) && !username.isEmpty()) {
+ cluster = Cluster.builder()
+ .withCredentials(username, password)
+ .withPort(Integer.valueOf(port))
+ .addContactPoints(hosts).build();
+ }
+ else {
+ cluster = Cluster.builder()
+ .withPort(Integer.valueOf(port))
+ .addContactPoints(hosts).build();
+ }
+
+ //Update number of connections based on threads
+ int threadcount = Integer.parseInt(getProperties().getProperty("threadcount","1"));
+ cluster.getConfiguration().getPoolingOptions().setMaxConnectionsPerHost(HostDistance.LOCAL, threadcount);
+
+ //Set connection timeout 3min (default is 5s)
+ cluster.getConfiguration().getSocketOptions().setConnectTimeoutMillis(3*60*1000);
+ //Set read (execute) timeout 3min (default is 12s)
+ cluster.getConfiguration().getSocketOptions().setReadTimeoutMillis(3*60*1000);
+
+ Metadata metadata = cluster.getMetadata();
+ System.out.printf("Connected to cluster: %s\n", metadata.getClusterName());
+
+ for (Host discoveredHost : metadata.getAllHosts()) {
+ System.out.printf("Datacenter: %s; Host: %s; Rack: %s\n",
+ discoveredHost.getDatacenter(),
+ discoveredHost.getAddress(),
+ discoveredHost.getRack());
+ }
+
+ session = cluster.connect(keyspace);
+
+ } catch (Exception e) {
+ throw new DBException(e);
+ }
+ }//synchronized
+ }
+
+ /**
+ * Cleanup any state for this DB. Called once per DB instance; there is one
+ * DB instance per client thread.
+ */
+ @Override
+ public void cleanup() throws DBException {
+ if (initCount.decrementAndGet() <= 0) {
+ cluster.shutdown();
+ }
+ }
+
+ /**
+ * Read a record from the database. Each field/value pair from the result
+ * will be stored in a HashMap.
+ *
+ * @param table The name of the table
+ * @param key The record key of the record to read.
+ * @param fields The list of fields to read, or null for all of them
+ * @param result A HashMap of field/value pairs for the result
+ * @return Zero on success, a non-zero error code on error
+ */
+ @Override
+ public int read(String table, String key, Set<String> fields, HashMap<String, ByteIterator> result) {
+
+ try {
+ Statement stmt;
+ Select.Builder selectBuilder;
+
+ if (fields == null) {
+ selectBuilder = QueryBuilder.select().all();
+ }
+ else {
+ selectBuilder = QueryBuilder.select();
+ for (String col : fields) {
+ ((Select.Selection) selectBuilder).column(col);
+ }
+ }
+
+ stmt = selectBuilder.from(table).where(QueryBuilder.eq(YCSB_KEY, key)).limit(1);
+ stmt.setConsistencyLevel(readConsistencyLevel);
+
+ if (_debug) {
+ System.out.println(stmt.toString());
+ }
+
+ ResultSet rs = session.execute(stmt);
+
+ //Should be only 1 row
+ if (!rs.isExhausted()) {
+ Row row = rs.one();
+ ColumnDefinitions cd = row.getColumnDefinitions();
+
+ for (ColumnDefinitions.Definition def : cd) {
+ ByteBuffer val = row.getBytesUnsafe(def.getName());
+ if (val != null) {
+ result.put(def.getName(),
+ new ByteArrayByteIterator(val.array()));
+ }
+ else {
+ result.put(def.getName(), null);
+ }
+ }
+
+ }
+
+ return OK;
+
+ } catch (Exception e) {
+ e.printStackTrace();
+ System.out.println("Error reading key: " + key);
+ return ERR;
+ }
+
+ }
+
+ /**
+ * Perform a range scan for a set of records in the database. Each
+ * field/value pair from the result will be stored in a HashMap.
+ *
+ * Cassandra CQL uses "token" method for range scan which doesn't always
+ * yield intuitive results.
+ *
+ * @param table The name of the table
+ * @param startkey The record key of the first record to read.
+ * @param recordcount The number of records to read
+ * @param fields The list of fields to read, or null for all of them
+ * @param result A Vector of HashMaps, where each HashMap is a set
+ * field/value pairs for one record
+ * @return Zero on success, a non-zero error code on error
+ */
+ @Override
+ public int scan(String table, String startkey, int recordcount, Set<String> fields, Vector<HashMap<String, ByteIterator>> result) {
+
+ try {
+ Statement stmt;
+ Select.Builder selectBuilder;
+
+ if (fields == null) {
+ selectBuilder = QueryBuilder.select().all();
+ }
+ else {
+ selectBuilder = QueryBuilder.select();
+ for (String col : fields) {
+ ((Select.Selection) selectBuilder).column(col);
+ }
+ }
+
+ stmt = selectBuilder.from(table);
+
+ //The statement builder is not setup right for tokens.
+ // So, we need to build it manually.
+ String initialStmt = stmt.toString();
+ StringBuilder scanStmt = new StringBuilder();
+ scanStmt.append(
+ initialStmt.substring(0, initialStmt.length()-1));
+ scanStmt.append(" WHERE ");
+ scanStmt.append(QueryBuilder.token(YCSB_KEY));
+ scanStmt.append(" >= ");
+ scanStmt.append("token('");
+ scanStmt.append(startkey);
+ scanStmt.append("')");
+ scanStmt.append(" LIMIT ");
+ scanStmt.append(recordcount);
+
+ stmt = new SimpleStatement(scanStmt.toString());
+ stmt.setConsistencyLevel(readConsistencyLevel);
+
+ if (_debug) {
+ System.out.println(stmt.toString());
+ }
+
+ ResultSet rs = session.execute(stmt);
+
+ HashMap<String, ByteIterator> tuple;
+ while (!rs.isExhausted()) {
+ Row row = rs.one();
+ tuple = new HashMap<String, ByteIterator> ();
+
+ ColumnDefinitions cd = row.getColumnDefinitions();
+
+ for (ColumnDefinitions.Definition def : cd) {
+ ByteBuffer val = row.getBytesUnsafe(def.getName());
+ if (val != null) {
+ tuple.put(def.getName(),
+ new ByteArrayByteIterator(val.array()));
+ }
+ else {
+ tuple.put(def.getName(), null);
+ }
+ }
+
+ result.add(tuple);
+ }
+
+ return OK;
+
+ } catch (Exception e) {
+ e.printStackTrace();
+ System.out.println("Error scanning with startkey: " + startkey);
+ return ERR;
+ }
+
+ }
+
+ /**
+ * Update a record in the database. Any field/value pairs in the specified
+ * values HashMap will be written into the record with the specified record
+ * key, overwriting any existing values with the same field name.
+ *
+ * @param table The name of the table
+ * @param key The record key of the record to write.
+ * @param values A HashMap of field/value pairs to update in the record
+ * @return Zero on success, a non-zero error code on error
+ */
+ @Override
+ public int update(String table, String key, HashMap<String, ByteIterator> values) {
+ //Insert and updates provide the same functionality
+ return insert(table, key, values);
+ }
+
+ /**
+ * Insert a record in the database. Any field/value pairs in the specified
+ * values HashMap will be written into the record with the specified record
+ * key.
+ *
+ * @param table The name of the table
+ * @param key The record key of the record to insert.
+ * @param values A HashMap of field/value pairs to insert in the record
+ * @return Zero on success, a non-zero error code on error
+ */
+ @Override
+ public int insert(String table, String key, HashMap<String, ByteIterator> values) {
+
+ try {
+ Insert insertStmt = QueryBuilder.insertInto(table);
+
+ //Add key
+ insertStmt.value(YCSB_KEY, key);
+
+ //Add fields
+ for (Map.Entry<String, ByteIterator> entry : values.entrySet()) {
+ Object value;
+ ByteIterator byteIterator = entry.getValue();
+ value = byteIterator.toString();
+
+ insertStmt.value(entry.getKey(), value);
+ }
+
+ insertStmt.setConsistencyLevel(writeConsistencyLevel);
+
+ if (_debug) {
+ System.out.println(insertStmt.toString());
+ }
+
+ ResultSet rs = session.execute(insertStmt);
+
+ return OK;
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+
+ return ERR;
+ }
+
+ /**
+ * Delete a record from the database.
+ *
+ * @param table The name of the table
+ * @param key The record key of the record to delete.
+ * @return Zero on success, a non-zero error code on error
+ */
+ @Override
+ public int delete(String table, String key) {
+
+ try {
+ Statement stmt;
+
+ stmt = QueryBuilder.delete().from(table).where(QueryBuilder.eq(YCSB_KEY, key));
+ stmt.setConsistencyLevel(writeConsistencyLevel);
+
+ if (_debug) {
+ System.out.println(stmt.toString());
+ }
+
+ ResultSet rs = session.execute(stmt);
+
+ return OK;
+ } catch (Exception e) {
+ e.printStackTrace();
+ System.out.println("Error deleting key: " + key);
+ }
+
+ return ERR;
+ }
+
+}
View
10 cassandra/src/main/java/com/yahoo/ycsb/db/CassandraClient7.java
@@ -431,13 +431,17 @@ public int insert(String table, String key, HashMap<String, ByteIterator> values
{
ByteBuffer wrappedKey = ByteBuffer.wrap(key.getBytes("UTF-8"));
+ Column col;
ColumnOrSuperColumn column;
for (Map.Entry<String, ByteIterator> entry : values.entrySet())
{
+ col = new Column();
+ col.setName(ByteBuffer.wrap(entry.getKey().getBytes("UTF-8")));
+ col.setValue(ByteBuffer.wrap(entry.getValue().toArray()));
+ col.setTimestamp(System.currentTimeMillis());
+
column = new ColumnOrSuperColumn();
- column.setColumn( new Column( ByteBuffer.wrap(entry.getKey().getBytes("UTF-8")),
- ByteBuffer.wrap(entry.getValue().toArray()),
- System.currentTimeMillis()) );
+ column.setColumn(col);
mutations.add(new Mutation().setColumn_or_supercolumn(column));
}
View
5 pom.xml
@@ -45,7 +45,8 @@
<properties>
<maven.assembly.version>2.2.1</maven.assembly.version>
<hbase.version>0.92.1</hbase.version>
- <cassandra.version>0.7.0</cassandra.version>
+ <cassandra.version>1.2.9</cassandra.version>
@busbey Collaborator
busbey added a note

does this change mean we can't work with pre-1.2 servers?

@cmatser Collaborator
cmatser added a note

I added the new binding as a separate class CassandraCQLClient and left the previous bindings untouched. So, you can use those with pre-1.2 servers. But this property is used in the maven build to pull in the right dependencies for the new CassandraCQLClient. I don't know if the dependencies for the pre-1.2 version are still being pulled in with this change.

I suppose I could have created a "cassandracql.version" property? Then both old and new jars would be pulled, but I'm skeptical about that working. Some dependency jars could get clobbered with older or newer versions. I might tend towards creating it as a separate binding completely, with its own directory if we need old and new to work side-by-side.

I'm not sure this answers your question. The folks at Datastax told me that Cassandra CQL was the direction of the data store moving forward. They did not recommend using the older binding. I did not test with it.

Thanks for your work! Unfortunately, I don't have access to the environment I had when I did this work, but I'll help as much as I can.

@busbey Collaborator
busbey added a note

that helps a bunch, thanks for getting back to me.

I suspect separate bindings are the way to go, but I agree that still working with older versions can be something we worry about later.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
+ <cassandra.cql.version>1.0.3</cassandra.cql.version>
<infinispan.version>7.1.0.CR1</infinispan.version>
<openjpa.jdbc.version>2.1.1</openjpa.jdbc.version>
<mapkeeper.version>1.0</mapkeeper.version>
@@ -67,7 +68,7 @@
<module>dynamodb</module>
<module>elasticsearch</module>
<!--<module>gemfire</module>-->
- <module>infinispan</module>
@busbey Collaborator
busbey added a note

please don't include changes to other modules. if infinispan currently isn't building, we can disable it as a different PR.

@cmatser Collaborator
cmatser added a note

Good point. Please update this PR for me.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
+ <!--<module>infinispan</module>-->
<module>jdbc</module>
<module>mapkeeper</module>
<module>mongodb</module>
Something went wrong with that request. Please try again.