Repository: cassandra Updated Branches: refs/heads/trunk a0f59dce5 -> 0f5e78078
Minor code improvements patch by Robert Stupp; reviewed by Stefania for CASSANDRA-10750 Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/0f5e7807 Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/0f5e7807 Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/0f5e7807 Branch: refs/heads/trunk Commit: 0f5e780781ce3f0cb3732515dacc7e467571a7c9 Parents: a0f59dc Author: Robert Stupp <sn...@snazy.de> Authored: Fri Dec 18 09:14:57 2015 -0800 Committer: Robert Stupp <sn...@snazy.de> Committed: Fri Dec 18 09:14:57 2015 -0800 ---------------------------------------------------------------------- .../cassandra/auth/PasswordAuthenticator.java | 4 +- .../org/apache/cassandra/cql3/CQL3Type.java | 5 - .../restrictions/PrimaryKeyRestrictionSet.java | 12 -- .../cassandra/cql3/selection/FieldSelector.java | 5 - .../cql3/statements/BatchStatement.java | 13 +- .../cql3/statements/ModificationStatement.java | 9 +- .../apache/cassandra/db/CounterMutation.java | 7 +- src/java/org/apache/cassandra/db/IMutation.java | 2 +- .../org/apache/cassandra/db/LegacyLayout.java | 18 +-- src/java/org/apache/cassandra/db/Mutation.java | 7 +- .../cassandra/db/UnfilteredDeserializer.java | 2 +- .../db/commitlog/CommitLogReplayer.java | 2 +- .../db/compaction/CompactionController.java | 5 +- .../UnfilteredPartitionIterators.java | 6 - .../apache/cassandra/db/transform/Stack.java | 6 +- src/java/org/apache/cassandra/dht/Range.java | 8 +- .../internal/composites/CompositesSearcher.java | 122 +++++++++---------- .../io/sstable/SSTableSimpleIterator.java | 33 ++--- .../io/sstable/format/SSTableReader.java | 2 +- .../io/util/FileSegmentInputStream.java | 6 - .../io/util/RebufferingInputStream.java | 12 -- .../locator/NetworkTopologyStrategy.java | 6 - .../apache/cassandra/metrics/TableMetrics.java | 5 +- .../cassandra/serializers/AsciiSerializer.java | 2 +- .../cassandra/serializers/UTF8Serializer.java | 4 +- .../apache/cassandra/service/CacheService.java | 6 +- .../apache/cassandra/service/StorageProxy.java | 2 +- .../apache/cassandra/streaming/StreamPlan.java | 5 +- .../apache/cassandra/tools/nodetool/Ring.java | 4 +- .../apache/cassandra/tools/nodetool/Status.java | 4 +- .../cassandra/utils/HistogramBuilder.java | 7 +- .../apache/cassandra/utils/IntervalTree.java | 23 ++-- .../apache/cassandra/utils/MergeIterator.java | 3 - .../org/apache/cassandra/utils/MerkleTree.java | 84 ++++++++----- .../cassandra/utils/btree/TreeCursor.java | 3 +- .../org/apache/cassandra/stress/Operation.java | 10 +- .../operations/predefined/CqlOperation.java | 9 +- .../predefined/PredefinedOperation.java | 3 +- .../operations/userdefined/SchemaStatement.java | 9 -- .../userdefined/ValidatingSchemaQuery.java | 17 +-- .../cassandra/stress/util/TimingInterval.java | 3 +- 41 files changed, 223 insertions(+), 272 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cassandra/blob/0f5e7807/src/java/org/apache/cassandra/auth/PasswordAuthenticator.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/auth/PasswordAuthenticator.java b/src/java/org/apache/cassandra/auth/PasswordAuthenticator.java index 0482199..3bee0e3 100644 --- a/src/java/org/apache/cassandra/auth/PasswordAuthenticator.java +++ b/src/java/org/apache/cassandra/auth/PasswordAuthenticator.java @@ -213,10 +213,10 @@ public class PasswordAuthenticator implements IAuthenticator } } - if (user == null) - throw new AuthenticationException("Authentication ID must not be null"); if (pass == null) throw new AuthenticationException("Password must not be null"); + if (user == null) + throw new AuthenticationException("Authentication ID must not be null"); username = new String(user, StandardCharsets.UTF_8); password = new String(pass, StandardCharsets.UTF_8); http://git-wip-us.apache.org/repos/asf/cassandra/blob/0f5e7807/src/java/org/apache/cassandra/cql3/CQL3Type.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/cql3/CQL3Type.java b/src/java/org/apache/cassandra/cql3/CQL3Type.java index 4e67346..989fcf8 100644 --- a/src/java/org/apache/cassandra/cql3/CQL3Type.java +++ b/src/java/org/apache/cassandra/cql3/CQL3Type.java @@ -815,11 +815,6 @@ public interface CQL3Type return true; } - public boolean isCollection() - { - return false; - } - public void freeze() throws InvalidRequestException { for (CQL3Type.Raw t : types) http://git-wip-us.apache.org/repos/asf/cassandra/blob/0f5e7807/src/java/org/apache/cassandra/cql3/restrictions/PrimaryKeyRestrictionSet.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/cql3/restrictions/PrimaryKeyRestrictionSet.java b/src/java/org/apache/cassandra/cql3/restrictions/PrimaryKeyRestrictionSet.java index 0730593..d24799a 100644 --- a/src/java/org/apache/cassandra/cql3/restrictions/PrimaryKeyRestrictionSet.java +++ b/src/java/org/apache/cassandra/cql3/restrictions/PrimaryKeyRestrictionSet.java @@ -138,24 +138,12 @@ final class PrimaryKeyRestrictionSet extends AbstractPrimaryKeyRestrictions } @Override - public boolean isOnToken() - { - return false; - } - - @Override public boolean isContains() { return contains; } @Override - public boolean isMultiColumn() - { - return false; - } - - @Override public Iterable<Function> getFunctions() { return restrictions.getFunctions(); http://git-wip-us.apache.org/repos/asf/cassandra/blob/0f5e7807/src/java/org/apache/cassandra/cql3/selection/FieldSelector.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/cql3/selection/FieldSelector.java b/src/java/org/apache/cassandra/cql3/selection/FieldSelector.java index 63b6cc6..965a01a 100644 --- a/src/java/org/apache/cassandra/cql3/selection/FieldSelector.java +++ b/src/java/org/apache/cassandra/cql3/selection/FieldSelector.java @@ -65,11 +65,6 @@ final class FieldSelector extends Selector }; } - public boolean isAggregate() - { - return false; - } - public void addInput(int protocolVersion, ResultSetBuilder rs) throws InvalidRequestException { selected.addInput(protocolVersion, rs); http://git-wip-us.apache.org/repos/asf/cassandra/blob/0f5e7807/src/java/org/apache/cassandra/cql3/statements/BatchStatement.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/cql3/statements/BatchStatement.java b/src/java/org/apache/cassandra/cql3/statements/BatchStatement.java index 1f1d507..2701322 100644 --- a/src/java/org/apache/cassandra/cql3/statements/BatchStatement.java +++ b/src/java/org/apache/cassandra/cql3/statements/BatchStatement.java @@ -48,7 +48,7 @@ import static org.apache.cassandra.cql3.statements.RequestValidations.checkFalse */ public class BatchStatement implements CQLStatement { - public static enum Type + public enum Type { LOGGED, UNLOGGED, COUNTER } @@ -258,7 +258,7 @@ public class BatchStatement implements CQLStatement /** * Checks batch size to ensure threshold is met. If not, a warning is logged. * - * @param cfs ColumnFamilies that will store the batch's mutations. + * @param updates - the batch mutations. */ public static void verifyBatchSize(Iterable<PartitionUpdate> updates) throws InvalidRequestException { @@ -438,14 +438,7 @@ public class BatchStatement implements CQLStatement private ResultMessage executeInternalWithoutCondition(QueryState queryState, QueryOptions options) throws RequestValidationException, RequestExecutionException { for (IMutation mutation : getMutations(BatchQueryOptions.withoutPerStatementVariables(options), true, queryState.getTimestamp())) - { - assert mutation instanceof Mutation || mutation instanceof CounterMutation; - - if (mutation instanceof Mutation) - ((Mutation) mutation).apply(); - else if (mutation instanceof CounterMutation) - ((CounterMutation) mutation).apply(); - } + mutation.apply(); return null; } http://git-wip-us.apache.org/repos/asf/cassandra/blob/0f5e7807/src/java/org/apache/cassandra/cql3/statements/ModificationStatement.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/cql3/statements/ModificationStatement.java b/src/java/org/apache/cassandra/cql3/statements/ModificationStatement.java index 08b8527..ca3b5bc 100644 --- a/src/java/org/apache/cassandra/cql3/statements/ModificationStatement.java +++ b/src/java/org/apache/cassandra/cql3/statements/ModificationStatement.java @@ -550,14 +550,7 @@ public abstract class ModificationStatement implements CQLStatement public ResultMessage executeInternalWithoutCondition(QueryState queryState, QueryOptions options) throws RequestValidationException, RequestExecutionException { for (IMutation mutation : getMutations(options, true, queryState.getTimestamp())) - { - assert mutation instanceof Mutation || mutation instanceof CounterMutation; - - if (mutation instanceof Mutation) - ((Mutation) mutation).apply(); - else if (mutation instanceof CounterMutation) - ((CounterMutation) mutation).apply(); - } + mutation.apply(); return null; } http://git-wip-us.apache.org/repos/asf/cassandra/blob/0f5e7807/src/java/org/apache/cassandra/db/CounterMutation.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/db/CounterMutation.java b/src/java/org/apache/cassandra/db/CounterMutation.java index 6818513..87ca71a 100644 --- a/src/java/org/apache/cassandra/db/CounterMutation.java +++ b/src/java/org/apache/cassandra/db/CounterMutation.java @@ -110,7 +110,7 @@ public class CounterMutation implements IMutation * * @return the applied resulting Mutation */ - public Mutation apply() throws WriteTimeoutException + public Mutation applyCounterMutation() throws WriteTimeoutException { Mutation result = new Mutation(getKeyspaceName(), key()); Keyspace keyspace = Keyspace.open(getKeyspaceName()); @@ -132,6 +132,11 @@ public class CounterMutation implements IMutation } } + public void apply() + { + applyCounterMutation(); + } + private void grabCounterLocks(Keyspace keyspace, List<Lock> locks) throws WriteTimeoutException { long startTime = System.nanoTime(); http://git-wip-us.apache.org/repos/asf/cassandra/blob/0f5e7807/src/java/org/apache/cassandra/db/IMutation.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/db/IMutation.java b/src/java/org/apache/cassandra/db/IMutation.java index aad35c3..c734e16 100644 --- a/src/java/org/apache/cassandra/db/IMutation.java +++ b/src/java/org/apache/cassandra/db/IMutation.java @@ -17,7 +17,6 @@ */ package org.apache.cassandra.db; -import java.nio.ByteBuffer; import java.util.Collection; import java.util.UUID; @@ -25,6 +24,7 @@ import org.apache.cassandra.db.partitions.PartitionUpdate; public interface IMutation { + public void apply(); public String getKeyspaceName(); public Collection<UUID> getColumnFamilyIds(); public DecoratedKey key(); http://git-wip-us.apache.org/repos/asf/cassandra/blob/0f5e7807/src/java/org/apache/cassandra/db/LegacyLayout.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/db/LegacyLayout.java b/src/java/org/apache/cassandra/db/LegacyLayout.java index 91b7755..95bf0e5 100644 --- a/src/java/org/apache/cassandra/db/LegacyLayout.java +++ b/src/java/org/apache/cassandra/db/LegacyLayout.java @@ -652,16 +652,18 @@ public abstract class LegacyLayout protected LegacyCell computeNext() { - if (currentRow.hasNext()) - return currentRow.next(); + while (true) + { + if (currentRow.hasNext()) + return currentRow.next(); - if (!iterator.hasNext()) - return endOfData(); + if (!iterator.hasNext()) + return endOfData(); - Pair<LegacyRangeTombstoneList, Iterator<LegacyCell>> row = fromRow(metadata, iterator.next()); - deletions.addAll(row.left); - currentRow = row.right; - return computeNext(); + Pair<LegacyRangeTombstoneList, Iterator<LegacyCell>> row = fromRow(metadata, iterator.next()); + deletions.addAll(row.left); + currentRow = row.right; + } } }; http://git-wip-us.apache.org/repos/asf/cassandra/blob/0f5e7807/src/java/org/apache/cassandra/db/Mutation.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/db/Mutation.java b/src/java/org/apache/cassandra/db/Mutation.java index cbc7e17..f165909 100644 --- a/src/java/org/apache/cassandra/db/Mutation.java +++ b/src/java/org/apache/cassandra/db/Mutation.java @@ -34,15 +34,12 @@ import org.apache.cassandra.io.util.DataOutputPlus; import org.apache.cassandra.net.MessageOut; import org.apache.cassandra.net.MessagingService; import org.apache.cassandra.utils.ByteBufferUtil; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; // TODO convert this to a Builder pattern instead of encouraging M.add directly, // which is less-efficient since we have to keep a mutable HashMap around public class Mutation implements IMutation { public static final MutationSerializer serializer = new MutationSerializer(); - private static final Logger logger = LoggerFactory.getLogger(Mutation.class); public static final String FORWARD_TO = "FWD_TO"; public static final String FORWARD_FROM = "FWD_FRM"; @@ -251,7 +248,7 @@ public class Mutation implements IMutation buff.append(", modifications=["); if (shallow) { - List<String> cfnames = new ArrayList<String>(modifications.size()); + List<String> cfnames = new ArrayList<>(modifications.size()); for (UUID cfid : modifications.keySet()) { CFMetaData cfm = Schema.instance.getCFMetaData(cfid); @@ -261,7 +258,7 @@ public class Mutation implements IMutation } else { - buff.append("\n ").append(StringUtils.join(modifications.values(), "\n ")).append("\n"); + buff.append("\n ").append(StringUtils.join(modifications.values(), "\n ")).append('\n'); } return buff.append("])").toString(); } http://git-wip-us.apache.org/repos/asf/cassandra/blob/0f5e7807/src/java/org/apache/cassandra/db/UnfilteredDeserializer.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/db/UnfilteredDeserializer.java b/src/java/org/apache/cassandra/db/UnfilteredDeserializer.java index bf9c2b8..a9b2903 100644 --- a/src/java/org/apache/cassandra/db/UnfilteredDeserializer.java +++ b/src/java/org/apache/cassandra/db/UnfilteredDeserializer.java @@ -432,7 +432,7 @@ public abstract class UnfilteredDeserializer return false; } } - return next != null; + return true; } private Unfiltered readRow(LegacyLayout.LegacyAtom first) http://git-wip-us.apache.org/repos/asf/cassandra/blob/0f5e7807/src/java/org/apache/cassandra/db/commitlog/CommitLogReplayer.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/db/commitlog/CommitLogReplayer.java b/src/java/org/apache/cassandra/db/commitlog/CommitLogReplayer.java index 5010696..0c71871 100644 --- a/src/java/org/apache/cassandra/db/commitlog/CommitLogReplayer.java +++ b/src/java/org/apache/cassandra/db/commitlog/CommitLogReplayer.java @@ -455,7 +455,7 @@ public class CommitLogReplayer int uncompressedLength = replayEnd - replayPos; if (uncompressedLength > uncompressedBuffer.length) uncompressedBuffer = new byte[(int) (1.2 * uncompressedLength)]; - compressedLength = compressor.uncompress(buffer, 0, compressedLength, uncompressedBuffer, 0); + compressor.uncompress(buffer, 0, compressedLength, uncompressedBuffer, 0); sectionReader = new FileSegmentInputStream(ByteBuffer.wrap(uncompressedBuffer), reader.getPath(), replayPos); errorContext = "compressed section at " + start + " in " + errorContext; } http://git-wip-us.apache.org/repos/asf/cassandra/blob/0f5e7807/src/java/org/apache/cassandra/db/compaction/CompactionController.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/db/compaction/CompactionController.java b/src/java/org/apache/cassandra/db/compaction/CompactionController.java index 259e1b9..a7224a1 100644 --- a/src/java/org/apache/cassandra/db/compaction/CompactionController.java +++ b/src/java/org/apache/cassandra/db/compaction/CompactionController.java @@ -190,9 +190,8 @@ public class CompactionController implements AutoCloseable { // if we don't have bloom filter(bf_fp_chance=1.0 or filter file is missing), // we check index file instead. - if (sstable.getBloomFilter() instanceof AlwaysPresentFilter && sstable.getPosition(key, SSTableReader.Operator.EQ, false) != null) - min = Math.min(min, sstable.getMinTimestamp()); - else if (sstable.getBloomFilter().isPresent(key)) + if ((sstable.getBloomFilter() instanceof AlwaysPresentFilter && sstable.getPosition(key, SSTableReader.Operator.EQ, false) != null) + || sstable.getBloomFilter().isPresent(key)) min = Math.min(min, sstable.getMinTimestamp()); } return min; http://git-wip-us.apache.org/repos/asf/cassandra/blob/0f5e7807/src/java/org/apache/cassandra/db/partitions/UnfilteredPartitionIterators.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/db/partitions/UnfilteredPartitionIterators.java b/src/java/org/apache/cassandra/db/partitions/UnfilteredPartitionIterators.java index a3f7981..d214da2 100644 --- a/src/java/org/apache/cassandra/db/partitions/UnfilteredPartitionIterators.java +++ b/src/java/org/apache/cassandra/db/partitions/UnfilteredPartitionIterators.java @@ -177,12 +177,6 @@ public abstract class UnfilteredPartitionIterators { private final List<UnfilteredRowIterator> toMerge = new ArrayList<>(iterators.size()); - @Override - public boolean trivialReduceIsTrivial() - { - return false; - } - public void reduce(int idx, UnfilteredRowIterator current) { toMerge.add(current); http://git-wip-us.apache.org/repos/asf/cassandra/blob/0f5e7807/src/java/org/apache/cassandra/db/transform/Stack.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/db/transform/Stack.java b/src/java/org/apache/cassandra/db/transform/Stack.java index aac1679..d388f75 100644 --- a/src/java/org/apache/cassandra/db/transform/Stack.java +++ b/src/java/org/apache/cassandra/db/transform/Stack.java @@ -4,6 +4,8 @@ import java.util.Arrays; class Stack { + public static final Transformation[] EMPTY_TRANSFORMATIONS = new Transformation[0]; + public static final MoreContentsHolder[] EMPTY_MORE_CONTENTS_HOLDERS = new MoreContentsHolder[0]; static final Stack EMPTY = new Stack(); Transformation[] stack; @@ -24,8 +26,8 @@ class Stack Stack() { - stack = new Transformation[0]; - moreContents = new MoreContentsHolder[0]; + stack = EMPTY_TRANSFORMATIONS; + moreContents = EMPTY_MORE_CONTENTS_HOLDERS; } Stack(Stack copy) http://git-wip-us.apache.org/repos/asf/cassandra/blob/0f5e7807/src/java/org/apache/cassandra/dht/Range.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/dht/Range.java b/src/java/org/apache/cassandra/dht/Range.java index 985d6f6..1fc6c46 100644 --- a/src/java/org/apache/cassandra/dht/Range.java +++ b/src/java/org/apache/cassandra/dht/Range.java @@ -164,7 +164,7 @@ public class Range<T extends RingPosition<T>> extends AbstractBounds<T> implemen boolean thatwraps = isWrapAround(that.left, that.right); if (!thiswraps && !thatwraps) { - // neither wraps. the straightforward case. + // neither wraps: the straightforward case. if (!(left.compareTo(that.right) < 0 && that.left.compareTo(right) < 0)) return Collections.emptySet(); return rangeSet(new Range<T>(ObjectUtils.max(this.left, that.left), @@ -172,7 +172,7 @@ public class Range<T extends RingPosition<T>> extends AbstractBounds<T> implemen } if (thiswraps && thatwraps) { - // if the starts are the same, one contains the other, which we have already ruled out. + //both wrap: if the starts are the same, one contains the other, which we have already ruled out. assert !this.left.equals(that.left); // two wrapping ranges always intersect. // since we have already determined that neither this nor that contains the other, we have 2 cases, @@ -186,9 +186,9 @@ public class Range<T extends RingPosition<T>> extends AbstractBounds<T> implemen ? intersectionBothWrapping(this, that) : intersectionBothWrapping(that, this); } - if (thiswraps && !thatwraps) + if (thiswraps) // this wraps, that does not wrap return intersectionOneWrapping(this, that); - assert (!thiswraps && thatwraps); + // the last case: this does not wrap, that wraps return intersectionOneWrapping(that, this); } http://git-wip-us.apache.org/repos/asf/cassandra/blob/0f5e7807/src/java/org/apache/cassandra/index/internal/composites/CompositesSearcher.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/index/internal/composites/CompositesSearcher.java b/src/java/org/apache/cassandra/index/internal/composites/CompositesSearcher.java index 5aaea40..f2d43e3 100644 --- a/src/java/org/apache/cassandra/index/internal/composites/CompositesSearcher.java +++ b/src/java/org/apache/cassandra/index/internal/composites/CompositesSearcher.java @@ -21,9 +21,6 @@ import java.nio.ByteBuffer; import java.util.ArrayList; import java.util.List; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import org.apache.cassandra.config.CFMetaData; import org.apache.cassandra.db.*; import org.apache.cassandra.db.filter.ClusteringIndexNamesFilter; @@ -41,8 +38,6 @@ import org.apache.cassandra.utils.concurrent.OpOrder; public class CompositesSearcher extends CassandraIndexSearcher { - private static final Logger logger = LoggerFactory.getLogger(CompositesSearcher.class); - public CompositesSearcher(ReadCommand command, RowFilter.Expression expression, CassandraIndex index) @@ -95,70 +90,75 @@ public class CompositesSearcher extends CassandraIndexSearcher private boolean prepareNext() { - if (next != null) - return true; - - if (nextEntry == null) + while (true) { - if (!indexHits.hasNext()) - return false; + if (next != null) + return true; - nextEntry = index.decodeEntry(indexKey, indexHits.next()); - } + if (nextEntry == null) + { + if (!indexHits.hasNext()) + return false; - // Gather all index hits belonging to the same partition and query the data for those hits. - // TODO: it's much more efficient to do 1 read for all hits to the same partition than doing - // 1 read per index hit. However, this basically mean materializing all hits for a partition - // in memory so we should consider adding some paging mechanism. However, index hits should - // be relatively small so it's much better than the previous code that was materializing all - // *data* for a given partition. - BTreeSet.Builder<Clustering> clusterings = BTreeSet.builder(index.baseCfs.getComparator()); - List<IndexEntry> entries = new ArrayList<>(); - DecoratedKey partitionKey = index.baseCfs.decorateKey(nextEntry.indexedKey); - - while (nextEntry != null && partitionKey.getKey().equals(nextEntry.indexedKey)) - { - // We're queried a slice of the index, but some hits may not match some of the clustering column constraints - if (isMatchingEntry(partitionKey, nextEntry, command)) + nextEntry = index.decodeEntry(indexKey, indexHits.next()); + } + + // Gather all index hits belonging to the same partition and query the data for those hits. + // TODO: it's much more efficient to do 1 read for all hits to the same partition than doing + // 1 read per index hit. However, this basically mean materializing all hits for a partition + // in memory so we should consider adding some paging mechanism. However, index hits should + // be relatively small so it's much better than the previous code that was materializing all + // *data* for a given partition. + BTreeSet.Builder<Clustering> clusterings = BTreeSet.builder(index.baseCfs.getComparator()); + List<IndexEntry> entries = new ArrayList<>(); + DecoratedKey partitionKey = index.baseCfs.decorateKey(nextEntry.indexedKey); + + while (nextEntry != null && partitionKey.getKey().equals(nextEntry.indexedKey)) { - clusterings.add(nextEntry.indexedEntryClustering); - entries.add(nextEntry); + // We're queried a slice of the index, but some hits may not match some of the clustering column constraints + if (isMatchingEntry(partitionKey, nextEntry, command)) + { + clusterings.add(nextEntry.indexedEntryClustering); + entries.add(nextEntry); + } + + nextEntry = indexHits.hasNext() ? index.decodeEntry(indexKey, indexHits.next()) : null; } - nextEntry = indexHits.hasNext() ? index.decodeEntry(indexKey, indexHits.next()) : null; - } + // Because we've eliminated entries that don't match the clustering columns, it's possible we added nothing + if (clusterings.isEmpty()) + { + continue; + } - // Because we've eliminated entries that don't match the clustering columns, it's possible we added nothing - if (clusterings.isEmpty()) - return prepareNext(); - - // Query the gathered index hits. We still need to filter stale hits from the resulting query. - ClusteringIndexNamesFilter filter = new ClusteringIndexNamesFilter(clusterings.build(), false); - SinglePartitionReadCommand dataCmd = SinglePartitionReadCommand.create(index.baseCfs.metadata, - command.nowInSec(), - command.columnFilter(), - command.rowFilter(), - DataLimits.NONE, - partitionKey, - filter); - @SuppressWarnings("resource") // We close right away if empty, and if it's assign to next it will be called either - // by the next caller of next, or through closing this iterator is this come before. - UnfilteredRowIterator dataIter = filterStaleEntries(dataCmd.queryMemtableAndDisk(index.baseCfs, - executionController.baseReadOpOrderGroup()), - indexKey.getKey(), - entries, - executionController.writeOpOrderGroup(), - command.nowInSec()); - - - if (dataIter.isEmpty()) - { - dataIter.close(); - return prepareNext(); - } + // Query the gathered index hits. We still need to filter stale hits from the resulting query. + ClusteringIndexNamesFilter filter = new ClusteringIndexNamesFilter(clusterings.build(), false); + SinglePartitionReadCommand dataCmd = SinglePartitionReadCommand.create(index.baseCfs.metadata, + command.nowInSec(), + command.columnFilter(), + command.rowFilter(), + DataLimits.NONE, + partitionKey, + filter); + @SuppressWarnings("resource") // We close right away if empty, and if it's assign to next it will be called either + // by the next caller of next, or through closing this iterator is this come before. + UnfilteredRowIterator dataIter = filterStaleEntries(dataCmd.queryMemtableAndDisk(index.baseCfs, + executionController.baseReadOpOrderGroup()), + indexKey.getKey(), + entries, + executionController.writeOpOrderGroup(), + command.nowInSec()); + + + if (dataIter.isEmpty()) + { + dataIter.close(); + continue; + } - next = dataIter; - return true; + next = dataIter; + return true; + } } public void remove() http://git-wip-us.apache.org/repos/asf/cassandra/blob/0f5e7807/src/java/org/apache/cassandra/io/sstable/SSTableSimpleIterator.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/io/sstable/SSTableSimpleIterator.java b/src/java/org/apache/cassandra/io/sstable/SSTableSimpleIterator.java index 365d469..2f4df1a 100644 --- a/src/java/org/apache/cassandra/io/sstable/SSTableSimpleIterator.java +++ b/src/java/org/apache/cassandra/io/sstable/SSTableSimpleIterator.java @@ -139,24 +139,27 @@ public abstract class SSTableSimpleIterator extends AbstractIterator<Unfiltered> protected Unfiltered computeNext() { - try + while (true) { - if (!deserializer.hasNext()) - return endOfData(); - - Unfiltered unfiltered = deserializer.readNext(); - if (metadata.isStaticCompactTable() && unfiltered.kind() == Unfiltered.Kind.ROW) + try { - Row row = (Row) unfiltered; - ColumnDefinition def = metadata.getColumnDefinition(LegacyLayout.encodeClustering(metadata, row.clustering())); - if (def != null && def.isStatic()) - return computeNext(); + if (!deserializer.hasNext()) + return endOfData(); + + Unfiltered unfiltered = deserializer.readNext(); + if (metadata.isStaticCompactTable() && unfiltered.kind() == Unfiltered.Kind.ROW) + { + Row row = (Row) unfiltered; + ColumnDefinition def = metadata.getColumnDefinition(LegacyLayout.encodeClustering(metadata, row.clustering())); + if (def != null && def.isStatic()) + continue; + } + return unfiltered; + } + catch (IOException e) + { + throw new IOError(e); } - return unfiltered; - } - catch (IOException e) - { - throw new IOError(e); } } http://git-wip-us.apache.org/repos/asf/cassandra/blob/0f5e7807/src/java/org/apache/cassandra/io/sstable/format/SSTableReader.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/io/sstable/format/SSTableReader.java b/src/java/org/apache/cassandra/io/sstable/format/SSTableReader.java index afd0a1e..971e8f2 100644 --- a/src/java/org/apache/cassandra/io/sstable/format/SSTableReader.java +++ b/src/java/org/apache/cassandra/io/sstable/format/SSTableReader.java @@ -818,7 +818,7 @@ public abstract class SSTableReader extends SSTable implements SelfRefCounted<SS while ((indexPosition = primaryIndex.getFilePointer()) != indexSize) { ByteBuffer key = ByteBufferUtil.readWithShortLength(primaryIndex); - RowIndexEntry indexEntry = rowIndexSerializer.deserialize(primaryIndex); + /*RowIndexEntry indexEntry = */rowIndexSerializer.deserialize(primaryIndex); DecoratedKey decoratedKey = decorateKey(key); if (first == null) first = decoratedKey; http://git-wip-us.apache.org/repos/asf/cassandra/blob/0f5e7807/src/java/org/apache/cassandra/io/util/FileSegmentInputStream.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/io/util/FileSegmentInputStream.java b/src/java/org/apache/cassandra/io/util/FileSegmentInputStream.java index 425c7d6..b6cf94a 100644 --- a/src/java/org/apache/cassandra/io/util/FileSegmentInputStream.java +++ b/src/java/org/apache/cassandra/io/util/FileSegmentInputStream.java @@ -68,12 +68,6 @@ public class FileSegmentInputStream extends DataInputBuffer implements FileDataI buffer.position((int) (pos - offset)); } - @Override - public boolean markSupported() - { - return false; - } - public FileMark mark() { throw new UnsupportedOperationException(); http://git-wip-us.apache.org/repos/asf/cassandra/blob/0f5e7807/src/java/org/apache/cassandra/io/util/RebufferingInputStream.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/io/util/RebufferingInputStream.java b/src/java/org/apache/cassandra/io/util/RebufferingInputStream.java index 3068746..d85f1be 100644 --- a/src/java/org/apache/cassandra/io/util/RebufferingInputStream.java +++ b/src/java/org/apache/cassandra/io/util/RebufferingInputStream.java @@ -275,16 +275,4 @@ public abstract class RebufferingInputStream extends InputStream implements Data return -1; } } - - @Override - public void reset() throws IOException - { - throw new IOException("mark/reset not supported"); - } - - @Override - public boolean markSupported() - { - return false; - } } http://git-wip-us.apache.org/repos/asf/cassandra/blob/0f5e7807/src/java/org/apache/cassandra/locator/NetworkTopologyStrategy.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/locator/NetworkTopologyStrategy.java b/src/java/org/apache/cassandra/locator/NetworkTopologyStrategy.java index 9f74dcc..f0342d4 100644 --- a/src/java/org/apache/cassandra/locator/NetworkTopologyStrategy.java +++ b/src/java/org/apache/cassandra/locator/NetworkTopologyStrategy.java @@ -223,10 +223,4 @@ public class NetworkTopologyStrategy extends AbstractReplicationStrategy validateReplicationFactor(e.getValue()); } } - - public Collection<String> recognizedOptions() - { - // We explicitely allow all options - return null; - } } http://git-wip-us.apache.org/repos/asf/cassandra/blob/0f5e7807/src/java/org/apache/cassandra/metrics/TableMetrics.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/metrics/TableMetrics.java b/src/java/org/apache/cassandra/metrics/TableMetrics.java index a8fcc77..c8c214e 100644 --- a/src/java/org/apache/cassandra/metrics/TableMetrics.java +++ b/src/java/org/apache/cassandra/metrics/TableMetrics.java @@ -42,6 +42,9 @@ import static org.apache.cassandra.metrics.CassandraMetricsRegistry.Metrics; */ public class TableMetrics { + + public static final long[] EMPTY = new long[0]; + /** Total amount of data stored in the memtable that resides on-heap, including column related overhead and partitions overwritten. */ public final Gauge<Long> memtableOnHeapSize; /** Total amount of data stored in the memtable that resides off-heap, including column related overhead and partitions overwritten. */ @@ -171,7 +174,7 @@ public class TableMetrics Iterator<SSTableReader> iterator = sstables.iterator(); if (!iterator.hasNext()) { - return new long[0]; + return EMPTY; } long[] firstBucket = getHistogram.getHistogram(iterator.next()).getBuckets(false); long[] values = new long[firstBucket.length]; http://git-wip-us.apache.org/repos/asf/cassandra/blob/0f5e7807/src/java/org/apache/cassandra/serializers/AsciiSerializer.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/serializers/AsciiSerializer.java b/src/java/org/apache/cassandra/serializers/AsciiSerializer.java index b013b23..e265cb2 100644 --- a/src/java/org/apache/cassandra/serializers/AsciiSerializer.java +++ b/src/java/org/apache/cassandra/serializers/AsciiSerializer.java @@ -35,7 +35,7 @@ public class AsciiSerializer extends AbstractTextSerializer for (int i = bytes.position(); i < bytes.limit(); i++) { byte b = bytes.get(i); - if (b < 0 || b > 127) + if (b < 0) throw new MarshalException("Invalid byte for ascii: " + Byte.toString(b)); } } http://git-wip-us.apache.org/repos/asf/cassandra/blob/0f5e7807/src/java/org/apache/cassandra/serializers/UTF8Serializer.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/serializers/UTF8Serializer.java b/src/java/org/apache/cassandra/serializers/UTF8Serializer.java index be5d2d6..bb708e0 100644 --- a/src/java/org/apache/cassandra/serializers/UTF8Serializer.java +++ b/src/java/org/apache/cassandra/serializers/UTF8Serializer.java @@ -93,10 +93,8 @@ public class UTF8Serializer extends AbstractTextSerializer if (b == (byte)0xf0) // 0xf0, 0x90-0xbf, 0x80-0xbf, 0x80-0xbf state = State.FOUR_90bf; - else if (b == (byte)0xf4) - // 0xf4, 0x80-0xbf, 0x80-0xbf, 0x80-0xbf - state = State.FOUR_80bf_3; else + // 0xf4, 0x80-0xbf, 0x80-0xbf, 0x80-0xbf // 0xf1-0xf3, 0x80-0xbf, 0x80-0xbf, 0x80-0xbf state = State.FOUR_80bf_3; break; http://git-wip-us.apache.org/repos/asf/cassandra/blob/0f5e7807/src/java/org/apache/cassandra/service/CacheService.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/service/CacheService.java b/src/java/org/apache/cassandra/service/CacheService.java index c51a5d1..03d7cd4 100644 --- a/src/java/org/apache/cassandra/service/CacheService.java +++ b/src/java/org/apache/cassandra/service/CacheService.java @@ -64,7 +64,7 @@ public class CacheService implements CacheServiceMBean public static final String MBEAN_NAME = "org.apache.cassandra.db:type=Caches"; - public static enum CacheType + public enum CacheType { KEY_CACHE("KeyCache"), ROW_CACHE("RowCache"), @@ -72,7 +72,7 @@ public class CacheService implements CacheServiceMBean private final String name; - private CacheType(String typeName) + CacheType(String typeName) { name = typeName; } @@ -430,9 +430,9 @@ public class CacheService implements CacheServiceMBean //Keyspace and CF name are deserialized by AutoSaving cache and used to fetch the CFS provided as a //parameter so they aren't deserialized here, even though they are serialized by this serializer final ByteBuffer buffer = ByteBufferUtil.readWithLength(in); - final int rowsToCache = cfs.metadata.params.caching.rowsPerPartitionToCache(); if (cfs == null || !cfs.isRowCacheEnabled()) return null; + final int rowsToCache = cfs.metadata.params.caching.rowsPerPartitionToCache(); assert(!cfs.isIndex());//Shouldn't have row cache entries for indexes return StageManager.getStage(Stage.READ).submit(new Callable<Pair<RowCacheKey, IRowCacheEntry>>() http://git-wip-us.apache.org/repos/asf/cassandra/blob/0f5e7807/src/java/org/apache/cassandra/service/StorageProxy.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/service/StorageProxy.java b/src/java/org/apache/cassandra/service/StorageProxy.java index dcc1b7b..f161607 100644 --- a/src/java/org/apache/cassandra/service/StorageProxy.java +++ b/src/java/org/apache/cassandra/service/StorageProxy.java @@ -1393,7 +1393,7 @@ public class StorageProxy implements StorageProxyMBean { assert mutation instanceof CounterMutation; - Mutation result = ((CounterMutation) mutation).apply(); + Mutation result = ((CounterMutation) mutation).applyCounterMutation(); responseHandler.response(null); Set<InetAddress> remotes = Sets.difference(ImmutableSet.copyOf(targets), http://git-wip-us.apache.org/repos/asf/cassandra/blob/0f5e7807/src/java/org/apache/cassandra/streaming/StreamPlan.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/streaming/StreamPlan.java b/src/java/org/apache/cassandra/streaming/StreamPlan.java index f0fdd55..e9d43cb 100644 --- a/src/java/org/apache/cassandra/streaming/StreamPlan.java +++ b/src/java/org/apache/cassandra/streaming/StreamPlan.java @@ -32,6 +32,7 @@ import org.apache.cassandra.utils.UUIDGen; */ public class StreamPlan { + public static final String[] EMPTY_COLUMN_FAMILIES = new String[0]; private final UUID planId = UUIDGen.getTimeUUID(); private final String description; private final List<StreamEventHandler> handlers = new ArrayList<>(); @@ -75,7 +76,7 @@ public class StreamPlan */ public StreamPlan requestRanges(InetAddress from, InetAddress connecting, String keyspace, Collection<Range<Token>> ranges) { - return requestRanges(from, connecting, keyspace, ranges, new String[0]); + return requestRanges(from, connecting, keyspace, ranges, EMPTY_COLUMN_FAMILIES); } /** @@ -116,7 +117,7 @@ public class StreamPlan */ public StreamPlan transferRanges(InetAddress to, InetAddress connecting, String keyspace, Collection<Range<Token>> ranges) { - return transferRanges(to, connecting, keyspace, ranges, new String[0]); + return transferRanges(to, connecting, keyspace, ranges, EMPTY_COLUMN_FAMILIES); } /** http://git-wip-us.apache.org/repos/asf/cassandra/blob/0f5e7807/src/java/org/apache/cassandra/tools/nodetool/Ring.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/tools/nodetool/Ring.java b/src/java/org/apache/cassandra/tools/nodetool/Ring.java index 03d9449..55220a1 100644 --- a/src/java/org/apache/cassandra/tools/nodetool/Ring.java +++ b/src/java/org/apache/cassandra/tools/nodetool/Ring.java @@ -88,7 +88,7 @@ public class Ring extends NodeToolCmd } catch (IllegalArgumentException ex) { - System.out.printf("%nError: " + ex.getMessage() + "%n"); + System.out.printf("%nError: %s%n", ex.getMessage()); return; } @@ -174,4 +174,4 @@ public class Ring extends NodeToolCmd } System.out.println(); } -} \ No newline at end of file +} http://git-wip-us.apache.org/repos/asf/cassandra/blob/0f5e7807/src/java/org/apache/cassandra/tools/nodetool/Status.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/tools/nodetool/Status.java b/src/java/org/apache/cassandra/tools/nodetool/Status.java index 99f745d..a43b703 100644 --- a/src/java/org/apache/cassandra/tools/nodetool/Status.java +++ b/src/java/org/apache/cassandra/tools/nodetool/Status.java @@ -81,7 +81,7 @@ public class Status extends NodeToolCmd } catch (IllegalArgumentException ex) { - System.out.printf("%nError: " + ex.getMessage() + "%n"); + System.out.printf("%nError: %s%n", ex.getMessage()); System.exit(1); } @@ -204,4 +204,4 @@ public class Status extends NodeToolCmd return format; } -} \ No newline at end of file +} http://git-wip-us.apache.org/repos/asf/cassandra/blob/0f5e7807/src/java/org/apache/cassandra/utils/HistogramBuilder.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/utils/HistogramBuilder.java b/src/java/org/apache/cassandra/utils/HistogramBuilder.java index 5d22352..093c52c 100644 --- a/src/java/org/apache/cassandra/utils/HistogramBuilder.java +++ b/src/java/org/apache/cassandra/utils/HistogramBuilder.java @@ -25,6 +25,9 @@ import java.util.Arrays; public class HistogramBuilder { + public static final long[] EMPTY_LONG_ARRAY = new long[]{}; + public static final long[] ZERO = new long[]{ 0 }; + public HistogramBuilder() {} public HistogramBuilder(long[] values) { @@ -73,7 +76,7 @@ public class HistogramBuilder final long[] values = this.values; if (count == 0) - return new EstimatedHistogram(new long[] { }, new long[] { 0 }); + return new EstimatedHistogram(EMPTY_LONG_ARRAY, ZERO); long min = Long.MAX_VALUE, max = Long.MIN_VALUE; double sum = 0, sumsq = 0; @@ -114,7 +117,7 @@ public class HistogramBuilder // minormax == mean we have no range to produce, but given the exclusive starts // that begin at zero by default (or -Inf) in EstimatedHistogram we have to generate a min range // to indicate where we start from - return ismin ? new long[] { mean - 1 } : new long[0]; + return ismin ? new long[] { mean - 1 } : EMPTY_LONG_ARRAY; if (stdev < 1) { http://git-wip-us.apache.org/repos/asf/cassandra/blob/0f5e7807/src/java/org/apache/cassandra/utils/IntervalTree.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/utils/IntervalTree.java b/src/java/org/apache/cassandra/utils/IntervalTree.java index b92112e..4cf1222 100644 --- a/src/java/org/apache/cassandra/utils/IntervalTree.java +++ b/src/java/org/apache/cassandra/utils/IntervalTree.java @@ -272,20 +272,21 @@ public class IntervalTree<C extends Comparable<? super C>, D, I extends Interval protected I computeNext() { - if (current != null && current.hasNext()) - return current.next(); - - IntervalNode node = stack.pollFirst(); - if (node == null) - return endOfData(); + while (true) + { + if (current != null && current.hasNext()) + return current.next(); - current = node.intersectsLeft.iterator(); + IntervalNode node = stack.pollFirst(); + if (node == null) + return endOfData(); - // We know this is the smaller not returned yet, but before doing - // its parent, we must do everyone on it's right. - gotoMinOf(node.right); + current = node.intersectsLeft.iterator(); - return computeNext(); + // We know this is the smaller not returned yet, but before doing + // its parent, we must do everyone on it's right. + gotoMinOf(node.right); + } } private void gotoMinOf(IntervalNode node) http://git-wip-us.apache.org/repos/asf/cassandra/blob/0f5e7807/src/java/org/apache/cassandra/utils/MergeIterator.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/utils/MergeIterator.java b/src/java/org/apache/cassandra/utils/MergeIterator.java index 0cc5306..70daad9 100644 --- a/src/java/org/apache/cassandra/utils/MergeIterator.java +++ b/src/java/org/apache/cassandra/utils/MergeIterator.java @@ -17,11 +17,8 @@ */ package org.apache.cassandra.utils; -import java.io.Closeable; import java.util.*; -import org.apache.cassandra.utils.AbstractIterator; - /** Merges sorted input iterators which individually contain unique items. */ public abstract class MergeIterator<In,Out> extends AbstractIterator<Out> implements IMergeIterator<In, Out> { http://git-wip-us.apache.org/repos/asf/cassandra/blob/0f5e7807/src/java/org/apache/cassandra/utils/MerkleTree.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/utils/MerkleTree.java b/src/java/org/apache/cassandra/utils/MerkleTree.java index b3bccac..bc39b91 100644 --- a/src/java/org/apache/cassandra/utils/MerkleTree.java +++ b/src/java/org/apache/cassandra/utils/MerkleTree.java @@ -326,19 +326,28 @@ public class MerkleTree implements Serializable TreeRange getHelper(Hashable hashable, Token pleft, Token pright, byte depth, Token t) { - if (hashable instanceof Leaf) + while (true) { - // we've reached a hash: wrap it up and deliver it - return new TreeRange(this, pleft, pright, depth, hashable); + if (hashable instanceof Leaf) + { + // we've reached a hash: wrap it up and deliver it + return new TreeRange(this, pleft, pright, depth, hashable); + } + // else: node. + + Inner node = (Inner) hashable; + depth = inc(depth); + if (Range.contains(pleft, node.token, t)) + { // left child contains token + hashable = node.lchild; + pright = node.token; + } + else + { // else: right child contains token + hashable = node.rchild; + pleft = node.token; + } } - // else: node. - - Inner node = (Inner)hashable; - if (Range.contains(pleft, node.token, t)) - // left child contains token - return getHelper(node.lchild, pleft, node.token, inc(depth), t); - // else: right child contains token - return getHelper(node.rchild, node.token, pright, inc(depth), t); } /** @@ -404,33 +413,42 @@ public class MerkleTree implements Serializable */ private Hashable findHelper(Hashable current, Range<Token> activeRange, Range<Token> find) throws StopRecursion { - if (current instanceof Leaf) + while (true) { - if (!find.contains(activeRange)) - // we are not fully contained in this range! - throw new StopRecursion.BadRange(); - return current; - } - // else: node. + if (current instanceof Leaf) + { + if (!find.contains(activeRange)) + // we are not fully contained in this range! + throw new StopRecursion.BadRange(); + return current; + } + // else: node. - Inner node = (Inner)current; - Range<Token> leftRange = new Range<Token>(activeRange.left, node.token); - Range<Token> rightRange = new Range<Token>(node.token, activeRange.right); + Inner node = (Inner) current; + Range<Token> leftRange = new Range<>(activeRange.left, node.token); + Range<Token> rightRange = new Range<>(node.token, activeRange.right); - if (find.contains(activeRange)) - // this node is fully contained in the range - return node.calc(); + if (find.contains(activeRange)) + // this node is fully contained in the range + return node.calc(); - // else: one of our children contains the range + // else: one of our children contains the range - if (leftRange.contains(find)) - // left child contains/matches the range - return findHelper(node.lchild, leftRange, find); - else if (rightRange.contains(find)) - // right child contains/matches the range - return findHelper(node.rchild, rightRange, find); - else - throw new StopRecursion.BadRange(); + if (leftRange.contains(find)) + { // left child contains/matches the range + current = node.lchild; + activeRange = leftRange; + } + else if (rightRange.contains(find)) + { // right child contains/matches the range + current = node.rchild; + activeRange = rightRange; + } + else + { + throw new StopRecursion.BadRange(); + } + } } /** http://git-wip-us.apache.org/repos/asf/cassandra/blob/0f5e7807/src/java/org/apache/cassandra/utils/btree/TreeCursor.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/utils/btree/TreeCursor.java b/src/java/org/apache/cassandra/utils/btree/TreeCursor.java index 5e55698..60c0eb9 100644 --- a/src/java/org/apache/cassandra/utils/btree/TreeCursor.java +++ b/src/java/org/apache/cassandra/utils/btree/TreeCursor.java @@ -219,8 +219,7 @@ class TreeCursor<K> extends NodeCursor<K> return; } - NodeCursor<K> cur = this.cur; - cur = root(); + NodeCursor<K> cur = root(); assert cur.nodeOffset == 0; while (true) { http://git-wip-us.apache.org/repos/asf/cassandra/blob/0f5e7807/tools/stress/src/org/apache/cassandra/stress/Operation.java ---------------------------------------------------------------------- diff --git a/tools/stress/src/org/apache/cassandra/stress/Operation.java b/tools/stress/src/org/apache/cassandra/stress/Operation.java index 4123911..139dd53 100644 --- a/tools/stress/src/org/apache/cassandra/stress/Operation.java +++ b/tools/stress/src/org/apache/cassandra/stress/Operation.java @@ -1,4 +1,4 @@ -/** +/* * 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 @@ -15,6 +15,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package org.apache.cassandra.stress; import java.io.IOException; @@ -24,7 +25,6 @@ import java.util.List; import com.google.common.util.concurrent.RateLimiter; import org.apache.cassandra.stress.generate.*; -import org.apache.cassandra.stress.settings.OptionDistribution; import org.apache.cassandra.stress.settings.OptionRatioDistribution; import org.apache.cassandra.stress.settings.SettingsLog; import org.apache.cassandra.stress.settings.StressSettings; @@ -141,11 +141,13 @@ public abstract class Operation */ public abstract void run(ThriftClient client) throws IOException; - public void run(SimpleClient client) throws IOException { + public void run(SimpleClient client) throws IOException + { throw new UnsupportedOperationException(); } - public void run(JavaDriverClient client) throws IOException { + public void run(JavaDriverClient client) throws IOException + { throw new UnsupportedOperationException(); } http://git-wip-us.apache.org/repos/asf/cassandra/blob/0f5e7807/tools/stress/src/org/apache/cassandra/stress/operations/predefined/CqlOperation.java ---------------------------------------------------------------------- diff --git a/tools/stress/src/org/apache/cassandra/stress/operations/predefined/CqlOperation.java b/tools/stress/src/org/apache/cassandra/stress/operations/predefined/CqlOperation.java index afdc0b1..097c1a0 100644 --- a/tools/stress/src/org/apache/cassandra/stress/operations/predefined/CqlOperation.java +++ b/tools/stress/src/org/apache/cassandra/stress/operations/predefined/CqlOperation.java @@ -49,6 +49,9 @@ import org.apache.thrift.TException; public abstract class CqlOperation<V> extends PredefinedOperation { + public static final ByteBuffer[][] EMPTY_BYTE_BUFFERS = new ByteBuffer[0][]; + public static final byte[][] EMPTY_BYTE_ARRAYS = new byte[0][]; + protected abstract List<Object> getQueryParameters(byte[] key); protected abstract String buildQuery(); protected abstract CqlRunOp<V> buildRunOp(ClientWrapper client, String query, Object queryId, List<Object> params, ByteBuffer key); @@ -455,7 +458,7 @@ public abstract class CqlOperation<V> extends PredefinedOperation public ByteBuffer[][] apply(ResultSet result) { if (result == null) - return new ByteBuffer[0][]; + return EMPTY_BYTE_BUFFERS; List<Row> rows = result.all(); ByteBuffer[][] r = new ByteBuffer[rows.size()][]; @@ -481,7 +484,7 @@ public abstract class CqlOperation<V> extends PredefinedOperation public ByteBuffer[][] apply(ResultMessage result) { if (!(result instanceof ResultMessage.Rows)) - return new ByteBuffer[0][]; + return EMPTY_BYTE_BUFFERS; ResultMessage.Rows rows = ((ResultMessage.Rows) result); ByteBuffer[][] r = new ByteBuffer[rows.result.size()][]; @@ -536,7 +539,7 @@ public abstract class CqlOperation<V> extends PredefinedOperation { if (result == null) - return new byte[0][]; + return EMPTY_BYTE_ARRAYS; List<Row> rows = result.all(); byte[][] r = new byte[rows.size()][]; for (int i = 0 ; i < r.length ; i++) http://git-wip-us.apache.org/repos/asf/cassandra/blob/0f5e7807/tools/stress/src/org/apache/cassandra/stress/operations/predefined/PredefinedOperation.java ---------------------------------------------------------------------- diff --git a/tools/stress/src/org/apache/cassandra/stress/operations/predefined/PredefinedOperation.java b/tools/stress/src/org/apache/cassandra/stress/operations/predefined/PredefinedOperation.java index 66f232a..b435abb 100644 --- a/tools/stress/src/org/apache/cassandra/stress/operations/predefined/PredefinedOperation.java +++ b/tools/stress/src/org/apache/cassandra/stress/operations/predefined/PredefinedOperation.java @@ -34,6 +34,7 @@ import org.apache.cassandra.thrift.SliceRange; public abstract class PredefinedOperation extends Operation { + public static final byte[] EMPTY_BYTE_ARRAY = {}; public final Command type; private final Distribution columnCount; private Object cqlCache; @@ -106,7 +107,7 @@ public abstract class PredefinedOperation extends Operation { predicate.setSlice_range(new SliceRange() .setStart(settings.columns.names.get(lb)) - .setFinish(new byte[] {}) + .setFinish(EMPTY_BYTE_ARRAY) .setReversed(false) .setCount(count()) ); http://git-wip-us.apache.org/repos/asf/cassandra/blob/0f5e7807/tools/stress/src/org/apache/cassandra/stress/operations/userdefined/SchemaStatement.java ---------------------------------------------------------------------- diff --git a/tools/stress/src/org/apache/cassandra/stress/operations/userdefined/SchemaStatement.java b/tools/stress/src/org/apache/cassandra/stress/operations/userdefined/SchemaStatement.java index 49891ec..1c88490 100644 --- a/tools/stress/src/org/apache/cassandra/stress/operations/userdefined/SchemaStatement.java +++ b/tools/stress/src/org/apache/cassandra/stress/operations/userdefined/SchemaStatement.java @@ -20,8 +20,6 @@ package org.apache.cassandra.stress.operations.userdefined; * */ - -import java.io.IOException; import java.nio.ByteBuffer; import java.util.ArrayList; import java.util.List; @@ -37,7 +35,6 @@ import org.apache.cassandra.stress.generate.Row; import org.apache.cassandra.stress.settings.StressSettings; import org.apache.cassandra.stress.util.JavaDriverClient; import org.apache.cassandra.stress.util.Timer; -import org.apache.cassandra.transport.SimpleClient; public abstract class SchemaStatement extends Operation { @@ -91,12 +88,6 @@ public abstract class SchemaStatement extends Operation return args; } - @Override - public void run(SimpleClient client) throws IOException - { - throw new UnsupportedOperationException(); - } - abstract class Runner implements RunOp { int partitionCount; http://git-wip-us.apache.org/repos/asf/cassandra/blob/0f5e7807/tools/stress/src/org/apache/cassandra/stress/operations/userdefined/ValidatingSchemaQuery.java ---------------------------------------------------------------------- diff --git a/tools/stress/src/org/apache/cassandra/stress/operations/userdefined/ValidatingSchemaQuery.java b/tools/stress/src/org/apache/cassandra/stress/operations/userdefined/ValidatingSchemaQuery.java index 8bdde51..c07328a 100644 --- a/tools/stress/src/org/apache/cassandra/stress/operations/userdefined/ValidatingSchemaQuery.java +++ b/tools/stress/src/org/apache/cassandra/stress/operations/userdefined/ValidatingSchemaQuery.java @@ -26,7 +26,6 @@ import java.nio.ByteBuffer; import java.util.ArrayList; import java.util.Iterator; import java.util.List; -import java.util.Random; import java.util.concurrent.ThreadLocalRandom; import com.datastax.driver.core.*; @@ -42,13 +41,11 @@ import org.apache.cassandra.thrift.Compression; import org.apache.cassandra.thrift.CqlResult; import org.apache.cassandra.thrift.CqlRow; import org.apache.cassandra.thrift.ThriftConversion; -import org.apache.cassandra.transport.SimpleClient; import org.apache.cassandra.utils.Pair; import org.apache.thrift.TException; public class ValidatingSchemaQuery extends Operation { - final Random random = new Random(); private Pair<Row, Row> bounds; final int clusteringComponents; @@ -57,12 +54,6 @@ public class ValidatingSchemaQuery extends Operation final int[] argumentIndex; final Object[] bindBuffer; - @Override - public void run(SimpleClient client) throws IOException - { - throw new UnsupportedOperationException(); - } - private ValidatingSchemaQuery(Timer timer, StressSettings settings, PartitionGenerator generator, SeedManager seedManager, ValidatingStatement[] statements, ConsistencyLevel cl, int clusteringComponents) { super(timer, settings, new DataSpec(generator, seedManager, new DistributionFixed(1), settings.insert.rowPopulationRatio.get(), 1)); @@ -280,14 +271,14 @@ public class ValidatingSchemaQuery extends Operation { StringBuilder cc = new StringBuilder(); StringBuilder arg = new StringBuilder(); - cc.append("("); arg.append("("); + cc.append('('); arg.append('('); for (int d = 0 ; d <= depth ; d++) { - if (d > 0) { cc.append(","); arg.append(","); } + if (d > 0) { cc.append(','); arg.append(','); } cc.append(metadata.getClusteringColumns().get(d).getName()); - arg.append("?"); + arg.append('?'); } - cc.append(")"); arg.append(")"); + cc.append(')'); arg.append(')'); ValidatingStatement[] statements = new ValidatingStatement[depth < maxDepth ? 1 : 4]; int i = 0; http://git-wip-us.apache.org/repos/asf/cassandra/blob/0f5e7807/tools/stress/src/org/apache/cassandra/stress/util/TimingInterval.java ---------------------------------------------------------------------- diff --git a/tools/stress/src/org/apache/cassandra/stress/util/TimingInterval.java b/tools/stress/src/org/apache/cassandra/stress/util/TimingInterval.java index 6be71c8..89995dd 100644 --- a/tools/stress/src/org/apache/cassandra/stress/util/TimingInterval.java +++ b/tools/stress/src/org/apache/cassandra/stress/util/TimingInterval.java @@ -27,6 +27,7 @@ import java.util.concurrent.ThreadLocalRandom; // used for both single timer results and merged timer results public final class TimingInterval { + public static final long[] EMPTY_SAMPLE = new long[0]; // nanos private final long start; private final long end; @@ -56,7 +57,7 @@ public final class TimingInterval maxLatency = totalLatency = 0; partitionCount = rowCount = operationCount = errorCount = 0; pauseStart = pauseLength = 0; - sample = new SampleOfLongs(new long[0], 1d); + sample = new SampleOfLongs(EMPTY_SAMPLE, 1d); } TimingInterval(long start, long end, long maxLatency, long pauseStart, long pauseLength, long partitionCount,