You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by ty...@apache.org on 2014/11/04 19:31:42 UTC

[1/5] git commit: Fix deletion for indexes on primary key columns

Repository: cassandra
Updated Branches:
  refs/heads/trunk 525ac00c0 -> 07068e204


Fix deletion for indexes on primary key columns

patch by slebresne; reviewed by thobbs for CASSANDRA-8206


Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo
Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/c345f81e
Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/c345f81e
Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/c345f81e

Branch: refs/heads/trunk
Commit: c345f81e7fca246677efb9f3073eb903ce8054f0
Parents: e88bcfe
Author: Sylvain Lebresne <sy...@datastax.com>
Authored: Tue Nov 4 18:36:53 2014 +0100
Committer: Sylvain Lebresne <sy...@datastax.com>
Committed: Tue Nov 4 18:37:25 2014 +0100

----------------------------------------------------------------------
 CHANGES.txt                                                  | 1 +
 .../db/index/AbstractSimplePerColumnSecondaryIndex.java      | 5 +++++
 .../apache/cassandra/db/index/PerColumnSecondaryIndex.java   | 7 ++++++-
 src/java/org/apache/cassandra/db/index/SecondaryIndex.java   | 7 +++++++
 .../org/apache/cassandra/db/index/SecondaryIndexManager.java | 4 ++--
 .../db/index/composites/CompositesIndexOnClusteringKey.java  | 8 ++++++++
 .../db/index/composites/CompositesIndexOnPartitionKey.java   | 8 ++++++++
 7 files changed, 37 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/c345f81e/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index 97fb94a..2fe3a39 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,4 +1,5 @@
 2.0.12:
+ * Fix deletion for indexes on primary key columns (CASSANDRA-8206)
  * Add 'nodetool statusgossip' (CASSANDRA-8125)
  * Improve client notification that nodes are ready for requests (CASSANDRA-7510)
  * Handle negative timestamp in writetime method (CASSANDRA-8139)

http://git-wip-us.apache.org/repos/asf/cassandra/blob/c345f81e/src/java/org/apache/cassandra/db/index/AbstractSimplePerColumnSecondaryIndex.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/index/AbstractSimplePerColumnSecondaryIndex.java b/src/java/org/apache/cassandra/db/index/AbstractSimplePerColumnSecondaryIndex.java
index 87e87cb..553b9d4 100644
--- a/src/java/org/apache/cassandra/db/index/AbstractSimplePerColumnSecondaryIndex.java
+++ b/src/java/org/apache/cassandra/db/index/AbstractSimplePerColumnSecondaryIndex.java
@@ -78,6 +78,11 @@ public abstract class AbstractSimplePerColumnSecondaryIndex extends PerColumnSec
 
     public void delete(ByteBuffer rowKey, Column column)
     {
+        deleteForCleanup(rowKey, column);
+    }
+
+    public void deleteForCleanup(ByteBuffer rowKey, Column column)
+    {
         if (column.isMarkedForDelete(System.currentTimeMillis()))
             return;
 

http://git-wip-us.apache.org/repos/asf/cassandra/blob/c345f81e/src/java/org/apache/cassandra/db/index/PerColumnSecondaryIndex.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/index/PerColumnSecondaryIndex.java b/src/java/org/apache/cassandra/db/index/PerColumnSecondaryIndex.java
index e77bd0f..73f53f1 100644
--- a/src/java/org/apache/cassandra/db/index/PerColumnSecondaryIndex.java
+++ b/src/java/org/apache/cassandra/db/index/PerColumnSecondaryIndex.java
@@ -29,7 +29,7 @@ import org.apache.cassandra.utils.FBUtilities;
 public abstract class PerColumnSecondaryIndex extends SecondaryIndex
 {
     /**
-     * Delete a column from the index
+     * Called when a column has been tombstoned or replaced.
      *
      * @param rowKey the underlying row key which is indexed
      * @param col all the column info
@@ -37,6 +37,11 @@ public abstract class PerColumnSecondaryIndex extends SecondaryIndex
     public abstract void delete(ByteBuffer rowKey, Column col);
 
     /**
+     * Called when a column has been removed due to a cleanup operation.
+     */
+    public abstract void deleteForCleanup(ByteBuffer rowKey, Column col);
+
+    /**
      * insert a column to the index
      *
      * @param rowKey the underlying row key which is indexed

http://git-wip-us.apache.org/repos/asf/cassandra/blob/c345f81e/src/java/org/apache/cassandra/db/index/SecondaryIndex.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/index/SecondaryIndex.java b/src/java/org/apache/cassandra/db/index/SecondaryIndex.java
index 64266c4..a83f5dd 100644
--- a/src/java/org/apache/cassandra/db/index/SecondaryIndex.java
+++ b/src/java/org/apache/cassandra/db/index/SecondaryIndex.java
@@ -21,6 +21,7 @@ import java.nio.ByteBuffer;
 import java.util.*;
 import java.util.concurrent.*;
 
+import com.google.common.base.Objects;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -371,4 +372,10 @@ public abstract class SecondaryIndex
         }
         throw new AssertionError();
     }
+
+    @Override
+    public String toString()
+    {
+        return Objects.toStringHelper(this).add("columnDefs", columnDefs).toString();
+    }
 }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/c345f81e/src/java/org/apache/cassandra/db/index/SecondaryIndexManager.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/index/SecondaryIndexManager.java b/src/java/org/apache/cassandra/db/index/SecondaryIndexManager.java
index b75f917..6d9f28a 100644
--- a/src/java/org/apache/cassandra/db/index/SecondaryIndexManager.java
+++ b/src/java/org/apache/cassandra/db/index/SecondaryIndexManager.java
@@ -465,7 +465,7 @@ public class SecondaryIndexManager
                 }
                 else
                 {
-                    ((PerColumnSecondaryIndex) index).delete(key.key, column);
+                    ((PerColumnSecondaryIndex) index).deleteForCleanup(key.key, column);
                 }
             }
         }
@@ -618,7 +618,7 @@ public class SecondaryIndexManager
         {
             if (oldColumn.equals(column))
                 return;
-            
+
             for (SecondaryIndex index : indexFor(column.name()))
             {
                 if (index instanceof PerColumnSecondaryIndex)

http://git-wip-us.apache.org/repos/asf/cassandra/blob/c345f81e/src/java/org/apache/cassandra/db/index/composites/CompositesIndexOnClusteringKey.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/index/composites/CompositesIndexOnClusteringKey.java b/src/java/org/apache/cassandra/db/index/composites/CompositesIndexOnClusteringKey.java
index 954f380..564d6bb 100644
--- a/src/java/org/apache/cassandra/db/index/composites/CompositesIndexOnClusteringKey.java
+++ b/src/java/org/apache/cassandra/db/index/composites/CompositesIndexOnClusteringKey.java
@@ -112,4 +112,12 @@ public class CompositesIndexOnClusteringKey extends CompositesIndex
     {
         return data.hasOnlyTombstones(now);
     }
+
+    @Override
+    public void delete(ByteBuffer rowKey, Column column)
+    {
+        // We only know that one column of the CQL row has been updated/deleted, but we don't know if the
+        // full row has been deleted so we should not do anything. If it ends up that the whole row has
+        // been deleted, it will be eventually cleaned up on read because the entry will be detected stale.
+    }
 }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/c345f81e/src/java/org/apache/cassandra/db/index/composites/CompositesIndexOnPartitionKey.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/index/composites/CompositesIndexOnPartitionKey.java b/src/java/org/apache/cassandra/db/index/composites/CompositesIndexOnPartitionKey.java
index 4e2c580..e8956dc 100644
--- a/src/java/org/apache/cassandra/db/index/composites/CompositesIndexOnPartitionKey.java
+++ b/src/java/org/apache/cassandra/db/index/composites/CompositesIndexOnPartitionKey.java
@@ -99,4 +99,12 @@ public class CompositesIndexOnPartitionKey extends CompositesIndex
     {
         return data.hasOnlyTombstones(now);
     }
+
+    @Override
+    public void delete(ByteBuffer rowKey, Column column)
+    {
+        // We only know that one column of the CQL row has been updated/deleted, but we don't know if the
+        // full row has been deleted so we should not do anything. If it ends up that the whole row has
+        // been deleted, it will be eventually cleaned up on read because the entry will be detected stale.
+    }
 }


[3/5] git commit: Ninja: update unit tests for CASSANDRA-8206

Posted by ty...@apache.org.
Ninja: update unit tests for CASSANDRA-8206


Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo
Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/b3c1e147
Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/b3c1e147
Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/b3c1e147

Branch: refs/heads/trunk
Commit: b3c1e147b5cdeaba283e082f9091d907cdfdcfee
Parents: c345f81
Author: Tyler Hobbs <ty...@datastax.com>
Authored: Tue Nov 4 11:56:13 2014 -0600
Committer: Tyler Hobbs <ty...@datastax.com>
Committed: Tue Nov 4 11:56:13 2014 -0600

----------------------------------------------------------------------
 test/unit/org/apache/cassandra/db/RangeTombstoneTest.java       | 3 +++
 .../org/apache/cassandra/db/SecondaryIndexColumnSizeTest.java   | 5 +++++
 2 files changed, 8 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/b3c1e147/test/unit/org/apache/cassandra/db/RangeTombstoneTest.java
----------------------------------------------------------------------
diff --git a/test/unit/org/apache/cassandra/db/RangeTombstoneTest.java b/test/unit/org/apache/cassandra/db/RangeTombstoneTest.java
index 4dc7c0b..0df47f6 100644
--- a/test/unit/org/apache/cassandra/db/RangeTombstoneTest.java
+++ b/test/unit/org/apache/cassandra/db/RangeTombstoneTest.java
@@ -591,6 +591,9 @@ public class RangeTombstoneTest extends SchemaLoader
             deletes.add(col);
         }
 
+        @Override
+        public void deleteForCleanup(ByteBuffer rowKey, Column col) { }
+
         public void insert(ByteBuffer rowKey, Column col)
         {
             inserts.add(col);

http://git-wip-us.apache.org/repos/asf/cassandra/blob/b3c1e147/test/unit/org/apache/cassandra/db/SecondaryIndexColumnSizeTest.java
----------------------------------------------------------------------
diff --git a/test/unit/org/apache/cassandra/db/SecondaryIndexColumnSizeTest.java b/test/unit/org/apache/cassandra/db/SecondaryIndexColumnSizeTest.java
index 51d9ee8..1c0d568 100644
--- a/test/unit/org/apache/cassandra/db/SecondaryIndexColumnSizeTest.java
+++ b/test/unit/org/apache/cassandra/db/SecondaryIndexColumnSizeTest.java
@@ -202,6 +202,11 @@ public class SecondaryIndexColumnSizeTest
         }
 
         @Override
+        public void deleteForCleanup(ByteBuffer rowKey, Column col)
+        {
+        }
+
+        @Override
         public void insert(ByteBuffer rowKey, Column col)
         {
         }


[5/5] git commit: Merge branch 'cassandra-2.1' into trunk

Posted by ty...@apache.org.
Merge branch 'cassandra-2.1' into trunk

Conflicts:
	src/java/org/apache/cassandra/db/index/SecondaryIndex.java


Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo
Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/07068e20
Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/07068e20
Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/07068e20

Branch: refs/heads/trunk
Commit: 07068e204df0f6b49eaef3034d4782f10a9d6fe1
Parents: 525ac00 2d4a305
Author: Tyler Hobbs <ty...@datastax.com>
Authored: Tue Nov 4 12:03:35 2014 -0600
Committer: Tyler Hobbs <ty...@datastax.com>
Committed: Tue Nov 4 12:03:35 2014 -0600

----------------------------------------------------------------------
 CHANGES.txt                                                 | 1 +
 .../db/index/AbstractSimplePerColumnSecondaryIndex.java     | 5 +++++
 .../apache/cassandra/db/index/PerColumnSecondaryIndex.java  | 7 ++++++-
 src/java/org/apache/cassandra/db/index/SecondaryIndex.java  | 7 +++++++
 .../apache/cassandra/db/index/SecondaryIndexManager.java    | 4 ++--
 .../db/index/composites/CompositesIndexOnClusteringKey.java | 9 +++++++++
 .../db/index/composites/CompositesIndexOnPartitionKey.java  | 9 +++++++++
 test/unit/org/apache/cassandra/db/RangeTombstoneTest.java   | 3 +++
 .../org/apache/cassandra/db/SecondaryIndexCellSizeTest.java | 3 +++
 9 files changed, 45 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/07068e20/CHANGES.txt
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cassandra/blob/07068e20/src/java/org/apache/cassandra/db/index/SecondaryIndex.java
----------------------------------------------------------------------
diff --cc src/java/org/apache/cassandra/db/index/SecondaryIndex.java
index b52b6a2,044912f..2717e08
--- a/src/java/org/apache/cassandra/db/index/SecondaryIndex.java
+++ b/src/java/org/apache/cassandra/db/index/SecondaryIndex.java
@@@ -26,7 -26,7 +26,8 @@@ import java.util.concurrent.ConcurrentH
  import java.util.concurrent.Future;
  import java.util.concurrent.FutureTask;
  
 +import org.apache.cassandra.io.sstable.format.SSTableReader;
+ import com.google.common.base.Objects;
  import org.apache.commons.lang3.StringUtils;
  
  import org.slf4j.Logger;

http://git-wip-us.apache.org/repos/asf/cassandra/blob/07068e20/src/java/org/apache/cassandra/db/index/SecondaryIndexManager.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cassandra/blob/07068e20/test/unit/org/apache/cassandra/db/RangeTombstoneTest.java
----------------------------------------------------------------------


[2/5] git commit: Merge branch 'cassandra-2.0' into cassandra-2.1

Posted by ty...@apache.org.
Merge branch 'cassandra-2.0' into cassandra-2.1

Conflicts:
	CHANGES.txt
	src/java/org/apache/cassandra/db/index/AbstractSimplePerColumnSecondaryIndex.java
	src/java/org/apache/cassandra/db/index/PerColumnSecondaryIndex.java
	src/java/org/apache/cassandra/db/index/SecondaryIndexManager.java


Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo
Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/76478043
Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/76478043
Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/76478043

Branch: refs/heads/trunk
Commit: 76478043099998de4870e27b0e421ed8ccf1f4cb
Parents: 5117a5d c345f81
Author: Sylvain Lebresne <sy...@datastax.com>
Authored: Tue Nov 4 18:42:53 2014 +0100
Committer: Sylvain Lebresne <sy...@datastax.com>
Committed: Tue Nov 4 18:42:53 2014 +0100

----------------------------------------------------------------------
 CHANGES.txt                                                 | 1 +
 .../db/index/AbstractSimplePerColumnSecondaryIndex.java     | 5 +++++
 .../apache/cassandra/db/index/PerColumnSecondaryIndex.java  | 7 ++++++-
 src/java/org/apache/cassandra/db/index/SecondaryIndex.java  | 7 +++++++
 .../apache/cassandra/db/index/SecondaryIndexManager.java    | 4 ++--
 .../db/index/composites/CompositesIndexOnClusteringKey.java | 9 +++++++++
 .../db/index/composites/CompositesIndexOnPartitionKey.java  | 9 +++++++++
 7 files changed, 39 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/76478043/CHANGES.txt
----------------------------------------------------------------------
diff --cc CHANGES.txt
index 7fb32fe,2fe3a39..9dbb66b
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@@ -1,22 -1,5 +1,23 @@@
 -2.0.12:
 +2.1.2
 + * Fix issues with CONTAINS (KEY) queries on secondary indexes
 +   (CASSANDRA-8147)
 + * Fix read-rate tracking of sstables for some queries (CASSANDRA-8239)
 + * Fix default timestamp in QueryOptions (CASSANDRA-8246)
 + * Set socket timeout when reading remote version (CASSANDRA-8188)
 + * Refactor how we track live size (CASSANDRA-7852)
 + * Make sure unfinished compaction files are removed (CASSANDRA-8124)
 + * Fix shutdown when run as Windows service (CASSANDRA-8136)
 + * Fix DESCRIBE TABLE with custom indexes (CASSANDRA-8031)
 + * Fix race in RecoveryManagerTest (CASSANDRA-8176)
 + * Avoid IllegalArgumentException while sorting sstables in
 +   IndexSummaryManager (CASSANDRA-8182)
 + * Shutdown JVM on file descriptor exhaustion (CASSANDRA-7579)
 + * Add 'die' policy for commit log and disk failure (CASSANDRA-7927)
 + * Fix installing as service on Windows (CASSANDRA-8115)
 + * Fix CREATE TABLE for CQL2 (CASSANDRA-8144)
 + * Avoid boxing in ColumnStats min/max trackers (CASSANDRA-8109)
 +Merged from 2.0:
+  * Fix deletion for indexes on primary key columns (CASSANDRA-8206)
   * Add 'nodetool statusgossip' (CASSANDRA-8125)
   * Improve client notification that nodes are ready for requests (CASSANDRA-7510)
   * Handle negative timestamp in writetime method (CASSANDRA-8139)

http://git-wip-us.apache.org/repos/asf/cassandra/blob/76478043/src/java/org/apache/cassandra/db/index/AbstractSimplePerColumnSecondaryIndex.java
----------------------------------------------------------------------
diff --cc src/java/org/apache/cassandra/db/index/AbstractSimplePerColumnSecondaryIndex.java
index d8c03fb,553b9d4..4c398c4
--- a/src/java/org/apache/cassandra/db/index/AbstractSimplePerColumnSecondaryIndex.java
+++ b/src/java/org/apache/cassandra/db/index/AbstractSimplePerColumnSecondaryIndex.java
@@@ -87,21 -71,28 +87,26 @@@ public abstract class AbstractSimplePer
      {
          return String.format("'%s.%s %s %s'",
                               baseCfs.name,
 -                             getExpressionComparator().getString(expr.column_name),
 -                             expr.op,
 -                             baseCfs.metadata.getColumnDefinition(expr.column_name).getValidator().getString(expr.value));
 +                             getExpressionComparator().getString(expr.column),
 +                             expr.operator,
 +                             baseCfs.metadata.getColumnDefinition(expr.column).type.getString(expr.value));
      }
  
 -    public void delete(ByteBuffer rowKey, Column column)
 +    public void delete(ByteBuffer rowKey, Cell cell, OpOrder.Group opGroup)
      {
 -        deleteForCleanup(rowKey, column);
++        deleteForCleanup(rowKey, cell, opGroup);
+     }
+ 
 -    public void deleteForCleanup(ByteBuffer rowKey, Column column)
++    public void deleteForCleanup(ByteBuffer rowKey, Cell cell, OpOrder.Group opGroup)
+     {
 -        if (column.isMarkedForDelete(System.currentTimeMillis()))
 +        if (!cell.isLive())
              return;
  
 -        DecoratedKey valueKey = getIndexKeyFor(getIndexedValue(rowKey, column));
 +        DecoratedKey valueKey = getIndexKeyFor(getIndexedValue(rowKey, cell));
          int localDeletionTime = (int) (System.currentTimeMillis() / 1000);
 -        ColumnFamily cfi = ArrayBackedSortedColumns.factory.create(indexCfs.metadata);
 -        ByteBuffer name = makeIndexColumnName(rowKey, column);
 -        assert name.remaining() > 0 && name.remaining() <= Column.MAX_NAME_LENGTH : name.remaining();
 -        cfi.addTombstone(name, localDeletionTime, column.timestamp());
 -        indexCfs.apply(valueKey, cfi, SecondaryIndexManager.nullUpdater);
 +        ColumnFamily cfi = ArrayBackedSortedColumns.factory.create(indexCfs.metadata, false, 1);
 +        cfi.addTombstone(makeIndexColumnName(rowKey, cell), localDeletionTime, cell.timestamp());
 +        indexCfs.apply(valueKey, cfi, SecondaryIndexManager.nullUpdater, opGroup, null);
          if (logger.isDebugEnabled())
              logger.debug("removed index entry for cleaned-up value {}:{}", valueKey, cfi);
      }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/76478043/src/java/org/apache/cassandra/db/index/PerColumnSecondaryIndex.java
----------------------------------------------------------------------
diff --cc src/java/org/apache/cassandra/db/index/PerColumnSecondaryIndex.java
index 79087d2,73f53f1..9740d09
--- a/src/java/org/apache/cassandra/db/index/PerColumnSecondaryIndex.java
+++ b/src/java/org/apache/cassandra/db/index/PerColumnSecondaryIndex.java
@@@ -35,9 -34,14 +35,14 @@@ public abstract class PerColumnSecondar
       * @param rowKey the underlying row key which is indexed
       * @param col all the column info
       */
 -    public abstract void delete(ByteBuffer rowKey, Column col);
 +    public abstract void delete(ByteBuffer rowKey, Cell col, OpOrder.Group opGroup);
  
      /**
+      * Called when a column has been removed due to a cleanup operation.
+      */
 -    public abstract void deleteForCleanup(ByteBuffer rowKey, Column col);
++    public abstract void deleteForCleanup(ByteBuffer rowKey, Cell col, OpOrder.Group opGroup);
+ 
+     /**
       * insert a column to the index
       *
       * @param rowKey the underlying row key which is indexed

http://git-wip-us.apache.org/repos/asf/cassandra/blob/76478043/src/java/org/apache/cassandra/db/index/SecondaryIndex.java
----------------------------------------------------------------------
diff --cc src/java/org/apache/cassandra/db/index/SecondaryIndex.java
index e2bafaa,a83f5dd..044912f
--- a/src/java/org/apache/cassandra/db/index/SecondaryIndex.java
+++ b/src/java/org/apache/cassandra/db/index/SecondaryIndex.java
@@@ -18,16 -18,11 +18,17 @@@
  package org.apache.cassandra.db.index;
  
  import java.nio.ByteBuffer;
 -import java.util.*;
 -import java.util.concurrent.*;
 +import java.util.Collection;
 +import java.util.Collections;
 +import java.util.Iterator;
 +import java.util.Set;
 +import java.util.concurrent.ConcurrentHashMap;
 +import java.util.concurrent.Future;
 +import java.util.concurrent.FutureTask;
  
+ import com.google.common.base.Objects;
  import org.apache.commons.lang3.StringUtils;
 +
  import org.slf4j.Logger;
  import org.slf4j.LoggerFactory;
  

http://git-wip-us.apache.org/repos/asf/cassandra/blob/76478043/src/java/org/apache/cassandra/db/index/SecondaryIndexManager.java
----------------------------------------------------------------------
diff --cc src/java/org/apache/cassandra/db/index/SecondaryIndexManager.java
index 976bbb8,6d9f28a..7f8e845
--- a/src/java/org/apache/cassandra/db/index/SecondaryIndexManager.java
+++ b/src/java/org/apache/cassandra/db/index/SecondaryIndexManager.java
@@@ -486,7 -465,7 +486,7 @@@ public class SecondaryIndexManage
                  }
                  else
                  {
-                     ((PerColumnSecondaryIndex) index).delete(key.getKey(), cell, opGroup);
 -                    ((PerColumnSecondaryIndex) index).deleteForCleanup(key.key, column);
++                    ((PerColumnSecondaryIndex) index).deleteForCleanup(key.getKey(), cell, opGroup);
                  }
              }
          }
@@@ -741,25 -602,24 +741,25 @@@
          {
              this.key = key;
              this.cf = cf;
 +            this.opGroup = opGroup;
          }
  
 -        public void insert(Column column)
 +        public void insert(Cell cell)
          {
 -            if (column.isMarkedForDelete(System.currentTimeMillis()))
 +            if (!cell.isLive())
                  return;
  
 -            for (SecondaryIndex index : indexFor(column.name()))
 +            for (SecondaryIndex index : indexFor(cell.name()))
                  if (index instanceof PerColumnSecondaryIndex)
 -                    ((PerColumnSecondaryIndex) index).insert(key.key, column);
 +                    ((PerColumnSecondaryIndex) index).insert(key.getKey(), cell, opGroup);
          }
  
 -        public void update(Column oldColumn, Column column)
 +        public void update(Cell oldCell, Cell cell)
          {
 -            if (oldColumn.equals(column))
 +            if (oldCell.equals(cell))
                  return;
-             
+ 
 -            for (SecondaryIndex index : indexFor(column.name()))
 +            for (SecondaryIndex index : indexFor(cell.name()))
              {
                  if (index instanceof PerColumnSecondaryIndex)
                  {

http://git-wip-us.apache.org/repos/asf/cassandra/blob/76478043/src/java/org/apache/cassandra/db/index/composites/CompositesIndexOnClusteringKey.java
----------------------------------------------------------------------
diff --cc src/java/org/apache/cassandra/db/index/composites/CompositesIndexOnClusteringKey.java
index d967971,564d6bb..0243b0d
--- a/src/java/org/apache/cassandra/db/index/composites/CompositesIndexOnClusteringKey.java
+++ b/src/java/org/apache/cassandra/db/index/composites/CompositesIndexOnClusteringKey.java
@@@ -23,13 -23,13 +23,14 @@@ import java.util.List
  
  import org.apache.cassandra.config.CFMetaData;
  import org.apache.cassandra.config.ColumnDefinition;
 -import org.apache.cassandra.cql3.ColumnNameBuilder;
  import org.apache.cassandra.db.*;
 +import org.apache.cassandra.db.composites.*;
  import org.apache.cassandra.db.index.SecondaryIndex;
  import org.apache.cassandra.db.marshal.*;
++import org.apache.cassandra.utils.concurrent.OpOrder;
  
  /**
 - * Index on a CLUSTERING_KEY column definition.
 + * Index on a CLUSTERING_COLUMN column definition.
   *
   * A cell indexed by this index will have the general form:
   *   ck_0 ... ck_n c_name : v
@@@ -105,4 -112,12 +106,12 @@@ public class CompositesIndexOnClusterin
      {
          return data.hasOnlyTombstones(now);
      }
+ 
+     @Override
 -    public void delete(ByteBuffer rowKey, Column column)
++    public void delete(ByteBuffer rowKey, Cell cell, OpOrder.Group opGroup)
+     {
+         // We only know that one column of the CQL row has been updated/deleted, but we don't know if the
+         // full row has been deleted so we should not do anything. If it ends up that the whole row has
+         // been deleted, it will be eventually cleaned up on read because the entry will be detected stale.
+     }
  }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/76478043/src/java/org/apache/cassandra/db/index/composites/CompositesIndexOnPartitionKey.java
----------------------------------------------------------------------
diff --cc src/java/org/apache/cassandra/db/index/composites/CompositesIndexOnPartitionKey.java
index b791545,e8956dc..df43057
--- a/src/java/org/apache/cassandra/db/index/composites/CompositesIndexOnPartitionKey.java
+++ b/src/java/org/apache/cassandra/db/index/composites/CompositesIndexOnPartitionKey.java
@@@ -23,10 -23,10 +23,11 @@@ import java.util.List
  
  import org.apache.cassandra.config.CFMetaData;
  import org.apache.cassandra.config.ColumnDefinition;
 -import org.apache.cassandra.cql3.ColumnNameBuilder;
  import org.apache.cassandra.db.*;
 +import org.apache.cassandra.db.composites.*;
  import org.apache.cassandra.db.index.SecondaryIndex;
  import org.apache.cassandra.db.marshal.*;
++import org.apache.cassandra.utils.concurrent.OpOrder;
  
  /**
   * Index on a PARTITION_KEY column definition.
@@@ -96,4 -99,12 +97,12 @@@ public class CompositesIndexOnPartition
      {
          return data.hasOnlyTombstones(now);
      }
+ 
+     @Override
 -    public void delete(ByteBuffer rowKey, Column column)
++    public void delete(ByteBuffer rowKey, Cell cell, OpOrder.Group opGroup)
+     {
+         // We only know that one column of the CQL row has been updated/deleted, but we don't know if the
+         // full row has been deleted so we should not do anything. If it ends up that the whole row has
+         // been deleted, it will be eventually cleaned up on read because the entry will be detected stale.
+     }
  }


[4/5] git commit: Merge branch 'cassandra-2.0' into cassandra-2.1

Posted by ty...@apache.org.
Merge branch 'cassandra-2.0' into cassandra-2.1

Conflicts:
	test/unit/org/apache/cassandra/db/RangeTombstoneTest.java
	test/unit/org/apache/cassandra/db/SecondaryIndexCellSizeTest.java


Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo
Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/2d4a305c
Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/2d4a305c
Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/2d4a305c

Branch: refs/heads/trunk
Commit: 2d4a305c5e07504089a35dcc9f676fe26c0973a7
Parents: 7647804 b3c1e14
Author: Tyler Hobbs <ty...@datastax.com>
Authored: Tue Nov 4 12:00:14 2014 -0600
Committer: Tyler Hobbs <ty...@datastax.com>
Committed: Tue Nov 4 12:00:14 2014 -0600

----------------------------------------------------------------------
 test/unit/org/apache/cassandra/db/RangeTombstoneTest.java         | 3 +++
 test/unit/org/apache/cassandra/db/SecondaryIndexCellSizeTest.java | 3 +++
 2 files changed, 6 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/2d4a305c/test/unit/org/apache/cassandra/db/RangeTombstoneTest.java
----------------------------------------------------------------------
diff --cc test/unit/org/apache/cassandra/db/RangeTombstoneTest.java
index e266bf6,0df47f6..3292422
--- a/test/unit/org/apache/cassandra/db/RangeTombstoneTest.java
+++ b/test/unit/org/apache/cassandra/db/RangeTombstoneTest.java
@@@ -679,7 -591,10 +679,10 @@@ public class RangeTombstoneTest extend
              deletes.add(col);
          }
  
+         @Override
 -        public void deleteForCleanup(ByteBuffer rowKey, Column col) { }
++        public void deleteForCleanup(ByteBuffer rowKey, Cell col, OpOrder.Group opGroup) {}
+ 
 -        public void insert(ByteBuffer rowKey, Column col)
 +        public void insert(ByteBuffer rowKey, Cell col, OpOrder.Group opGroup)
          {
              inserts.add(col);
          }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/2d4a305c/test/unit/org/apache/cassandra/db/SecondaryIndexCellSizeTest.java
----------------------------------------------------------------------
diff --cc test/unit/org/apache/cassandra/db/SecondaryIndexCellSizeTest.java
index 45f9e05,0000000..08dcf24
mode 100644,000000..100644
--- a/test/unit/org/apache/cassandra/db/SecondaryIndexCellSizeTest.java
+++ b/test/unit/org/apache/cassandra/db/SecondaryIndexCellSizeTest.java
@@@ -1,221 -1,0 +1,224 @@@
 +/*
 +* 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.db;
 +
 +import java.nio.ByteBuffer;
 +import java.util.Set;
 +
 +import org.junit.Test;
 +
 +import org.apache.cassandra.db.composites.CellName;
 +import org.apache.cassandra.db.composites.CellNames;
 +import org.apache.cassandra.db.index.PerColumnSecondaryIndex;
 +import org.apache.cassandra.db.index.PerRowSecondaryIndex;
 +import org.apache.cassandra.db.index.SecondaryIndexSearcher;
 +import org.apache.cassandra.exceptions.ConfigurationException;
 +import org.apache.cassandra.utils.ByteBufferUtil;
 +import org.apache.cassandra.utils.concurrent.OpOrder;
 +import org.apache.cassandra.utils.memory.MemtableAllocator;
 +
 +import static org.junit.Assert.assertFalse;
 +import static org.junit.Assert.assertTrue;
 +
 +public class SecondaryIndexCellSizeTest
 +{
 +    @Test
 +    public void test64kColumn()
 +    {
 +        // a byte buffer more than 64k
 +        ByteBuffer buffer = ByteBuffer.allocate(1024 * 65);
 +        buffer.clear();
 +
 +        //read more than 64k
 +        for (int i=0; i<1024*64/4 + 1; i++)
 +            buffer.putInt(0);
 +
 +        // for read
 +        buffer.flip();
 +        Cell cell = new BufferCell(CellNames.simpleDense(ByteBufferUtil.bytes("test")), buffer, 0);
 +
 +        SecondaryIndexCellSizeTest.MockRowIndex mockRowIndex = new SecondaryIndexCellSizeTest.MockRowIndex();
 +        SecondaryIndexCellSizeTest.MockColumnIndex mockColumnIndex = new SecondaryIndexCellSizeTest.MockColumnIndex();
 +
 +        assertTrue(mockRowIndex.validate(cell));
 +        assertFalse(mockColumnIndex.validate(cell));
 +
 +        // test less than 64k value
 +        buffer.flip();
 +        buffer.clear();
 +        buffer.putInt(20);
 +        buffer.flip();
 +
 +        assertTrue(mockRowIndex.validate(cell));
 +        assertTrue(mockColumnIndex.validate(cell));
 +    }
 +
 +    private class MockRowIndex extends PerRowSecondaryIndex
 +    {
 +        public void init()
 +        {
 +        }
 +
 +        public void validateOptions() throws ConfigurationException
 +        {
 +        }
 +
 +        public String getIndexName()
 +        {
 +            return null;
 +        }
 +
 +        protected SecondaryIndexSearcher createSecondaryIndexSearcher(Set<ByteBuffer> columns)
 +        {
 +            return null;
 +        }
 +
 +        public void forceBlockingFlush()
 +        {
 +        }
 +
 +        public ColumnFamilyStore getIndexCfs()
 +        {
 +            return null;
 +        }
 +
 +        public void removeIndex(ByteBuffer columnName)
 +        {
 +        }
 +
 +        public void invalidate()
 +        {
 +        }
 +
 +        public void truncateBlocking(long truncatedAt)
 +        {
 +        }
 +
 +        public void index(ByteBuffer rowKey, ColumnFamily cf)
 +        {
 +        }
 +
 +        public void delete(DecoratedKey key, OpOrder.Group opGroup)
 +        {
 +        }
 +
 +        public void index(ByteBuffer rowKey)
 +        {
 +        }
 +
 +        public void reload()
 +        {
 +        }
 +
 +        public boolean indexes(CellName name)
 +        {
 +            return true;
 +        }
 +
 +        @Override
 +        public long estimateResultRows() {
 +            return 0;
 +        }
 +    }
 +
 +
 +    private class MockColumnIndex extends PerColumnSecondaryIndex
 +    {
 +        @Override
 +        public void init()
 +        {
 +        }
 +
 +        @Override
 +        public void validateOptions() throws ConfigurationException
 +        {
 +        }
 +
 +        @Override
 +        public String getIndexName()
 +        {
 +            return null;
 +        }
 +
 +        @Override
 +        protected SecondaryIndexSearcher createSecondaryIndexSearcher(Set<ByteBuffer> columns)
 +        {
 +            return null;
 +        }
 +
 +        @Override
 +        public void forceBlockingFlush()
 +        {
 +        }
 +
 +        @Override
 +        public ColumnFamilyStore getIndexCfs()
 +        {
 +            return null;
 +        }
 +
 +        @Override
 +        public void removeIndex(ByteBuffer columnName)
 +        {
 +        }
 +
 +        @Override
 +        public void invalidate()
 +        {
 +        }
 +
 +        @Override
 +        public void truncateBlocking(long truncatedAt)
 +        {
 +        }
 +
 +        @Override
 +        public void delete(ByteBuffer rowKey, Cell col, OpOrder.Group opGroup)
 +        {
 +        }
 +
 +        @Override
++        public void deleteForCleanup(ByteBuffer rowKey, Cell col, OpOrder.Group opGroup) {}
++
++        @Override
 +        public void insert(ByteBuffer rowKey, Cell col, OpOrder.Group opGroup)
 +        {
 +        }
 +
 +        @Override
 +        public void update(ByteBuffer rowKey, Cell oldCol, Cell col, OpOrder.Group opGroup)
 +        {
 +        }
 +
 +        @Override
 +        public void reload()
 +        {
 +        }
 +
 +        public boolean indexes(CellName name)
 +        {
 +            return true;
 +        }
 +
 +        @Override
 +        public long estimateResultRows() {
 +            return 0;
 +        }
 +    }
 +}