Merge branch 'cassandra-3.0' into cassandra-3.X
Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/075539a5 Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/075539a5 Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/075539a5 Branch: refs/heads/cassandra-3.X Commit: 075539a5b0fee385457b8b580650e1557297e0d0 Parents: 96d67b1 3fd4c68 Author: Jason Brown <jasedbr...@gmail.com> Authored: Mon Nov 21 06:45:41 2016 -0800 Committer: Jason Brown <jasedbr...@gmail.com> Committed: Mon Nov 21 06:47:17 2016 -0800 ---------------------------------------------------------------------- CHANGES.txt | 3 + .../repair/messages/AnticompactionRequest.java | 19 ++ .../repair/messages/CleanupMessage.java | 17 ++ .../repair/messages/PrepareMessage.java | 22 +++ .../repair/messages/SnapshotMessage.java | 16 ++ .../cassandra/repair/messages/SyncComplete.java | 19 ++ .../cassandra/repair/messages/SyncRequest.java | 21 +++ .../repair/messages/ValidationComplete.java | 18 ++ .../RepairMessageSerializationsTest.java | 188 +++++++++++++++++++ 9 files changed, 323 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cassandra/blob/075539a5/CHANGES.txt ---------------------------------------------------------------------- diff --cc CHANGES.txt index 2826011,e613d7c..24641a6 --- a/CHANGES.txt +++ b/CHANGES.txt @@@ -1,115 -1,20 +1,118 @@@ -3.0.11 ++3.11 + * AnticompactionRequestSerializer serializedSize is incorrect (CASSANDRA-12934) - * Prevent reloading of logback.xml from UDF sandbox (CASSANDRA-12535) -Merged from 2.2: - * Avoid blocking gossip during pending range calculation (CASSANDRA-12281) + - -3.0.10 - * Disallow offheap_buffers memtable allocation (CASSANDRA-11039) +3.10 + * Don't shut down socket input/output on StreamSession (CASSANDRA-12903) + * Fix Murmur3PartitionerTest (CASSANDRA-12858) + * Move cqlsh syntax rules into separate module and allow easier customization (CASSANDRA-12897) * Fix CommitLogSegmentManagerTest (CASSANDRA-12283) + * Fix cassandra-stress truncate option (CASSANDRA-12695) + * Fix crossNode value when receiving messages (CASSANDRA-12791) + * Don't load MX4J beans twice (CASSANDRA-12869) + * Extend native protocol request flags, add versions to SUPPORTED, and introduce ProtocolVersion enum (CASSANDRA-12838) + * Set JOINING mode when running pre-join tasks (CASSANDRA-12836) + * remove net.mintern.primitive library due to license issue (CASSANDRA-12845) + * Properly format IPv6 addresses when logging JMX service URL (CASSANDRA-12454) + * Optimize the vnode allocation for single replica per DC (CASSANDRA-12777) + * Use non-token restrictions for bounds when token restrictions are overridden (CASSANDRA-12419) + * Fix CQLSH auto completion for PER PARTITION LIMIT (CASSANDRA-12803) + * Use different build directories for Eclipse and Ant (CASSANDRA-12466) + * Avoid potential AttributeError in cqlsh due to no table metadata (CASSANDRA-12815) + * Fix RandomReplicationAwareTokenAllocatorTest.testExistingCluster (CASSANDRA-12812) + * Upgrade commons-codec to 1.9 (CASSANDRA-12790) + * Make the fanout size for LeveledCompactionStrategy to be configurable (CASSANDRA-11550) + * Add duration data type (CASSANDRA-11873) + * Fix timeout in ReplicationAwareTokenAllocatorTest (CASSANDRA-12784) + * Improve sum aggregate functions (CASSANDRA-12417) + * Make cassandra.yaml docs for batch_size_*_threshold_in_kb reflect changes in CASSANDRA-10876 (CASSANDRA-12761) + * cqlsh fails to format collections when using aliases (CASSANDRA-11534) + * Check for hash conflicts in prepared statements (CASSANDRA-12733) + * Exit query parsing upon first error (CASSANDRA-12598) + * Fix cassandra-stress to use single seed in UUID generation (CASSANDRA-12729) + * CQLSSTableWriter does not allow Update statement (CASSANDRA-12450) + * Config class uses boxed types but DD exposes primitive types (CASSANDRA-12199) + * Add pre- and post-shutdown hooks to Storage Service (CASSANDRA-12461) + * Add hint delivery metrics (CASSANDRA-12693) + * Remove IndexInfo cache from FileIndexInfoRetriever (CASSANDRA-12731) + * ColumnIndex does not reuse buffer (CASSANDRA-12502) + * cdc column addition still breaks schema migration tasks (CASSANDRA-12697) + * Upgrade metrics-reporter dependencies (CASSANDRA-12089) + * Tune compaction thread count via nodetool (CASSANDRA-12248) + * Add +=/-= shortcut syntax for update queries (CASSANDRA-12232) + * Include repair session IDs in repair start message (CASSANDRA-12532) + * Add a blocking task to Index, run before joining the ring (CASSANDRA-12039) + * Fix NPE when using CQLSSTableWriter (CASSANDRA-12667) + * Support optional backpressure strategies at the coordinator (CASSANDRA-9318) + * Make randompartitioner work with new vnode allocation (CASSANDRA-12647) + * Fix cassandra-stress graphing (CASSANDRA-12237) + * Allow filtering on partition key columns for queries without secondary indexes (CASSANDRA-11031) + * Fix Cassandra Stress reporting thread model and precision (CASSANDRA-12585) + * Add JMH benchmarks.jar (CASSANDRA-12586) + * Cleanup uses of AlterTableStatementColumn (CASSANDRA-12567) + * Add keep-alive to streaming (CASSANDRA-11841) + * Tracing payload is passed through newSession(..) (CASSANDRA-11706) + * avoid deleting non existing sstable files and improve related log messages (CASSANDRA-12261) + * json/yaml output format for nodetool compactionhistory (CASSANDRA-12486) + * Retry all internode messages once after a connection is + closed and reopened (CASSANDRA-12192) + * Add support to rebuild from targeted replica (CASSANDRA-9875) + * Add sequence distribution type to cassandra stress (CASSANDRA-12490) + * "SELECT * FROM foo LIMIT ;" does not error out (CASSANDRA-12154) + * Define executeLocally() at the ReadQuery Level (CASSANDRA-12474) + * Extend read/write failure messages with a map of replica addresses + to error codes in the v5 native protocol (CASSANDRA-12311) + * Fix rebuild of SASI indexes with existing index files (CASSANDRA-12374) + * Let DatabaseDescriptor not implicitly startup services (CASSANDRA-9054, 12550) + * Fix clustering indexes in presence of static columns in SASI (CASSANDRA-12378) + * Fix queries on columns with reversed type on SASI indexes (CASSANDRA-12223) + * Added slow query log (CASSANDRA-12403) + * Count full coordinated request against timeout (CASSANDRA-12256) + * Allow TTL with null value on insert and update (CASSANDRA-12216) + * Make decommission operation resumable (CASSANDRA-12008) + * Add support to one-way targeted repair (CASSANDRA-9876) + * Remove clientutil jar (CASSANDRA-11635) + * Fix compaction throughput throttle (CASSANDRA-12366, CASSANDRA-12717) + * Delay releasing Memtable memory on flush until PostFlush has finished running (CASSANDRA-12358) + * Cassandra stress should dump all setting on startup (CASSANDRA-11914) + * Make it possible to compact a given token range (CASSANDRA-10643) + * Allow updating DynamicEndpointSnitch properties via JMX (CASSANDRA-12179) + * Collect metrics on queries by consistency level (CASSANDRA-7384) + * Add support for GROUP BY to SELECT statement (CASSANDRA-10707) + * Deprecate memtable_cleanup_threshold and update default for memtable_flush_writers (CASSANDRA-12228) + * Upgrade to OHC 0.4.4 (CASSANDRA-12133) + * Add version command to cassandra-stress (CASSANDRA-12258) + * Create compaction-stress tool (CASSANDRA-11844) + * Garbage-collecting compaction operation and schema option (CASSANDRA-7019) + * Add beta protocol flag for v5 native protocol (CASSANDRA-12142) + * Support filtering on non-PRIMARY KEY columns in the CREATE + MATERIALIZED VIEW statement's WHERE clause (CASSANDRA-10368) + * Unify STDOUT and SYSTEMLOG logback format (CASSANDRA-12004) + * COPY FROM should raise error for non-existing input files (CASSANDRA-12174) + * Faster write path (CASSANDRA-12269) + * Option to leave omitted columns in INSERT JSON unset (CASSANDRA-11424) + * Support json/yaml output in nodetool tpstats (CASSANDRA-12035) + * Expose metrics for successful/failed authentication attempts (CASSANDRA-10635) + * Prepend snapshot name with "truncated" or "dropped" when a snapshot + is taken before truncating or dropping a table (CASSANDRA-12178) + * Optimize RestrictionSet (CASSANDRA-12153) + * cqlsh does not automatically downgrade CQL version (CASSANDRA-12150) + * Omit (de)serialization of state variable in UDAs (CASSANDRA-9613) + * Create a system table to expose prepared statements (CASSANDRA-8831) + * Reuse DataOutputBuffer from ColumnIndex (CASSANDRA-11970) + * Remove DatabaseDescriptor dependency from SegmentedFile (CASSANDRA-11580) + * Add supplied username to authentication error messages (CASSANDRA-12076) + * Remove pre-startup check for open JMX port (CASSANDRA-12074) + * Remove compaction Severity from DynamicEndpointSnitch (CASSANDRA-11738) + * Restore resumable hints delivery (CASSANDRA-11960) + * Properly report LWT contention (CASSANDRA-12626) +Merged from 3.0: + * Prevent reloading of logback.xml from UDF sandbox (CASSANDRA-12535) * Pass root cause to CorruptBlockException when uncompression failed (CASSANDRA-12889) - * Fix partition count log during compaction (CASSANDRA-12184) * Batch with multiple conditional updates for the same partition causes AssertionError (CASSANDRA-12867) * Make AbstractReplicationStrategy extendable from outside its package (CASSANDRA-12788) - * Fix CommitLogTest.testDeleteIfNotDirty (CASSANDRA-12854) * Don't tell users to turn off consistent rangemovements during rebuild. (CASSANDRA-12296) - * Avoid deadlock due to materialized view lock contention (CASSANDRA-12689) + * Fix CommitLogTest.testDeleteIfNotDirty (CASSANDRA-12854) + * Avoid deadlock due to MV lock contention (CASSANDRA-12689) * Fix for KeyCacheCqlTest flakiness (CASSANDRA-12801) * Include SSTable filename in compacting large row message (CASSANDRA-12384) * Fix potential socket leak (CASSANDRA-12329, CASSANDRA-12330) http://git-wip-us.apache.org/repos/asf/cassandra/blob/075539a5/test/unit/org/apache/cassandra/repair/messages/RepairMessageSerializationsTest.java ---------------------------------------------------------------------- diff --cc test/unit/org/apache/cassandra/repair/messages/RepairMessageSerializationsTest.java index 0000000,5dbed3f..028d899 mode 000000,100644..100644 --- a/test/unit/org/apache/cassandra/repair/messages/RepairMessageSerializationsTest.java +++ b/test/unit/org/apache/cassandra/repair/messages/RepairMessageSerializationsTest.java @@@ -1,0 -1,187 +1,188 @@@ + /* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + package org.apache.cassandra.repair.messages; + + import java.io.IOException; + import java.net.InetAddress; + import java.nio.ByteBuffer; + import java.util.ArrayList; + import java.util.List; + import java.util.UUID; + + import org.junit.AfterClass; + import org.junit.Assert; + import org.junit.BeforeClass; + import org.junit.Test; + + import org.apache.cassandra.config.DatabaseDescriptor; + import org.apache.cassandra.dht.IPartitioner; + import org.apache.cassandra.dht.Murmur3Partitioner; + import org.apache.cassandra.dht.Murmur3Partitioner.LongToken; + import org.apache.cassandra.dht.Range; + import org.apache.cassandra.dht.Token; + import org.apache.cassandra.io.IVersionedSerializer; + import org.apache.cassandra.io.util.DataInputBuffer; + import org.apache.cassandra.io.util.DataInputPlus; + import org.apache.cassandra.io.util.DataOutputBufferFixed; + import org.apache.cassandra.io.util.DataOutputPlus; + import org.apache.cassandra.net.MessagingService; + import org.apache.cassandra.repair.NodePair; + import org.apache.cassandra.repair.RepairJobDesc; + import org.apache.cassandra.service.StorageService; + import org.apache.cassandra.utils.MerkleTrees; + + public class RepairMessageSerializationsTest + { + private static final int PROTOCOL_VERSION = MessagingService.current_version; + private static final int GC_BEFORE = 1000000; + + private static IPartitioner originalPartitioner; + + @BeforeClass + public static void before() + { ++ DatabaseDescriptor.daemonInitialization(); + originalPartitioner = StorageService.instance.setPartitionerUnsafe(Murmur3Partitioner.instance); + } + + @AfterClass + public static void after() + { + DatabaseDescriptor.setPartitionerUnsafe(originalPartitioner); + } + + @Test + public void validationRequestMessage() throws IOException + { + RepairJobDesc jobDesc = buildRepairJobDesc(); + ValidationRequest msg = new ValidationRequest(jobDesc, GC_BEFORE); + ValidationRequest deserialized = serializeRoundTrip(msg, ValidationRequest.serializer); + Assert.assertEquals(jobDesc, deserialized.desc); + } + + private RepairJobDesc buildRepairJobDesc() + { + List<Range<Token>> tokenRanges = buildTokenRanges(); + return new RepairJobDesc(UUID.randomUUID(), UUID.randomUUID(), "serializationsTestKeyspace", "repairMessages", tokenRanges); + } + + private List<Range<Token>> buildTokenRanges() + { + List<Range<Token>> tokenRanges = new ArrayList<>(4); + tokenRanges.add(new Range<>(new LongToken(1000), new LongToken(1001))); + tokenRanges.add(new Range<>(new LongToken(2000), new LongToken(2001))); + tokenRanges.add(new Range<>(new LongToken(3000), new LongToken(3001))); + tokenRanges.add(new Range<>(new LongToken(4000), new LongToken(4001))); + return tokenRanges; + } + + private <T extends RepairMessage> T serializeRoundTrip(T msg, IVersionedSerializer<T> serializer) throws IOException + { + long size = serializer.serializedSize(msg, PROTOCOL_VERSION); + + ByteBuffer buf = ByteBuffer.allocate((int)size); + DataOutputPlus out = new DataOutputBufferFixed(buf); + serializer.serialize(msg, out, PROTOCOL_VERSION); + Assert.assertEquals(size, buf.position()); + + buf.flip(); + DataInputPlus in = new DataInputBuffer(buf, false); + T deserialized = serializer.deserialize(in, PROTOCOL_VERSION); + Assert.assertEquals(msg, deserialized); + Assert.assertEquals(msg.hashCode(), deserialized.hashCode()); + return deserialized; + } + + @Test + public void validationCompleteMessage_NoMerkleTree() throws IOException + { + ValidationComplete deserialized = validationCompleteMessage(null); + Assert.assertNull(deserialized.trees); + } + + @Test + public void validationCompleteMessage_WithMerkleTree() throws IOException + { + MerkleTrees trees = new MerkleTrees(Murmur3Partitioner.instance); + trees.addMerkleTree(256, new Range<>(new LongToken(1000), new LongToken(1001))); + ValidationComplete deserialized = validationCompleteMessage(trees); + + // a simple check to make sure we got some merkle trees back. + Assert.assertEquals(trees.size(), deserialized.trees.size()); + } + + private ValidationComplete validationCompleteMessage(MerkleTrees trees) throws IOException + { + RepairJobDesc jobDesc = buildRepairJobDesc(); + ValidationComplete msg = trees == null ? + new ValidationComplete(jobDesc) : + new ValidationComplete(jobDesc, trees); + ValidationComplete deserialized = serializeRoundTrip(msg, ValidationComplete.serializer); + return deserialized; + } + + @Test + public void syncRequestMessage() throws IOException + { + InetAddress initiator = InetAddress.getByName("127.0.0.1"); + InetAddress src = InetAddress.getByName("127.0.0.2"); + InetAddress dst = InetAddress.getByName("127.0.0.3"); + + SyncRequest msg = new SyncRequest(buildRepairJobDesc(), initiator, src, dst, buildTokenRanges()); + serializeRoundTrip(msg, SyncRequest.serializer); + } + + @Test + public void syncCompleteMessage() throws IOException + { + InetAddress src = InetAddress.getByName("127.0.0.2"); + InetAddress dst = InetAddress.getByName("127.0.0.3"); + SyncComplete msg = new SyncComplete(buildRepairJobDesc(), new NodePair(src, dst), true); + serializeRoundTrip(msg, SyncComplete.serializer); + } + + @Test + public void antiCompactionRequestMessage() throws IOException + { + AnticompactionRequest msg = new AnticompactionRequest(UUID.randomUUID(), buildTokenRanges()); + serializeRoundTrip(msg, AnticompactionRequest.serializer); + } + + @Test + public void prepareMessage() throws IOException + { + PrepareMessage msg = new PrepareMessage(UUID.randomUUID(), new ArrayList<UUID>() {{add(UUID.randomUUID());}}, + buildTokenRanges(), true, 100000L, false); + serializeRoundTrip(msg, PrepareMessage.serializer); + } + + @Test + public void snapshotMessage() throws IOException + { + SnapshotMessage msg = new SnapshotMessage(buildRepairJobDesc()); + serializeRoundTrip(msg, SnapshotMessage.serializer); + } + + @Test + public void cleanupMessage() throws IOException + { + CleanupMessage msg = new CleanupMessage(UUID.randomUUID()); + serializeRoundTrip(msg, CleanupMessage.serializer); + } + }