Return-Path: X-Original-To: apmail-cassandra-commits-archive@www.apache.org Delivered-To: apmail-cassandra-commits-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 7B851185CD for ; Tue, 7 Jul 2015 10:23:13 +0000 (UTC) Received: (qmail 27391 invoked by uid 500); 7 Jul 2015 10:23:13 -0000 Delivered-To: apmail-cassandra-commits-archive@cassandra.apache.org Received: (qmail 27361 invoked by uid 500); 7 Jul 2015 10:23:13 -0000 Mailing-List: contact commits-help@cassandra.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@cassandra.apache.org Delivered-To: mailing list commits@cassandra.apache.org Received: (qmail 27350 invoked by uid 99); 7 Jul 2015 10:23:13 -0000 Received: from git1-us-west.apache.org (HELO git1-us-west.apache.org) (140.211.11.23) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 07 Jul 2015 10:23:13 +0000 Received: by git1-us-west.apache.org (ASF Mail Server at git1-us-west.apache.org, from userid 33) id 26907DFFAA; Tue, 7 Jul 2015 10:23:13 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: slebresne@apache.org To: commits@cassandra.apache.org Message-Id: X-Mailer: ASF-Git Admin Mailer Subject: cassandra git commit: Fix PartitionUpdate sorting/merging code Date: Tue, 7 Jul 2015 10:23:13 +0000 (UTC) Repository: cassandra Updated Branches: refs/heads/trunk 43c27e99f -> 87c6daf6e Fix PartitionUpdate sorting/merging code patch by slebresne; reviewed by iamaleksey for CASSANDRA-9743 Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/87c6daf6 Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/87c6daf6 Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/87c6daf6 Branch: refs/heads/trunk Commit: 87c6daf6e3d64b532bcdca09f6de22c3b6f56bf7 Parents: 43c27e9 Author: Sylvain Lebresne Authored: Tue Jul 7 12:22:26 2015 +0200 Committer: Sylvain Lebresne Committed: Tue Jul 7 12:22:26 2015 +0200 ---------------------------------------------------------------------- CHANGES.txt | 1 + .../db/partitions/AbstractPartitionData.java | 19 ++++++ .../db/partitions/PartitionUpdate.java | 4 +- .../validation/entities/RowBuilderTest.java | 69 ++++++++++++++++++++ 4 files changed, 91 insertions(+), 2 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cassandra/blob/87c6daf6/CHANGES.txt ---------------------------------------------------------------------- diff --git a/CHANGES.txt b/CHANGES.txt index 450138c..53beb26 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,4 +1,5 @@ 3.0 + * Storage engine refactor (CASSANDRA-8099, 9743) * Update Guava to 18.0 (CASSANDRA-9653) * Bloom filter false positive ratio is not honoured (CASSANDRA-8413) * New option for cassandra-stress to leave a ratio of columns null (CASSANDRA-9522) http://git-wip-us.apache.org/repos/asf/cassandra/blob/87c6daf6/src/java/org/apache/cassandra/db/partitions/AbstractPartitionData.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/db/partitions/AbstractPartitionData.java b/src/java/org/apache/cassandra/db/partitions/AbstractPartitionData.java index 2fcd7b3..6775cf1 100644 --- a/src/java/org/apache/cassandra/db/partitions/AbstractPartitionData.java +++ b/src/java/org/apache/cassandra/db/partitions/AbstractPartitionData.java @@ -227,6 +227,25 @@ public abstract class AbstractPartitionData implements Partition, Iterable data.swap(i, j); } + protected void merge(int i, int j, int nowInSec) + { + data.merge(i, j, nowInSec); + if (livenessInfos.timestamp(i) > livenessInfos.timestamp(j)) + livenessInfos.move(i, j); + if (deletions.supersedes(i, j)) + deletions.move(i, j); + } + + protected void move(int i, int j) + { + int cs = metadata.clusteringColumns().size(); + for (int k = 0; k < cs; k++) + clusterings[j * cs + k] = clusterings[i * cs + k]; + data.move(i, j); + livenessInfos.move(i, j); + deletions.move(i, j); + } + public int rowCount() { return rows; http://git-wip-us.apache.org/repos/asf/cassandra/blob/87c6daf6/src/java/org/apache/cassandra/db/partitions/PartitionUpdate.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/db/partitions/PartitionUpdate.java b/src/java/org/apache/cassandra/db/partitions/PartitionUpdate.java index f4195c1..a1ee239 100644 --- a/src/java/org/apache/cassandra/db/partitions/PartitionUpdate.java +++ b/src/java/org/apache/cassandra/db/partitions/PartitionUpdate.java @@ -488,14 +488,14 @@ public class PartitionUpdate extends AbstractPartitionData implements Sorting.So { // current and previous are the same row. Merge current into previous // (and so previous + 1 will be "free"). - data.merge(current, previous, nowInSec); + merge(current, previous, nowInSec); } else { // data[current] != [previous], so move current just after previous if needs be ++previous; if (previous != current) - data.move(current, previous); + move(current, previous); } } http://git-wip-us.apache.org/repos/asf/cassandra/blob/87c6daf6/test/unit/org/apache/cassandra/cql3/validation/entities/RowBuilderTest.java ---------------------------------------------------------------------- diff --git a/test/unit/org/apache/cassandra/cql3/validation/entities/RowBuilderTest.java b/test/unit/org/apache/cassandra/cql3/validation/entities/RowBuilderTest.java new file mode 100644 index 0000000..7ab71b1 --- /dev/null +++ b/test/unit/org/apache/cassandra/cql3/validation/entities/RowBuilderTest.java @@ -0,0 +1,69 @@ +/* + * 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.cql3.validation.entities; + +import org.junit.Test; + +import org.apache.cassandra.cql3.CQLTester; +import org.apache.cassandra.db.Mutation; +import org.apache.cassandra.db.RowUpdateBuilder; +import org.apache.cassandra.db.partitions.PartitionUpdate; +import org.apache.cassandra.db.marshal.AsciiType; +import org.apache.cassandra.service.StorageService; +import org.apache.cassandra.utils.FBUtilities; + +public class RowBuilderTest extends CQLTester +{ + @Test + public void testAddListEntry() throws Throwable + { + createTable("CREATE TABLE %s (" + + "pk text," + + "ck text," + + "l1 list," + + "l2 list," + + "PRIMARY KEY ((pk), ck))"); + + long timestamp = FBUtilities.timestampMicros(); + + Mutation mutation = new Mutation(keyspace(), StorageService.getPartitioner().decorateKey(AsciiType.instance.fromString("test"))); + addToMutation("row1", timestamp, mutation); + addToMutation("row2", timestamp, mutation); + + for (PartitionUpdate update : mutation.getPartitionUpdates()) + update.iterator(); + + mutation.apply(); + + assertRowCount(execute("SELECT ck FROM %s"), 2); + } + + private void addToMutation(String typeName, long timestamp, Mutation mutation) + { + RowUpdateBuilder adder = new RowUpdateBuilder(getCurrentColumnFamilyStore().metadata, timestamp, mutation) + .clustering(typeName); + + for (int i = 0; i < 2; i++) + { + adder.addListEntry("l1", i) + .addListEntry("l2", i); + } + + adder.build(); + } +}