You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by al...@apache.org on 2015/11/10 14:47:15 UTC

[1/6] cassandra git commit: Simplify row cache invalidation code

Repository: cassandra
Updated Branches:
  refs/heads/cassandra-3.1 fa741a52c -> e8ee9ed4b


Simplify row cache invalidation code

patch by Jonathan Ellis; reviewed by Aleksey Yeschenko for
CASSANDRA-10396


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

Branch: refs/heads/cassandra-3.1
Commit: d867ac1f41c59b31f8fb4f54a06c0118018cfc81
Parents: b0def95
Author: Jonathan Ellis <jb...@apache.org>
Authored: Thu Sep 24 13:24:57 2015 -0700
Committer: Aleksey Yeschenko <al...@apache.org>
Committed: Mon Nov 9 20:05:32 2015 +0000

----------------------------------------------------------------------
 .../org/apache/cassandra/db/ColumnFamilyStore.java   | 15 +++------------
 .../db/compaction/CompactionController.java          |  4 +---
 .../cassandra/db/compaction/CompactionManager.java   |  2 +-
 .../apache/cassandra/io/sstable/SSTableRewriter.java |  3 +--
 .../org/apache/cassandra/streaming/StreamReader.java |  2 +-
 test/unit/org/apache/cassandra/db/RowCacheTest.java  |  2 +-
 .../db/compaction/CompactionsPurgeTest.java          |  2 +-
 7 files changed, 9 insertions(+), 21 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/d867ac1f/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/ColumnFamilyStore.java b/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
index d553f4d..b112e0e 100644
--- a/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
+++ b/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
@@ -1226,7 +1226,7 @@ public class ColumnFamilyStore implements ColumnFamilyStoreMBean
         return String.format("%.2f/%.2f", onHeap, offHeap);
     }
 
-    public void maybeUpdateRowCache(DecoratedKey key)
+    public void maybeInvalidateCachedRow(DecoratedKey key)
     {
         if (!isRowCacheEnabled())
             return;
@@ -1247,7 +1247,7 @@ public class ColumnFamilyStore implements ColumnFamilyStoreMBean
         long start = System.nanoTime();
         Memtable mt = data.getMemtableFor(opGroup, replayPosition);
         final long timeDelta = mt.put(key, columnFamily, indexer, opGroup);
-        maybeUpdateRowCache(key);
+        maybeInvalidateCachedRow(key);
         metric.samplers.get(Sampler.WRITES).addSample(key.getKey(), key.hashCode(), 1);
         metric.writeLatency.addNano(System.nanoTime() - start);
         if(timeDelta < Long.MAX_VALUE)
@@ -2047,7 +2047,7 @@ public class ColumnFamilyStore implements ColumnFamilyStoreMBean
             RowCacheKey key = keyIter.next();
             DecoratedKey dk = partitioner.decorateKey(ByteBuffer.wrap(key.key));
             if (key.ksAndCFName.equals(metadata.ksAndCFName) && !Range.isInRanges(dk.getToken(), ranges))
-                invalidateCachedRow(dk);
+                maybeInvalidateCachedRow(dk);
         }
 
         if (metadata.isCounter())
@@ -2532,15 +2532,6 @@ public class ColumnFamilyStore implements ColumnFamilyStoreMBean
         CacheService.instance.rowCache.remove(key);
     }
 
-    public void invalidateCachedRow(DecoratedKey key)
-    {
-        UUID cfId = Schema.instance.getId(keyspace.getName(), this.name);
-        if (cfId == null)
-            return; // secondary index
-
-        invalidateCachedRow(new RowCacheKey(metadata.ksAndCFName, key));
-    }
-
     public ClockAndCount getCachedCounter(ByteBuffer partitionKey, CellName cellName)
     {
         if (CacheService.instance.counterCache.getCapacity() == 0L) // counter cache disabled.

http://git-wip-us.apache.org/repos/asf/cassandra/blob/d867ac1f/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 5f0a198..24ef843 100644
--- a/src/java/org/apache/cassandra/db/compaction/CompactionController.java
+++ b/src/java/org/apache/cassandra/db/compaction/CompactionController.java
@@ -24,8 +24,6 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import org.apache.cassandra.db.ColumnFamilyStore;
-import org.apache.cassandra.db.lifecycle.SSTableIntervalTree;
-import org.apache.cassandra.db.lifecycle.Tracker;
 import org.apache.cassandra.db.DecoratedKey;
 import org.apache.cassandra.db.RowPosition;
 import org.apache.cassandra.utils.AlwaysPresentFilter;
@@ -191,7 +189,7 @@ public class CompactionController implements AutoCloseable
 
     public void invalidateCachedRow(DecoratedKey key)
     {
-        cfs.invalidateCachedRow(key);
+        cfs.maybeInvalidateCachedRow(key);
     }
 
     public void close()

http://git-wip-us.apache.org/repos/asf/cassandra/blob/d867ac1f/src/java/org/apache/cassandra/db/compaction/CompactionManager.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/compaction/CompactionManager.java b/src/java/org/apache/cassandra/db/compaction/CompactionManager.java
index 0c6e24f..8537aca 100644
--- a/src/java/org/apache/cassandra/db/compaction/CompactionManager.java
+++ b/src/java/org/apache/cassandra/db/compaction/CompactionManager.java
@@ -934,7 +934,7 @@ public class CompactionManager implements CompactionManagerMBean
                 if (Range.isInRanges(row.getKey().getToken(), ranges))
                     return row;
 
-                cfs.invalidateCachedRow(row.getKey());
+                cfs.maybeInvalidateCachedRow(row.getKey());
 
                 if (indexedColumnsInRow != null)
                     indexedColumnsInRow.clear();

http://git-wip-us.apache.org/repos/asf/cassandra/blob/d867ac1f/src/java/org/apache/cassandra/io/sstable/SSTableRewriter.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/io/sstable/SSTableRewriter.java b/src/java/org/apache/cassandra/io/sstable/SSTableRewriter.java
index dc4fe75..b08b038 100644
--- a/src/java/org/apache/cassandra/io/sstable/SSTableRewriter.java
+++ b/src/java/org/apache/cassandra/io/sstable/SSTableRewriter.java
@@ -20,7 +20,6 @@ package org.apache.cassandra.io.sstable;
 import java.util.*;
 
 import com.google.common.annotations.VisibleForTesting;
-import com.google.common.util.concurrent.Runnables;
 
 import org.apache.cassandra.cache.InstrumentingCache;
 import org.apache.cassandra.cache.KeyCacheKey;
@@ -119,7 +118,7 @@ public class SSTableRewriter extends Transactional.AbstractTransactional impleme
         {
             if (index == null)
             {
-                cfs.invalidateCachedRow(row.key);
+                cfs.maybeInvalidateCachedRow(row.key);
             }
             else
             {

http://git-wip-us.apache.org/repos/asf/cassandra/blob/d867ac1f/src/java/org/apache/cassandra/streaming/StreamReader.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/streaming/StreamReader.java b/src/java/org/apache/cassandra/streaming/StreamReader.java
index 1ccebb0..88591da 100644
--- a/src/java/org/apache/cassandra/streaming/StreamReader.java
+++ b/src/java/org/apache/cassandra/streaming/StreamReader.java
@@ -171,6 +171,6 @@ public class StreamReader
     {
         DecoratedKey key = StorageService.getPartitioner().decorateKey(ByteBufferUtil.readWithShortLength(in));
         writer.appendFromStream(key, cfs.metadata, in, inputVersion);
-        cfs.invalidateCachedRow(key);
+        cfs.maybeInvalidateCachedRow(key);
     }
 }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/d867ac1f/test/unit/org/apache/cassandra/db/RowCacheTest.java
----------------------------------------------------------------------
diff --git a/test/unit/org/apache/cassandra/db/RowCacheTest.java b/test/unit/org/apache/cassandra/db/RowCacheTest.java
index 5912d7c..69c831d 100644
--- a/test/unit/org/apache/cassandra/db/RowCacheTest.java
+++ b/test/unit/org/apache/cassandra/db/RowCacheTest.java
@@ -133,7 +133,7 @@ public class RowCacheTest
         int keysLeft = 109;
         for (int i = 109; i >= 10; i--)
         {
-            cachedStore.invalidateCachedRow(Util.dk("key" + i));
+            cachedStore.maybeInvalidateCachedRow(Util.dk("key" + i));
             assert CacheService.instance.rowCache.size() == keysLeft;
             keysLeft--;
         }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/d867ac1f/test/unit/org/apache/cassandra/db/compaction/CompactionsPurgeTest.java
----------------------------------------------------------------------
diff --git a/test/unit/org/apache/cassandra/db/compaction/CompactionsPurgeTest.java b/test/unit/org/apache/cassandra/db/compaction/CompactionsPurgeTest.java
index e5baab6..bfe8042 100644
--- a/test/unit/org/apache/cassandra/db/compaction/CompactionsPurgeTest.java
+++ b/test/unit/org/apache/cassandra/db/compaction/CompactionsPurgeTest.java
@@ -127,7 +127,7 @@ public class CompactionsPurgeTest
 
         // major compact and test that all columns but the resurrected one is completely gone
         FBUtilities.waitOnFutures(CompactionManager.instance.submitMaximal(cfs, Integer.MAX_VALUE, false));
-        cfs.invalidateCachedRow(key);
+        cfs.maybeInvalidateCachedRow(key);
         ColumnFamily cf = cfs.getColumnFamily(QueryFilter.getIdentityFilter(key, cfName, System.currentTimeMillis()));
         assertColumns(cf, "5");
         assertNotNull(cf.getColumn(cellname(String.valueOf(5))));


[3/6] cassandra git commit: Reject counter writes in CQLSSTableWriter

Posted by al...@apache.org.
Reject counter writes in CQLSSTableWriter

patch by Paulo Motta; reviewed by Aleksey Yeschenko for CASSANDRA-10258


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

Branch: refs/heads/cassandra-3.1
Commit: 3674ad9dab8f29173d7d4ee82488a8e9ea586240
Parents: 852a8ba
Author: Paulo Motta <pa...@gmail.com>
Authored: Thu Oct 22 11:38:31 2015 -0700
Committer: Aleksey Yeschenko <al...@apache.org>
Committed: Tue Nov 10 13:41:01 2015 +0000

----------------------------------------------------------------------
 CHANGES.txt                                     |  1 +
 .../cassandra/io/sstable/CQLSSTableWriter.java  |  2 ++
 .../io/sstable/CQLSSTableWriterTest.java        | 22 ++++++++++++++++++++
 3 files changed, 25 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/3674ad9d/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index 123c1f3..fa2017a 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,4 +1,5 @@
 2.1.12
+ * Reject counter writes in CQLSSTableWriter (CASSANDRA-10258)
  * Remove superfluous COUNTER_MUTATION stage mapping (CASSANDRA-10605)
  * Improve json2sstable error reporting on nonexistent columns (CASSANDRA-10401)
  * (cqlsh) fix COPY using wrong variable name for time_format (CASSANDRA-10633)

http://git-wip-us.apache.org/repos/asf/cassandra/blob/3674ad9d/src/java/org/apache/cassandra/io/sstable/CQLSSTableWriter.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/io/sstable/CQLSSTableWriter.java b/src/java/org/apache/cassandra/io/sstable/CQLSSTableWriter.java
index c364171..ae8a392 100644
--- a/src/java/org/apache/cassandra/io/sstable/CQLSSTableWriter.java
+++ b/src/java/org/apache/cassandra/io/sstable/CQLSSTableWriter.java
@@ -453,6 +453,8 @@ public class CQLSSTableWriter implements Closeable
             this.boundNames = p.right;
             if (this.insert.hasConditions())
                 throw new IllegalArgumentException("Conditional statements are not supported");
+            if (this.insert.isCounter())
+                throw new IllegalArgumentException("Counter update statements are not supported");
             if (this.boundNames.isEmpty())
                 throw new IllegalArgumentException("Provided insert statement has no bind variables");
             return this;

http://git-wip-us.apache.org/repos/asf/cassandra/blob/3674ad9d/test/unit/org/apache/cassandra/io/sstable/CQLSSTableWriterTest.java
----------------------------------------------------------------------
diff --git a/test/unit/org/apache/cassandra/io/sstable/CQLSSTableWriterTest.java b/test/unit/org/apache/cassandra/io/sstable/CQLSSTableWriterTest.java
index fa5cbb4..9c8a2c2 100644
--- a/test/unit/org/apache/cassandra/io/sstable/CQLSSTableWriterTest.java
+++ b/test/unit/org/apache/cassandra/io/sstable/CQLSSTableWriterTest.java
@@ -135,6 +135,28 @@ public class CQLSSTableWriterTest
         assertEquals(12, row.getInt("v2"));
     }
 
+    @Test(expected = IllegalArgumentException.class)
+    public void testForbidCounterUpdates() throws Exception
+    {
+        String KS = "cql_keyspace";
+        String TABLE = "counter1";
+
+        File tempdir = Files.createTempDir();
+        File dataDir = new File(tempdir.getAbsolutePath() + File.separator + KS + File.separator + TABLE);
+        assert dataDir.mkdirs();
+
+        String schema = "CREATE TABLE cql_keyspace.counter1 (" +
+                        "  my_id int, " +
+                        "  my_counter counter, " +
+                        "  PRIMARY KEY (my_id)" +
+                        ")";
+        String insert = String.format("UPDATE cql_keyspace.counter1 SET my_counter = my_counter - ? WHERE my_id = ?");
+        CQLSSTableWriter.builder().inDirectory(dataDir)
+                        .forTable(schema)
+                        .withPartitioner(StorageService.instance.getPartitioner())
+                        .using(insert).build();
+    }
+
     @Test
     public void testSyncWithinPartition() throws Exception
     {


[5/6] cassandra git commit: Merge branch 'cassandra-2.2' into cassandra-3.0

Posted by al...@apache.org.
Merge branch 'cassandra-2.2' into cassandra-3.0


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

Branch: refs/heads/cassandra-3.1
Commit: 1e64a9d0369e07a195c6267d14438337773d9248
Parents: b408f9e ef0e447
Author: Aleksey Yeschenko <al...@apache.org>
Authored: Tue Nov 10 13:45:11 2015 +0000
Committer: Aleksey Yeschenko <al...@apache.org>
Committed: Tue Nov 10 13:46:21 2015 +0000

----------------------------------------------------------------------
 CHANGES.txt                                     |  2 +-
 .../cassandra/io/sstable/CQLSSTableWriter.java  |  2 ++
 .../io/sstable/CQLSSTableWriterTest.java        | 22 ++++++++++++++++++++
 3 files changed, 25 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/1e64a9d0/CHANGES.txt
----------------------------------------------------------------------
diff --cc CHANGES.txt
index a1f66fa,5edad20..33adefb
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@@ -1,51 -1,16 +1,51 @@@
 -2.2.4
 +3.0.1
 +Merged from 2.1:
++ * Reject counter writes in CQLSSTableWriter (CASSANDRA-10258)
 + * Remove superfluous COUNTER_MUTATION stage mapping (CASSANDRA-10605)
 +
 +
 +3.0
 + * Fix AssertionError while flushing memtable due to materialized views
 +   incorrectly inserting empty rows (CASSANDRA-10614)
 + * Store UDA initcond as CQL literal in the schema table, instead of a blob (CASSANDRA-10650)
 + * Don't use -1 for the position of partition key in schema (CASSANDRA-10491)
 + * Fix distinct queries in mixed version cluster (CASSANDRA-10573)
 + * Skip sstable on clustering in names query (CASSANDRA-10571)
 + * Remove value skipping as it breaks read-repair (CASSANDRA-10655)
 + * Fix bootstrapping with MVs (CASSANDRA-10621)
 + * Make sure EACH_QUORUM reads are using NTS (CASSANDRA-10584)
 + * Fix MV replica filtering for non-NetworkTopologyStrategy (CASSANDRA-10634)
 + * (Hadoop) fix CIF describeSplits() not handling 0 size estimates (CASSANDRA-10600)
 + * Fix reading of legacy sstables (CASSANDRA-10590)
 + * Use CQL type names in schema metadata tables (CASSANDRA-10365)
 + * Guard batchlog replay against integer division by zero (CASSANDRA-9223)
 + * Fix bug when adding a column to thrift with the same name than a primary key (CASSANDRA-10608)
 + * Add client address argument to IAuthenticator::newSaslNegotiator (CASSANDRA-8068)
 + * Fix implementation of LegacyLayout.LegacyBoundComparator (CASSANDRA-10602)
 + * Don't use 'names query' read path for counters (CASSANDRA-10572)
 + * Fix backward compatibility for counters (CASSANDRA-10470)
 + * Remove memory_allocator paramter from cassandra.yaml (CASSANDRA-10581,10628)
 + * Execute the metadata reload task of all registered indexes on CFS::reload (CASSANDRA-10604)
 + * Fix thrift cas operations with defined columns (CASSANDRA-10576)
 + * Fix PartitionUpdate.operationCount()for updates with static column operations (CASSANDRA-10606)
 + * Fix thrift get() queries with defined columns (CASSANDRA-10586)
 + * Fix marking of indexes as built and removed (CASSANDRA-10601)
 + * Skip initialization of non-registered 2i instances, remove Index::getIndexName (CASSANDRA-10595)
 + * Fix batches on multiple tables (CASSANDRA-10554)
 + * Ensure compaction options are validated when updating KeyspaceMetadata (CASSANDRA-10569)
 + * Flatten Iterator Transformation Hierarchy (CASSANDRA-9975)
 + * Remove token generator (CASSANDRA-5261)
 + * RolesCache should not be created for any authenticator that does not requireAuthentication (CASSANDRA-10562)
 + * Fix LogTransaction checking only a single directory for files (CASSANDRA-10421)
 + * Fix handling of range tombstones when reading old format sstables (CASSANDRA-10360)
 + * Aggregate with Initial Condition fails with C* 3.0 (CASSANDRA-10367)
 +Merged from 2.2:
   * (cqlsh) show partial trace if incomplete after max_trace_wait (CASSANDRA-7645)
   * Use most up-to-date version of schema for system tables (CASSANDRA-10652)
   * Deprecate memory_allocator in cassandra.yaml (CASSANDRA-10581,10628)
   * Expose phi values from failure detector via JMX and tweak debug
     and trace logging (CASSANDRA-9526)
 - * Fix RangeNamesQueryPager (CASSANDRA-10509)
 - * Deprecate Pig support (CASSANDRA-10542)
 - * Reduce contention getting instances of CompositeType (CASSANDRA-10433)
  Merged from 2.1:
 - * Reject counter writes in CQLSSTableWriter (CASSANDRA-10258)
-- * Remove superfluous COUNTER_MUTATION stage mapping (CASSANDRA-10605)
 - * Improve json2sstable error reporting on nonexistent columns (CASSANDRA-10401)
   * (cqlsh) fix COPY using wrong variable name for time_format (CASSANDRA-10633)
   * Do not run SizeEstimatesRecorder if a node is not a member of the ring (CASSANDRA-9912)
   * Improve handling of dead nodes in gossip (CASSANDRA-10298)

http://git-wip-us.apache.org/repos/asf/cassandra/blob/1e64a9d0/src/java/org/apache/cassandra/io/sstable/CQLSSTableWriter.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cassandra/blob/1e64a9d0/test/unit/org/apache/cassandra/io/sstable/CQLSSTableWriterTest.java
----------------------------------------------------------------------
diff --cc test/unit/org/apache/cassandra/io/sstable/CQLSSTableWriterTest.java
index e7cf51c,8a14428..602a108
--- a/test/unit/org/apache/cassandra/io/sstable/CQLSSTableWriterTest.java
+++ b/test/unit/org/apache/cassandra/io/sstable/CQLSSTableWriterTest.java
@@@ -65,81 -66,100 +65,103 @@@ public class CQLSSTableWriterTes
      @Test
      public void testUnsortedWriter() throws Exception
      {
 -        String KS = "cql_keyspace";
 -        String TABLE = "table1";
 -
 -        File tempdir = Files.createTempDir();
 -        File dataDir = new File(tempdir.getAbsolutePath() + File.separator + KS + File.separator + TABLE);
 -        assert dataDir.mkdirs();
 -
 -        String schema = "CREATE TABLE cql_keyspace.table1 ("
 -                      + "  k int PRIMARY KEY,"
 -                      + "  v1 text,"
 -                      + "  v2 int"
 -                      + ")";
 -        String insert = "INSERT INTO cql_keyspace.table1 (k, v1, v2) VALUES (?, ?, ?)";
 -        CQLSSTableWriter writer = CQLSSTableWriter.builder()
 -                                                  .inDirectory(dataDir)
 -                                                  .forTable(schema)
 -                                                  .withPartitioner(StorageService.getPartitioner())
 -                                                  .using(insert).build();
 +        try (AutoCloseable switcher = Util.switchPartitioner(ByteOrderedPartitioner.instance))
 +        {
 +            String KS = "cql_keyspace";
 +            String TABLE = "table1";
 +
 +            File tempdir = Files.createTempDir();
 +            File dataDir = new File(tempdir.getAbsolutePath() + File.separator + KS + File.separator + TABLE);
 +            assert dataDir.mkdirs();
 +
 +            String schema = "CREATE TABLE cql_keyspace.table1 ("
 +                          + "  k int PRIMARY KEY,"
 +                          + "  v1 text,"
 +                          + "  v2 int"
 +                          + ")";
 +            String insert = "INSERT INTO cql_keyspace.table1 (k, v1, v2) VALUES (?, ?, ?)";
 +            CQLSSTableWriter writer = CQLSSTableWriter.builder()
 +                                                      .inDirectory(dataDir)
 +                                                      .forTable(schema)
 +                                                      .using(insert).build();
  
 -        writer.addRow(0, "test1", 24);
 -        writer.addRow(1, "test2", null);
 -        writer.addRow(2, "test3", 42);
 -        writer.addRow(ImmutableMap.<String, Object>of("k", 3, "v2", 12));
 -        writer.close();
 +            writer.addRow(0, "test1", 24);
 +            writer.addRow(1, "test2", 44);
 +            writer.addRow(2, "test3", 42);
 +            writer.addRow(ImmutableMap.<String, Object>of("k", 3, "v2", 12));
  
 -        SSTableLoader loader = new SSTableLoader(dataDir, new SSTableLoader.Client()
 -        {
 -            private String keyspace;
 +            writer.close();
  
 -            public void init(String keyspace)
 +            SSTableLoader loader = new SSTableLoader(dataDir, new SSTableLoader.Client()
              {
 -                this.keyspace = keyspace;
 -                for (Range<Token> range : StorageService.instance.getLocalRanges("cql_keyspace"))
 -                    addRangeForEndpoint(range, FBUtilities.getBroadcastAddress());
 -                setPartitioner(StorageService.getPartitioner());
 -            }
 +                private String keyspace;
  
 -            public CFMetaData getTableMetadata(String tableName)
 -            {
 -                return Schema.instance.getCFMetaData(keyspace, tableName);
 -            }
 -        }, new OutputHandler.SystemOutput(false, false));
 +                public void init(String keyspace)
 +                {
 +                    this.keyspace = keyspace;
 +                    for (Range<Token> range : StorageService.instance.getLocalRanges("cql_keyspace"))
 +                        addRangeForEndpoint(range, FBUtilities.getBroadcastAddress());
 +                }
  
 -        loader.stream().get();
 +                public CFMetaData getTableMetadata(String cfName)
 +                {
 +                    return Schema.instance.getCFMetaData(keyspace, cfName);
 +                }
 +            }, new OutputHandler.SystemOutput(false, false));
 +
 +            loader.stream().get();
  
 -        UntypedResultSet rs = QueryProcessor.executeInternal("SELECT * FROM cql_keyspace.table1;");
 -        assertEquals(4, rs.size());
 +            UntypedResultSet rs = QueryProcessor.executeInternal("SELECT * FROM cql_keyspace.table1;");
 +            assertEquals(4, rs.size());
  
 -        Iterator<UntypedResultSet.Row> iter = rs.iterator();
 -        UntypedResultSet.Row row;
 +            Iterator<UntypedResultSet.Row> iter = rs.iterator();
 +            UntypedResultSet.Row row;
  
 -        row = iter.next();
 -        assertEquals(0, row.getInt("k"));
 -        assertEquals("test1", row.getString("v1"));
 -        assertEquals(24, row.getInt("v2"));
 +            row = iter.next();
 +            assertEquals(0, row.getInt("k"));
 +            assertEquals("test1", row.getString("v1"));
 +            assertEquals(24, row.getInt("v2"));
  
 -        row = iter.next();
 -        assertEquals(1, row.getInt("k"));
 -        assertEquals("test2", row.getString("v1"));
 -        assertFalse(row.has("v2"));
 +            row = iter.next();
 +            assertEquals(1, row.getInt("k"));
 +            assertEquals("test2", row.getString("v1"));
 +            //assertFalse(row.has("v2"));
 +            assertEquals(44, row.getInt("v2"));
  
 -        row = iter.next();
 -        assertEquals(2, row.getInt("k"));
 -        assertEquals("test3", row.getString("v1"));
 -        assertEquals(42, row.getInt("v2"));
 +            row = iter.next();
 +            assertEquals(2, row.getInt("k"));
 +            assertEquals("test3", row.getString("v1"));
 +            assertEquals(42, row.getInt("v2"));
  
 -        row = iter.next();
 -        assertEquals(3, row.getInt("k"));
 -        assertEquals(null, row.getBytes("v1")); // Using getBytes because we know it won't NPE
 -        assertEquals(12, row.getInt("v2"));
 +            row = iter.next();
 +            assertEquals(3, row.getInt("k"));
 +            assertEquals(null, row.getBytes("v1")); // Using getBytes because we know it won't NPE
 +            assertEquals(12, row.getInt("v2"));
 +        }
      }
  
+     @Test(expected = IllegalArgumentException.class)
+     public void testForbidCounterUpdates() throws Exception
+     {
+         String KS = "cql_keyspace";
+         String TABLE = "counter1";
+ 
+         File tempdir = Files.createTempDir();
+         File dataDir = new File(tempdir.getAbsolutePath() + File.separator + KS + File.separator + TABLE);
+         assert dataDir.mkdirs();
+ 
+         String schema = "CREATE TABLE cql_keyspace.counter1 (" +
+                         "  my_id int, " +
+                         "  my_counter counter, " +
+                         "  PRIMARY KEY (my_id)" +
+                         ")";
+         String insert = String.format("UPDATE cql_keyspace.counter1 SET my_counter = my_counter - ? WHERE my_id = ?");
+         CQLSSTableWriter.builder().inDirectory(dataDir)
+                         .forTable(schema)
+                         .withPartitioner(StorageService.instance.getPartitioner())
+                         .using(insert).build();
+     }
+ 
      @Test
      public void testSyncWithinPartition() throws Exception
      {


[6/6] cassandra git commit: Merge branch 'cassandra-3.0' into cassandra-3.1

Posted by al...@apache.org.
Merge branch 'cassandra-3.0' into cassandra-3.1


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

Branch: refs/heads/cassandra-3.1
Commit: e8ee9ed4b965a9bf9addc5f0e1c476d56c19704d
Parents: fa741a5 1e64a9d
Author: Aleksey Yeschenko <al...@apache.org>
Authored: Tue Nov 10 13:46:47 2015 +0000
Committer: Aleksey Yeschenko <al...@apache.org>
Committed: Tue Nov 10 13:46:47 2015 +0000

----------------------------------------------------------------------
 CHANGES.txt                                     |  2 +-
 .../cassandra/io/sstable/CQLSSTableWriter.java  |  2 ++
 .../io/sstable/CQLSSTableWriterTest.java        | 22 ++++++++++++++++++++
 3 files changed, 25 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/e8ee9ed4/CHANGES.txt
----------------------------------------------------------------------
diff --cc CHANGES.txt
index e045905,33adefb..268ad08
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@@ -1,5 -1,6 +1,6 @@@
 -3.0.1
 +3.1
  Merged from 2.1:
+  * Reject counter writes in CQLSSTableWriter (CASSANDRA-10258)
   * Remove superfluous COUNTER_MUTATION stage mapping (CASSANDRA-10605)
  
  


[4/6] cassandra git commit: Merge branch 'cassandra-2.1' into cassandra-2.2

Posted by al...@apache.org.
Merge branch 'cassandra-2.1' into cassandra-2.2


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

Branch: refs/heads/cassandra-3.1
Commit: ef0e447addccf97aadc527cea67d303523a88989
Parents: 48b685e 3674ad9
Author: Aleksey Yeschenko <al...@apache.org>
Authored: Tue Nov 10 13:44:49 2015 +0000
Committer: Aleksey Yeschenko <al...@apache.org>
Committed: Tue Nov 10 13:44:49 2015 +0000

----------------------------------------------------------------------
 CHANGES.txt                                     |  1 +
 .../cassandra/io/sstable/CQLSSTableWriter.java  |  2 ++
 .../io/sstable/CQLSSTableWriterTest.java        | 22 ++++++++++++++++++++
 3 files changed, 25 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/ef0e447a/CHANGES.txt
----------------------------------------------------------------------
diff --cc CHANGES.txt
index fa868fe,fa2017a..5edad20
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@@ -1,13 -1,5 +1,14 @@@
 -2.1.12
 +2.2.4
 + * (cqlsh) show partial trace if incomplete after max_trace_wait (CASSANDRA-7645)
 + * Use most up-to-date version of schema for system tables (CASSANDRA-10652)
 + * Deprecate memory_allocator in cassandra.yaml (CASSANDRA-10581,10628)
 + * Expose phi values from failure detector via JMX and tweak debug
 +   and trace logging (CASSANDRA-9526)
 + * Fix RangeNamesQueryPager (CASSANDRA-10509)
 + * Deprecate Pig support (CASSANDRA-10542)
 + * Reduce contention getting instances of CompositeType (CASSANDRA-10433)
 +Merged from 2.1:
+  * Reject counter writes in CQLSSTableWriter (CASSANDRA-10258)
   * Remove superfluous COUNTER_MUTATION stage mapping (CASSANDRA-10605)
   * Improve json2sstable error reporting on nonexistent columns (CASSANDRA-10401)
   * (cqlsh) fix COPY using wrong variable name for time_format (CASSANDRA-10633)

http://git-wip-us.apache.org/repos/asf/cassandra/blob/ef0e447a/src/java/org/apache/cassandra/io/sstable/CQLSSTableWriter.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cassandra/blob/ef0e447a/test/unit/org/apache/cassandra/io/sstable/CQLSSTableWriterTest.java
----------------------------------------------------------------------


[2/6] cassandra git commit: Revert "Simplify row cache invalidation code"

Posted by al...@apache.org.
Revert "Simplify row cache invalidation code"

This reverts commit d867ac1f41c59b31f8fb4f54a06c0118018cfc81.


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

Branch: refs/heads/cassandra-3.1
Commit: 48b685e8521ea54d93c0d8d9e4ea80ecb1400dce
Parents: d867ac1
Author: Aleksey Yeschenko <al...@apache.org>
Authored: Mon Nov 9 20:15:44 2015 +0000
Committer: Aleksey Yeschenko <al...@apache.org>
Committed: Mon Nov 9 20:15:44 2015 +0000

----------------------------------------------------------------------
 .../org/apache/cassandra/db/ColumnFamilyStore.java   | 15 ++++++++++++---
 .../db/compaction/CompactionController.java          |  4 +++-
 .../cassandra/db/compaction/CompactionManager.java   |  2 +-
 .../apache/cassandra/io/sstable/SSTableRewriter.java |  3 ++-
 .../org/apache/cassandra/streaming/StreamReader.java |  2 +-
 test/unit/org/apache/cassandra/db/RowCacheTest.java  |  2 +-
 .../db/compaction/CompactionsPurgeTest.java          |  2 +-
 7 files changed, 21 insertions(+), 9 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/48b685e8/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/ColumnFamilyStore.java b/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
index b112e0e..d553f4d 100644
--- a/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
+++ b/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
@@ -1226,7 +1226,7 @@ public class ColumnFamilyStore implements ColumnFamilyStoreMBean
         return String.format("%.2f/%.2f", onHeap, offHeap);
     }
 
-    public void maybeInvalidateCachedRow(DecoratedKey key)
+    public void maybeUpdateRowCache(DecoratedKey key)
     {
         if (!isRowCacheEnabled())
             return;
@@ -1247,7 +1247,7 @@ public class ColumnFamilyStore implements ColumnFamilyStoreMBean
         long start = System.nanoTime();
         Memtable mt = data.getMemtableFor(opGroup, replayPosition);
         final long timeDelta = mt.put(key, columnFamily, indexer, opGroup);
-        maybeInvalidateCachedRow(key);
+        maybeUpdateRowCache(key);
         metric.samplers.get(Sampler.WRITES).addSample(key.getKey(), key.hashCode(), 1);
         metric.writeLatency.addNano(System.nanoTime() - start);
         if(timeDelta < Long.MAX_VALUE)
@@ -2047,7 +2047,7 @@ public class ColumnFamilyStore implements ColumnFamilyStoreMBean
             RowCacheKey key = keyIter.next();
             DecoratedKey dk = partitioner.decorateKey(ByteBuffer.wrap(key.key));
             if (key.ksAndCFName.equals(metadata.ksAndCFName) && !Range.isInRanges(dk.getToken(), ranges))
-                maybeInvalidateCachedRow(dk);
+                invalidateCachedRow(dk);
         }
 
         if (metadata.isCounter())
@@ -2532,6 +2532,15 @@ public class ColumnFamilyStore implements ColumnFamilyStoreMBean
         CacheService.instance.rowCache.remove(key);
     }
 
+    public void invalidateCachedRow(DecoratedKey key)
+    {
+        UUID cfId = Schema.instance.getId(keyspace.getName(), this.name);
+        if (cfId == null)
+            return; // secondary index
+
+        invalidateCachedRow(new RowCacheKey(metadata.ksAndCFName, key));
+    }
+
     public ClockAndCount getCachedCounter(ByteBuffer partitionKey, CellName cellName)
     {
         if (CacheService.instance.counterCache.getCapacity() == 0L) // counter cache disabled.

http://git-wip-us.apache.org/repos/asf/cassandra/blob/48b685e8/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 24ef843..5f0a198 100644
--- a/src/java/org/apache/cassandra/db/compaction/CompactionController.java
+++ b/src/java/org/apache/cassandra/db/compaction/CompactionController.java
@@ -24,6 +24,8 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import org.apache.cassandra.db.ColumnFamilyStore;
+import org.apache.cassandra.db.lifecycle.SSTableIntervalTree;
+import org.apache.cassandra.db.lifecycle.Tracker;
 import org.apache.cassandra.db.DecoratedKey;
 import org.apache.cassandra.db.RowPosition;
 import org.apache.cassandra.utils.AlwaysPresentFilter;
@@ -189,7 +191,7 @@ public class CompactionController implements AutoCloseable
 
     public void invalidateCachedRow(DecoratedKey key)
     {
-        cfs.maybeInvalidateCachedRow(key);
+        cfs.invalidateCachedRow(key);
     }
 
     public void close()

http://git-wip-us.apache.org/repos/asf/cassandra/blob/48b685e8/src/java/org/apache/cassandra/db/compaction/CompactionManager.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/compaction/CompactionManager.java b/src/java/org/apache/cassandra/db/compaction/CompactionManager.java
index 8537aca..0c6e24f 100644
--- a/src/java/org/apache/cassandra/db/compaction/CompactionManager.java
+++ b/src/java/org/apache/cassandra/db/compaction/CompactionManager.java
@@ -934,7 +934,7 @@ public class CompactionManager implements CompactionManagerMBean
                 if (Range.isInRanges(row.getKey().getToken(), ranges))
                     return row;
 
-                cfs.maybeInvalidateCachedRow(row.getKey());
+                cfs.invalidateCachedRow(row.getKey());
 
                 if (indexedColumnsInRow != null)
                     indexedColumnsInRow.clear();

http://git-wip-us.apache.org/repos/asf/cassandra/blob/48b685e8/src/java/org/apache/cassandra/io/sstable/SSTableRewriter.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/io/sstable/SSTableRewriter.java b/src/java/org/apache/cassandra/io/sstable/SSTableRewriter.java
index b08b038..dc4fe75 100644
--- a/src/java/org/apache/cassandra/io/sstable/SSTableRewriter.java
+++ b/src/java/org/apache/cassandra/io/sstable/SSTableRewriter.java
@@ -20,6 +20,7 @@ package org.apache.cassandra.io.sstable;
 import java.util.*;
 
 import com.google.common.annotations.VisibleForTesting;
+import com.google.common.util.concurrent.Runnables;
 
 import org.apache.cassandra.cache.InstrumentingCache;
 import org.apache.cassandra.cache.KeyCacheKey;
@@ -118,7 +119,7 @@ public class SSTableRewriter extends Transactional.AbstractTransactional impleme
         {
             if (index == null)
             {
-                cfs.maybeInvalidateCachedRow(row.key);
+                cfs.invalidateCachedRow(row.key);
             }
             else
             {

http://git-wip-us.apache.org/repos/asf/cassandra/blob/48b685e8/src/java/org/apache/cassandra/streaming/StreamReader.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/streaming/StreamReader.java b/src/java/org/apache/cassandra/streaming/StreamReader.java
index 88591da..1ccebb0 100644
--- a/src/java/org/apache/cassandra/streaming/StreamReader.java
+++ b/src/java/org/apache/cassandra/streaming/StreamReader.java
@@ -171,6 +171,6 @@ public class StreamReader
     {
         DecoratedKey key = StorageService.getPartitioner().decorateKey(ByteBufferUtil.readWithShortLength(in));
         writer.appendFromStream(key, cfs.metadata, in, inputVersion);
-        cfs.maybeInvalidateCachedRow(key);
+        cfs.invalidateCachedRow(key);
     }
 }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/48b685e8/test/unit/org/apache/cassandra/db/RowCacheTest.java
----------------------------------------------------------------------
diff --git a/test/unit/org/apache/cassandra/db/RowCacheTest.java b/test/unit/org/apache/cassandra/db/RowCacheTest.java
index 69c831d..5912d7c 100644
--- a/test/unit/org/apache/cassandra/db/RowCacheTest.java
+++ b/test/unit/org/apache/cassandra/db/RowCacheTest.java
@@ -133,7 +133,7 @@ public class RowCacheTest
         int keysLeft = 109;
         for (int i = 109; i >= 10; i--)
         {
-            cachedStore.maybeInvalidateCachedRow(Util.dk("key" + i));
+            cachedStore.invalidateCachedRow(Util.dk("key" + i));
             assert CacheService.instance.rowCache.size() == keysLeft;
             keysLeft--;
         }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/48b685e8/test/unit/org/apache/cassandra/db/compaction/CompactionsPurgeTest.java
----------------------------------------------------------------------
diff --git a/test/unit/org/apache/cassandra/db/compaction/CompactionsPurgeTest.java b/test/unit/org/apache/cassandra/db/compaction/CompactionsPurgeTest.java
index bfe8042..e5baab6 100644
--- a/test/unit/org/apache/cassandra/db/compaction/CompactionsPurgeTest.java
+++ b/test/unit/org/apache/cassandra/db/compaction/CompactionsPurgeTest.java
@@ -127,7 +127,7 @@ public class CompactionsPurgeTest
 
         // major compact and test that all columns but the resurrected one is completely gone
         FBUtilities.waitOnFutures(CompactionManager.instance.submitMaximal(cfs, Integer.MAX_VALUE, false));
-        cfs.maybeInvalidateCachedRow(key);
+        cfs.invalidateCachedRow(key);
         ColumnFamily cf = cfs.getColumnFamily(QueryFilter.getIdentityFilter(key, cfName, System.currentTimeMillis()));
         assertColumns(cf, "5");
         assertNotNull(cf.getColumn(cellname(String.valueOf(5))));