You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by gd...@apache.org on 2010/11/23 17:28:21 UTC

svn commit: r1038192 - in /cassandra/branches/cassandra-0.7: CHANGES.txt src/java/org/apache/cassandra/config/CFMetaData.java test/unit/org/apache/cassandra/db/DefsTest.java

Author: gdusbabek
Date: Tue Nov 23 16:28:20 2010
New Revision: 1038192

URL: http://svn.apache.org/viewvc?rev=1038192&view=rev
Log:
fix add/remove bugs in CFMetadata. patch by gdusbabek, reviewed by tjake. CASSANDRA-1768

Modified:
    cassandra/branches/cassandra-0.7/CHANGES.txt
    cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/config/CFMetaData.java
    cassandra/branches/cassandra-0.7/test/unit/org/apache/cassandra/db/DefsTest.java

Modified: cassandra/branches/cassandra-0.7/CHANGES.txt
URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.7/CHANGES.txt?rev=1038192&r1=1038191&r2=1038192&view=diff
==============================================================================
--- cassandra/branches/cassandra-0.7/CHANGES.txt (original)
+++ cassandra/branches/cassandra-0.7/CHANGES.txt Tue Nov 23 16:28:20 2010
@@ -5,6 +5,7 @@ dev
    o.a.c.request.Request_responseStage -> RequestResponseStage,
    o.a.c.internal.Internal_responseStage -> InternalResponseStage
  * add AbstractType.fromString (CASSANDRA-1767)
+ * fix add/remove index bugs in CFMetadata (CASSANDRA-1768)
 
 
 0.7.0-rc1

Modified: cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/config/CFMetaData.java
URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/config/CFMetaData.java?rev=1038192&r1=1038191&r2=1038192&view=diff
==============================================================================
--- cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/config/CFMetaData.java (original)
+++ cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/config/CFMetaData.java Tue Nov 23 16:28:20 2010
@@ -21,6 +21,7 @@ package org.apache.cassandra.config;
 import java.nio.ByteBuffer;
 import java.util.ArrayList;
 import java.util.Collections;
+import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
@@ -215,7 +216,7 @@ public final class CFMetaData
                                             ? DEFAULT_MEMTABLE_OPERATIONS_IN_MILLIONS
                                             : memtableOperationsInMillions;
         this.cfId = cfId;
-        this.column_metadata = Collections.unmodifiableMap(column_metadata);
+        this.column_metadata = new HashMap<ByteBuffer, ColumnDefinition>(column_metadata);
     }
     
     /** adds this cfm to the map. */
@@ -662,6 +663,8 @@ public final class CFMetaData
         // update the ones staying
         for (org.apache.cassandra.avro.ColumnDef def : cf_def.column_metadata)
         {
+            if (!column_metadata.containsKey(def.name))
+                continue;
             column_metadata.get(def.name).setIndexType(def.index_type == null ? null : org.apache.cassandra.thrift.IndexType.valueOf(def.index_type.name()));
             column_metadata.get(def.name).setIndexName(def.index_name == null ? null : def.index_name.toString());
         }
@@ -734,7 +737,7 @@ public final class CFMetaData
         def.key_cache_size = cfm.keyCacheSize;
         def.read_repair_chance = cfm.readRepairChance;
         def.gc_grace_seconds = cfm.gcGraceSeconds;
-        def.default_validation_class = cfm.defaultValidator.getClass().getName();
+        def.default_validation_class = cfm.defaultValidator == null ? null : cfm.defaultValidator.getClass().getName();
         def.min_compaction_threshold = cfm.minCompactionThreshold;
         def.max_compaction_threshold = cfm.maxCompactionThreshold;
         def.row_cache_save_period_in_seconds = cfm.rowCacheSavePeriodInSeconds;

Modified: cassandra/branches/cassandra-0.7/test/unit/org/apache/cassandra/db/DefsTest.java
URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.7/test/unit/org/apache/cassandra/db/DefsTest.java?rev=1038192&r1=1038191&r2=1038192&view=diff
==============================================================================
--- cassandra/branches/cassandra-0.7/test/unit/org/apache/cassandra/db/DefsTest.java (original)
+++ cassandra/branches/cassandra-0.7/test/unit/org/apache/cassandra/db/DefsTest.java Tue Nov 23 16:28:20 2010
@@ -26,7 +26,9 @@ import java.nio.ByteBuffer;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 import java.util.SortedSet;
 import java.util.TreeSet;
 import java.util.UUID;
@@ -56,6 +58,7 @@ import org.apache.cassandra.locator.OldN
 import org.apache.cassandra.locator.SimpleStrategy;
 import org.apache.cassandra.thrift.CfDef;
 import org.apache.cassandra.thrift.ColumnDef;
+import org.apache.cassandra.thrift.IndexType;
 import org.apache.cassandra.utils.FBUtilities;
 import org.apache.cassandra.utils.UUIDGen;
 import org.junit.Test;
@@ -74,6 +77,63 @@ public class DefsTest extends CleanupHel
     }
     
     @Test
+    public void testCFMetaDataApply() throws ConfigurationException
+    {
+        Map<ByteBuffer, ColumnDefinition> indexes = new HashMap<ByteBuffer, ColumnDefinition>();
+        for (int i = 0; i < 5; i++) 
+        {
+            ByteBuffer name = ByteBuffer.wrap(new byte[] { (byte)i });
+            indexes.put(name, new ColumnDefinition(name, null, IndexType.KEYS, Integer.toString(i)));
+        }
+        CFMetaData cfm = new CFMetaData("Keyspace1",
+                "TestApplyCFM_CF",
+                ColumnFamilyType.Standard,
+                BytesType.instance,
+                null,
+                "No comment",
+                1.0,
+                1.0,
+                0.5,
+                100000,
+                null,
+                500,
+                500,
+                500,
+                500,
+                500,
+                500,
+                500.0,
+                indexes);
+        
+        // we'll be adding this one later. make sure it's not already there.
+        assert cfm.getColumn_metadata().get(ByteBuffer.wrap(new byte[] { 5 })) == null;
+        org.apache.cassandra.avro.CfDef cfDef = CFMetaData.convertToAvro(cfm);
+        
+        // add one.
+        org.apache.cassandra.avro.ColumnDef addIndexDef = new org.apache.cassandra.avro.ColumnDef();
+        addIndexDef.index_name = "5";
+        addIndexDef.index_type = org.apache.cassandra.avro.IndexType.KEYS;
+        addIndexDef.name = ByteBuffer.wrap(new byte[] { 5 });
+        addIndexDef.validation_class = BytesType.class.getName();
+        cfDef.column_metadata.add(addIndexDef);
+        
+        // remove one.
+        org.apache.cassandra.avro.ColumnDef removeIndexDef = new org.apache.cassandra.avro.ColumnDef();
+        removeIndexDef.index_name = "0";
+        removeIndexDef.index_type = org.apache.cassandra.avro.IndexType.KEYS;
+        removeIndexDef.name = ByteBuffer.wrap(new byte[] { 0 });
+        removeIndexDef.validation_class = BytesType.class.getName();
+        assert cfDef.column_metadata.remove(removeIndexDef);
+        
+        cfm.apply(cfDef);
+        
+        for (int i = 1; i < indexes.size(); i++)
+            assert cfm.getColumn_metadata().get(ByteBuffer.wrap(new byte[] { 1 })) != null;
+        assert cfm.getColumn_metadata().get(ByteBuffer.wrap(new byte[] { 0 })) == null;
+        assert cfm.getColumn_metadata().get(ByteBuffer.wrap(new byte[] { 5 })) != null;
+    }
+    
+    @Test
     public void testInvalidNames() throws IOException
     {
         String[] valid = {"1", "a", "_1", "b_", "__", "1_a"};