You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by st...@apache.org on 2016/05/31 13:01:14 UTC

[3/6] cassandra git commit: Avoid referencing DatabaseDescriptor in AbstractType

Avoid referencing DatabaseDescriptor in AbstractType

Patch by Alex Petrov; reviewed by Stefania Alborghetti for CASSANDRA-11912


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

Branch: refs/heads/trunk
Commit: 57ead56f3bf03775ecc199de91477610d15c4a44
Parents: 81ffc46
Author: Alex Petrov <ol...@gmail.com>
Authored: Tue May 31 14:52:58 2016 +0200
Committer: Stefania Alborghetti <st...@datastax.com>
Committed: Tue May 31 14:53:48 2016 +0200

----------------------------------------------------------------------
 CHANGES.txt                                     |  1 +
 .../cassandra/config/DatabaseDescriptor.java    |  5 ++++
 .../apache/cassandra/db/ClusteringPrefix.java   |  6 ++--
 .../db/SinglePartitionReadCommand.java          |  2 +-
 .../cassandra/db/marshal/AbstractType.java      | 30 ++++----------------
 .../apache/cassandra/db/rows/BufferCell.java    |  5 ++--
 .../compaction/BlacklistingCompactionsTest.java | 19 +++++++------
 .../sstable/SSTableCorruptionDetectionTest.java |  7 +++--
 .../io/sstable/SSTableWriterTestBase.java       | 11 +++----
 9 files changed, 38 insertions(+), 48 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/57ead56f/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index 6d5117f..80a07a2 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,4 +1,5 @@
 3.0.7
+ * Avoid referencing DatabaseDescriptor in AbstractType (CASSANDRA-11912)
  * Fix sstables not being protected from removal during index build (CASSANDRA-11905)
  * cqlsh: Suppress stack trace from Read/WriteFailures (CASSANDRA-11032)
  * Remove unneeded code to repair index summaries that have

http://git-wip-us.apache.org/repos/asf/cassandra/blob/57ead56f/src/java/org/apache/cassandra/config/DatabaseDescriptor.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/config/DatabaseDescriptor.java b/src/java/org/apache/cassandra/config/DatabaseDescriptor.java
index dcda76f..cda2eaa 100644
--- a/src/java/org/apache/cassandra/config/DatabaseDescriptor.java
+++ b/src/java/org/apache/cassandra/config/DatabaseDescriptor.java
@@ -823,6 +823,11 @@ public class DatabaseDescriptor
         return conf.max_value_size_in_mb * 1024 * 1024;
     }
 
+    public static void setMaxValueSize(int maxValueSizeInBytes)
+    {
+        conf.max_value_size_in_mb = maxValueSizeInBytes / 1024 / 1024;
+    }
+
     /**
      * Creates all storage-related directories.
      */

http://git-wip-us.apache.org/repos/asf/cassandra/blob/57ead56f/src/java/org/apache/cassandra/db/ClusteringPrefix.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/ClusteringPrefix.java b/src/java/org/apache/cassandra/db/ClusteringPrefix.java
index 8d28637..7f7f964 100644
--- a/src/java/org/apache/cassandra/db/ClusteringPrefix.java
+++ b/src/java/org/apache/cassandra/db/ClusteringPrefix.java
@@ -23,7 +23,7 @@ import java.security.MessageDigest;
 import java.util.*;
 
 import org.apache.cassandra.cache.IMeasurableMemory;
-import org.apache.cassandra.config.CFMetaData;
+import org.apache.cassandra.config.*;
 import org.apache.cassandra.db.rows.*;
 import org.apache.cassandra.db.marshal.AbstractType;
 import org.apache.cassandra.io.util.DataInputPlus;
@@ -343,7 +343,7 @@ public interface ClusteringPrefix extends IMeasurableMemory, Clusterable
                 {
                     values[offset] = isNull(header, offset)
                                 ? null
-                                : (isEmpty(header, offset) ? ByteBufferUtil.EMPTY_BYTE_BUFFER : types.get(offset).readValue(in));
+                                : (isEmpty(header, offset) ? ByteBufferUtil.EMPTY_BYTE_BUFFER : types.get(offset).readValue(in, DatabaseDescriptor.getMaxValueSize()));
                     offset++;
                 }
             }
@@ -479,7 +479,7 @@ public interface ClusteringPrefix extends IMeasurableMemory, Clusterable
             int i = deserializedSize++;
             nextValues[i] = Serializer.isNull(nextHeader, i)
                           ? null
-                          : (Serializer.isEmpty(nextHeader, i) ? ByteBufferUtil.EMPTY_BYTE_BUFFER : serializationHeader.clusteringTypes().get(i).readValue(in));
+                          : (Serializer.isEmpty(nextHeader, i) ? ByteBufferUtil.EMPTY_BYTE_BUFFER : serializationHeader.clusteringTypes().get(i).readValue(in, DatabaseDescriptor.getMaxValueSize()));
             return true;
         }
 

http://git-wip-us.apache.org/repos/asf/cassandra/blob/57ead56f/src/java/org/apache/cassandra/db/SinglePartitionReadCommand.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/SinglePartitionReadCommand.java b/src/java/org/apache/cassandra/db/SinglePartitionReadCommand.java
index d5f2dc4..6784770 100644
--- a/src/java/org/apache/cassandra/db/SinglePartitionReadCommand.java
+++ b/src/java/org/apache/cassandra/db/SinglePartitionReadCommand.java
@@ -1016,7 +1016,7 @@ public class SinglePartitionReadCommand extends ReadCommand
         public ReadCommand deserialize(DataInputPlus in, int version, boolean isDigest, int digestVersion, boolean isForThrift, CFMetaData metadata, int nowInSec, ColumnFilter columnFilter, RowFilter rowFilter, DataLimits limits, Optional<IndexMetadata> index)
         throws IOException
         {
-            DecoratedKey key = metadata.decorateKey(metadata.getKeyValidator().readValue(in));
+            DecoratedKey key = metadata.decorateKey(metadata.getKeyValidator().readValue(in, DatabaseDescriptor.getMaxValueSize()));
             ClusteringIndexFilter filter = ClusteringIndexFilter.serializer.deserialize(in, version, metadata);
             return new SinglePartitionReadCommand(isDigest, digestVersion, isForThrift, metadata, nowInSec, columnFilter, rowFilter, limits, key, filter);
         }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/57ead56f/src/java/org/apache/cassandra/db/marshal/AbstractType.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/marshal/AbstractType.java b/src/java/org/apache/cassandra/db/marshal/AbstractType.java
index 9d1cc8a..9c7ac49 100644
--- a/src/java/org/apache/cassandra/db/marshal/AbstractType.java
+++ b/src/java/org/apache/cassandra/db/marshal/AbstractType.java
@@ -27,11 +27,9 @@ import java.util.Comparator;
 import java.util.List;
 import java.util.Map;
 
-import com.google.common.annotations.VisibleForTesting;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.cql3.CQL3Type;
 import org.apache.cassandra.cql3.Term;
 import org.apache.cassandra.db.TypeSizes;
@@ -83,22 +81,10 @@ public abstract class AbstractType<T> implements Comparator<ByteBuffer>
     public final ComparisonType comparisonType;
     public final boolean isByteOrderComparable;
 
-    /**
-     * The maximum size of values for this type, used when some values are not of fixed length,
-     * that is valueLengthIfFixed() returns -1.
-     */
-    public int maxValueSize;
-
     protected AbstractType(ComparisonType comparisonType)
     {
-        this(comparisonType, DatabaseDescriptor.getMaxValueSize());
-    }
-
-    protected AbstractType(ComparisonType comparisonType, int maxValueSize)
-    {
         this.comparisonType = comparisonType;
         this.isByteOrderComparable = comparisonType == ComparisonType.BYTE_ORDER;
-        this.maxValueSize = maxValueSize;
         reverseComparator = (o1, o2) -> AbstractType.this.compare(o2, o1);
         try
         {
@@ -114,17 +100,6 @@ public abstract class AbstractType<T> implements Comparator<ByteBuffer>
         }
     }
 
-    /**
-     * Change the maximum value size, this should only be called for testing.
-     * Unfortunately, ensuring we use a type created with a different maxValueSize
-     * is too hard at the moment, due to the pervasive use of the type's singleton instances.
-     */
-    @VisibleForTesting
-    public void setMaxValueSize(int maxValueSize)
-    {
-        this.maxValueSize = maxValueSize;
-    }
-
     public static List<String> asCQLTypeStringList(List<AbstractType<?>> abstractTypes)
     {
         List<String> r = new ArrayList<>(abstractTypes.size());
@@ -408,6 +383,11 @@ public abstract class AbstractType<T> implements Comparator<ByteBuffer>
 
     public ByteBuffer readValue(DataInputPlus in) throws IOException
     {
+        return readValue(in, Integer.MAX_VALUE);
+    }
+
+    public ByteBuffer readValue(DataInputPlus in, int maxValueSize) throws IOException
+    {
         int length = valueLengthIfFixed();
 
         if (length >= 0)

http://git-wip-us.apache.org/repos/asf/cassandra/blob/57ead56f/src/java/org/apache/cassandra/db/rows/BufferCell.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/rows/BufferCell.java b/src/java/org/apache/cassandra/db/rows/BufferCell.java
index 0a2c528..22b629a 100644
--- a/src/java/org/apache/cassandra/db/rows/BufferCell.java
+++ b/src/java/org/apache/cassandra/db/rows/BufferCell.java
@@ -20,8 +20,7 @@ package org.apache.cassandra.db.rows;
 import java.io.IOException;
 import java.nio.ByteBuffer;
 
-import org.apache.cassandra.config.CFMetaData;
-import org.apache.cassandra.config.ColumnDefinition;
+import org.apache.cassandra.config.*;
 import org.apache.cassandra.db.*;
 import org.apache.cassandra.db.context.CounterContext;
 import org.apache.cassandra.db.marshal.ByteType;
@@ -300,7 +299,7 @@ public class BufferCell extends AbstractCell
                 }
                 else
                 {
-                    value = header.getType(column).readValue(in);
+                    value = header.getType(column).readValue(in, DatabaseDescriptor.getMaxValueSize());
                     if (isCounter)
                         value = helper.maybeClearCounterValue(value);
                 }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/57ead56f/test/unit/org/apache/cassandra/db/compaction/BlacklistingCompactionsTest.java
----------------------------------------------------------------------
diff --git a/test/unit/org/apache/cassandra/db/compaction/BlacklistingCompactionsTest.java b/test/unit/org/apache/cassandra/db/compaction/BlacklistingCompactionsTest.java
index 21ce450..df2d8a9 100644
--- a/test/unit/org/apache/cassandra/db/compaction/BlacklistingCompactionsTest.java
+++ b/test/unit/org/apache/cassandra/db/compaction/BlacklistingCompactionsTest.java
@@ -25,6 +25,7 @@ import java.io.RandomAccessFile;
 import java.util.*;
 
 import org.junit.After;
+import org.junit.AfterClass;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
@@ -54,6 +55,7 @@ public class BlacklistingCompactionsTest
     private static final String KEYSPACE1 = "BlacklistingCompactionsTest";
     private static final String STANDARD_STCS = "Standard_STCS";
     private static final String STANDARD_LCS = "Standard_LCS";
+    private static int maxValueSize;
 
     @After
     public void leakDetect() throws InterruptedException
@@ -78,18 +80,17 @@ public class BlacklistingCompactionsTest
                                     SchemaLoader.standardCFMD(KEYSPACE1, STANDARD_STCS).compaction(CompactionParams.DEFAULT),
                                     SchemaLoader.standardCFMD(KEYSPACE1, STANDARD_LCS).compaction(CompactionParams.lcs(Collections.emptyMap())));
 
-        Keyspace keyspace = Keyspace.open(KEYSPACE1);
-        for (String tableName : new String[] {STANDARD_STCS, STANDARD_LCS})
-        {
-            final ColumnFamilyStore cfs = keyspace.getColumnFamilyStore(tableName);
-
-            for (ColumnDefinition cd : cfs.metadata.allColumns())
-                cd.type.setMaxValueSize(1024 * 1024); // set max value size to 1MB
-        }
-
+        maxValueSize = DatabaseDescriptor.getMaxValueSize();
+        DatabaseDescriptor.setMaxValueSize(1024 * 1024);
         closeStdErr();
     }
 
+    @AfterClass
+    public static void tearDown()
+    {
+        DatabaseDescriptor.setMaxValueSize(maxValueSize);
+    }
+
     public static void closeStdErr()
     {
         // These tests generate an error message per CorruptSSTableException since it goes through

http://git-wip-us.apache.org/repos/asf/cassandra/blob/57ead56f/test/unit/org/apache/cassandra/io/sstable/SSTableCorruptionDetectionTest.java
----------------------------------------------------------------------
diff --git a/test/unit/org/apache/cassandra/io/sstable/SSTableCorruptionDetectionTest.java b/test/unit/org/apache/cassandra/io/sstable/SSTableCorruptionDetectionTest.java
index 0c27fc8..4da8519 100644
--- a/test/unit/org/apache/cassandra/io/sstable/SSTableCorruptionDetectionTest.java
+++ b/test/unit/org/apache/cassandra/io/sstable/SSTableCorruptionDetectionTest.java
@@ -63,6 +63,7 @@ public class SSTableCorruptionDetectionTest extends SSTableWriterTestBase
     private static final String keyspace = "SSTableCorruptionDetectionTest";
     private static final String table = "corrupted_table";
 
+    private static int maxValueSize;
     private static Random random;
     private static SSTableWriter writer;
     private static LifecycleTransaction txn;
@@ -88,8 +89,8 @@ public class SSTableCorruptionDetectionTest extends SSTableWriterTestBase
         cfs = Keyspace.open(keyspace).getColumnFamilyStore(table);
         cfs.disableAutoCompaction();
 
-        for (ColumnDefinition cd : cfs.metadata.allColumns())
-            cd.type.setMaxValueSize(1024 * 1024);
+        maxValueSize = DatabaseDescriptor.getMaxValueSize();
+        DatabaseDescriptor.setMaxValueSize(1024 * 1024);
 
         long seed = System.nanoTime();
         logger.info("Seed {}", seed);
@@ -123,6 +124,8 @@ public class SSTableCorruptionDetectionTest extends SSTableWriterTestBase
     @AfterClass
     public static void tearDown()
     {
+        DatabaseDescriptor.setMaxValueSize(maxValueSize);
+
         txn.abort();
         writer.close();
     }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/57ead56f/test/unit/org/apache/cassandra/io/sstable/SSTableWriterTestBase.java
----------------------------------------------------------------------
diff --git a/test/unit/org/apache/cassandra/io/sstable/SSTableWriterTestBase.java b/test/unit/org/apache/cassandra/io/sstable/SSTableWriterTestBase.java
index f2c97c0..5c7c7c0 100644
--- a/test/unit/org/apache/cassandra/io/sstable/SSTableWriterTestBase.java
+++ b/test/unit/org/apache/cassandra/io/sstable/SSTableWriterTestBase.java
@@ -60,6 +60,8 @@ public class SSTableWriterTestBase extends SchemaLoader
     private static Config.DiskAccessMode standardMode;
     private static Config.DiskAccessMode indexMode;
 
+    private static int maxValueSize;
+
     @BeforeClass
     public static void defineSchema() throws ConfigurationException
     {
@@ -78,15 +80,14 @@ public class SSTableWriterTestBase extends SchemaLoader
                                     SchemaLoader.standardCFMD(KEYSPACE, CF),
                                     SchemaLoader.standardCFMD(KEYSPACE, CF_SMALL_MAX_VALUE));
 
-        Keyspace keyspace = Keyspace.open(KEYSPACE);
-        ColumnFamilyStore cfs = keyspace.getColumnFamilyStore(CF_SMALL_MAX_VALUE);
-        for (ColumnDefinition cd : cfs.metadata.allColumns())
-            cd.type.setMaxValueSize(1024 * 1024); // set max value size to 1MB
+        maxValueSize = DatabaseDescriptor.getMaxValueSize();
+        DatabaseDescriptor.setMaxValueSize(1024 * 1024); // set max value size to 1MB
     }
 
     @AfterClass
-    public static void revertDiskAccess()
+    public static void revertConfiguration()
     {
+        DatabaseDescriptor.setMaxValueSize(maxValueSize);
         DatabaseDescriptor.setDiskAccessMode(standardMode);
         DatabaseDescriptor.setIndexAccessMode(indexMode);
     }