Updated Branches: refs/heads/trunk 500a529e7 -> 02769d5b6
update stress tool to be able to use CQL3 patch by David Alves; reviewed by Pavel Yaskevich for CASSANDRA-4406 Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/02769d5b Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/02769d5b Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/02769d5b Branch: refs/heads/trunk Commit: 02769d5b69d5a5a7512c0f605793f21750b2c4ca Parents: 500a529 Author: Pavel Yaskevich <xe...@apache.org> Authored: Mon Sep 10 20:32:38 2012 +0300 Committer: Pavel Yaskevich <xe...@apache.org> Committed: Mon Sep 10 20:33:09 2012 +0300 ---------------------------------------------------------------------- CHANGES.txt | 2 + .../src/org/apache/cassandra/stress/Session.java | 26 ++++++++++- .../cassandra/stress/operations/CqlInserter.java | 35 +++++++++----- .../cassandra/stress/operations/CqlReader.java | 16 +++++-- .../apache/cassandra/stress/util/Operation.java | 7 +++ 5 files changed, 68 insertions(+), 18 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cassandra/blob/02769d5b/CHANGES.txt ---------------------------------------------------------------------- diff --git a/CHANGES.txt b/CHANGES.txt index 0ad5b66..896b8cc 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -56,6 +56,8 @@ * Adds events push to binary protocol (CASSANDRA-4480) * Rewrite nodetool help (CASSANDRA-2293) * Make CQL3 the default for CQL (CASSANDRA-4640) + * update stress tool to be able to use CQL3 (CASSANDRA-4406) + 1.1.6 * (cql3) fix potential NPE with both equal and unequal restriction (CASSANDRA-4532) http://git-wip-us.apache.org/repos/asf/cassandra/blob/02769d5b/tools/stress/src/org/apache/cassandra/stress/Session.java ---------------------------------------------------------------------- diff --git a/tools/stress/src/org/apache/cassandra/stress/Session.java b/tools/stress/src/org/apache/cassandra/stress/Session.java index 9fff043..eb1a902 100644 --- a/tools/stress/src/org/apache/cassandra/stress/Session.java +++ b/tools/stress/src/org/apache/cassandra/stress/Session.java @@ -81,7 +81,8 @@ public class Session implements Serializable availableOptions.addOption("i", "progress-interval", true, "Progress Report Interval (seconds), default:10"); availableOptions.addOption("g", "keys-per-call", true, "Number of keys to get_range_slices or multiget per call, default:1000"); availableOptions.addOption("l", "replication-factor", true, "Replication Factor to use when creating needed column families, default:1"); - availableOptions.addOption("L", "enable-cql", false, "Perform queries using CQL (Cassandra Query Language)."); + availableOptions.addOption("L", "enable-cql", false, "Perform queries using CQL2 (Cassandra Query Language v 2.0.0)"); + availableOptions.addOption("L3", "enable-cql3", false, "Perform queries using CQL3 (Cassandra Query Language v 3.0.0)"); availableOptions.addOption("P", "use-prepared-statements", false, "Perform queries using prepared statements (only applicable to CQL)."); availableOptions.addOption("e", "consistency-level", true, "Consistency Level to use (ONE, QUORUM, LOCAL_QUORUM, EACH_QUORUM, ALL, ANY), default:ONE"); availableOptions.addOption("x", "create-index", true, "Type of index to create on needed column families (KEYS)"); @@ -132,6 +133,8 @@ public class Session implements Serializable // if we know exactly column names that we want to read (set by -Q option) public final List<ByteBuffer> columnNames; + public String cqlVersion; + public final boolean averageSizeValues; // required by Gaussian distribution. @@ -269,7 +272,17 @@ public class Session implements Serializable replicationStrategyOptions.put("replication_factor", "1"); if (cmd.hasOption("L")) + { enable_cql = true; + cqlVersion = "2.0.0"; + } + + if (cmd.hasOption("L3")) + { + enable_cql = true; + cqlVersion = "3.0.0"; + } + if (cmd.hasOption("P")) { @@ -539,6 +552,14 @@ public class Session implements Serializable .setDefault_validation_class(DEFAULT_VALIDATOR) .setCompression_options(compressionOptions); + if (!timeUUIDComparator) + { + for (int i = 0; i < getColumnsPerKey(); i++) + { + standardCfDef.addToColumn_metadata(new ColumnDef(ByteBufferUtil.bytes("C" + i), "BytesType")); + } + } + if (indexType != null) { ColumnDef standardColumn = new ColumnDef(ByteBufferUtil.bytes("C1"), "BytesType"); @@ -621,6 +642,9 @@ public class Session implements Serializable { transport.open(); + if (enable_cql) + client.set_cql_version(cqlVersion); + if (setKeyspace) { client.set_keyspace("Keyspace1"); http://git-wip-us.apache.org/repos/asf/cassandra/blob/02769d5b/tools/stress/src/org/apache/cassandra/stress/operations/CqlInserter.java ---------------------------------------------------------------------- diff --git a/tools/stress/src/org/apache/cassandra/stress/operations/CqlInserter.java b/tools/stress/src/org/apache/cassandra/stress/operations/CqlInserter.java index c729f2f..25c42b0 100644 --- a/tools/stress/src/org/apache/cassandra/stress/operations/CqlInserter.java +++ b/tools/stress/src/org/apache/cassandra/stress/operations/CqlInserter.java @@ -54,13 +54,27 @@ public class CqlInserter extends Operation // Construct a query string once. if (cqlQuery == null) { - StringBuilder query = new StringBuilder("UPDATE Standard1 USING CONSISTENCY ") + StringBuilder query = new StringBuilder("UPDATE ").append(wrapInQuotesIfRequired("Standard1")) + .append(" USING CONSISTENCY ") .append(session.getConsistencyLevel().toString()).append(" SET "); for (int i = 0; i < session.getColumnsPerKey(); i++) { - if (i > 0) query.append(','); - query.append("?=?"); + if (i > 0) + query.append(','); + + if (session.timeUUIDComparator) + { + if (session.cqlVersion.startsWith("3")) + throw new UnsupportedOperationException("Cannot use UUIDs in column names with CQL3"); + + query.append(wrapInQuotesIfRequired(UUIDGen.makeType1UUIDFromHost(Session.getLocalAddress()).toString())) + .append(" = ?"); + } + else + { + query.append(wrapInQuotesIfRequired("C" + i)).append(" = ?"); + } } query.append(" WHERE KEY=?"); @@ -70,18 +84,12 @@ public class CqlInserter extends Operation List<String> queryParms = new ArrayList<String>(); for (int i = 0; i < session.getColumnsPerKey(); i++) { - // Column name - if (session.timeUUIDComparator) - queryParms.add(UUIDGen.makeType1UUIDFromHost(Session.getLocalAddress()).toString()); - else - queryParms.add(new String("C" + i)); - // Column value - queryParms.add(new String(getUnQuotedCqlBlob(values.get(i % values.size()).array()))); + queryParms.add(getUnQuotedCqlBlob(values.get(i % values.size()).array())); } String key = String.format("%0" + session.getTotalKeysLength() + "d", index); - queryParms.add(new String(getUnQuotedCqlBlob(key))); + queryParms.add(getUnQuotedCqlBlob(key)); String formattedQuery = null; @@ -120,11 +128,12 @@ public class CqlInserter extends Operation if (!success) { - error(String.format("Operation [%d] retried %d times - error inserting key %s %s%n", + error(String.format("Operation [%d] retried %d times - error inserting key %s %s%n with query %s", index, session.getRetryTimes(), key, - (exceptionMessage == null) ? "" : "(" + exceptionMessage + ")")); + (exceptionMessage == null) ? "" : "(" + exceptionMessage + ")", + cqlQuery)); } session.operations.getAndIncrement(); http://git-wip-us.apache.org/repos/asf/cassandra/blob/02769d5b/tools/stress/src/org/apache/cassandra/stress/operations/CqlReader.java ---------------------------------------------------------------------- diff --git a/tools/stress/src/org/apache/cassandra/stress/operations/CqlReader.java b/tools/stress/src/org/apache/cassandra/stress/operations/CqlReader.java index cfac2d6..ef43ae8 100644 --- a/tools/stress/src/org/apache/cassandra/stress/operations/CqlReader.java +++ b/tools/stress/src/org/apache/cassandra/stress/operations/CqlReader.java @@ -52,7 +52,12 @@ public class CqlReader extends Operation StringBuilder query = new StringBuilder("SELECT "); if (session.columnNames == null) - query.append("FIRST ").append(session.getColumnsPerKey()).append(" ''..''"); + { + if (session.cqlVersion.startsWith("2")) + query.append("FIRST ").append(session.getColumnsPerKey()).append(" ''..''"); + else + query.append("*"); + } else { for (int i = 0; i < session.columnNames.size(); i++) @@ -62,7 +67,8 @@ public class CqlReader extends Operation } } - query.append(" FROM Standard1 USING CONSISTENCY ").append(session.getConsistencyLevel().toString()); + query.append(" FROM ").append(wrapInQuotesIfRequired("Standard1")).append(" USING CONSISTENCY ") + .append(session.getConsistencyLevel().toString()); query.append(" WHERE KEY=?"); cqlQuery = query.toString(); @@ -109,6 +115,7 @@ public class CqlReader extends Operation } catch (Exception e) { + exceptionMessage = getExceptionMessage(e); success = false; } @@ -116,11 +123,12 @@ public class CqlReader extends Operation if (!success) { - error(String.format("Operation [%d] retried %d times - error reading key %s %s%n", + error(String.format("Operation [%d] retried %d times - error reading key %s %s%n with query %s", index, session.getRetryTimes(), new String(key), - (exceptionMessage == null) ? "" : "(" + exceptionMessage + ")")); + (exceptionMessage == null) ? "" : "(" + exceptionMessage + ")", + cqlQuery)); } session.operations.getAndIncrement(); http://git-wip-us.apache.org/repos/asf/cassandra/blob/02769d5b/tools/stress/src/org/apache/cassandra/stress/util/Operation.java ---------------------------------------------------------------------- diff --git a/tools/stress/src/org/apache/cassandra/stress/util/Operation.java b/tools/stress/src/org/apache/cassandra/stress/util/Operation.java index cbeaad7..4737692 100644 --- a/tools/stress/src/org/apache/cassandra/stress/util/Operation.java +++ b/tools/stress/src/org/apache/cassandra/stress/util/Operation.java @@ -296,4 +296,11 @@ public abstract class Operation return statementId; } + + protected String wrapInQuotesIfRequired(String string) + { + return session.cqlVersion.startsWith("3") + ? "\"" + string + "\"" + : string; + } }