fix "Can't Modify Index Name" problem on CF update
patch by Pavel Yaskevich; reviewed by Yuki Morishita for CASSANDRA-4439


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

Branch: refs/heads/trunk
Commit: 202f3940dc35411f9b2351a026e859e487b94591
Parents: 7c98271
Author: Pavel Yaskevich <xe...@apache.org>
Authored: Tue Jul 17 17:18:46 2012 +0300
Committer: Pavel Yaskevich <xe...@apache.org>
Committed: Thu Jul 19 01:15:28 2012 +0300

----------------------------------------------------------------------
 CHANGES.txt                                        |    1 +
 .../org/apache/cassandra/config/CFMetaData.java    |   22 +++++++++++++++
 test/unit/org/apache/cassandra/cli/CliTest.java    |    8 +++++
 3 files changed, 31 insertions(+), 0 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/202f3940/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index 67b5410..b2a9faf 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -14,6 +14,7 @@
  * change nanoTime() to currentTimeInMillis() in schema related code 
(CASSANDRA-4432)
  * add a token generation tool (CASSANDRA-3709)
  * Fix LCS bug with sstable containing only 1 row (CASSANDRA-4411)
+ * fix "Can't Modify Index Name" problem on CF update (CASSANDRA-4439)
 Merged from 1.0:
  * allow dropping columns shadowed by not-yet-expired supercolumn or row
    tombstones in PrecompactedRow (CASSANDRA-4396)

http://git-wip-us.apache.org/repos/asf/cassandra/blob/202f3940/src/java/org/apache/cassandra/config/CFMetaData.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/config/CFMetaData.java 
b/src/java/org/apache/cassandra/config/CFMetaData.java
index c6411af..5b3f227 100644
--- a/src/java/org/apache/cassandra/config/CFMetaData.java
+++ b/src/java/org/apache/cassandra/config/CFMetaData.java
@@ -862,6 +862,28 @@ public final class CFMetaData
      */
     public void addDefaultIndexNames() throws ConfigurationException
     {
+        // if this is ColumnFamily update we need to add previously defined 
index names to the existing columns first
+        Integer cfId = Schema.instance.getId(ksName, cfName);
+        if (cfId != null)
+        {
+            CFMetaData cfm = Schema.instance.getCFMetaData(cfId);
+
+            for (Map.Entry<ByteBuffer, ColumnDefinition> entry : 
column_metadata.entrySet())
+            {
+                ColumnDefinition newDef = entry.getValue();
+
+                if (!cfm.column_metadata.containsKey(entry.getKey()) || 
newDef.getIndexType() == null)
+                    continue;
+
+                String oldIndexName = 
cfm.column_metadata.get(entry.getKey()).getIndexName();
+
+                if (newDef.getIndexName() != null && 
!oldIndexName.equals(newDef.getIndexName()))
+                    throw new ConfigurationException("Can't modify index name: 
was '" + oldIndexName + "' changed to '" + newDef.getIndexName() + "'.");
+
+                newDef.setIndexName(oldIndexName);
+            }
+        }
+
         Set<String> existingNames = existingIndexNames(null);
         for (ColumnDefinition column : column_metadata.values())
         {

http://git-wip-us.apache.org/repos/asf/cassandra/blob/202f3940/test/unit/org/apache/cassandra/cli/CliTest.java
----------------------------------------------------------------------
diff --git a/test/unit/org/apache/cassandra/cli/CliTest.java 
b/test/unit/org/apache/cassandra/cli/CliTest.java
index 756dc7f..c13cf01 100644
--- a/test/unit/org/apache/cassandra/cli/CliTest.java
+++ b/test/unit/org/apache/cassandra/cli/CliTest.java
@@ -39,6 +39,14 @@ public class CliTest extends SchemaLoader
     // please add new statements here so they could be auto-runned by this 
test.
     private String[] statements = {
         "use TestKeySpace;",
+        "create column family SecondaryIndicesWithoutIdxName" +
+                " with comparator = UTF8Type" +
+                " and default_validation_class = UTF8Type" +
+                " and column_metadata = [{column_name: profileId, 
validation_class: UTF8Type, index_type: KEYS}];",
+        "update column family SecondaryIndicesWithoutIdxName" +
+                " with column_metadata = " +
+                "[{column_name: profileId, validation_class: UTF8Type, 
index_type: KEYS}," +
+                 "{column_name: postedDate, validation_class: LongType}];",
         "create column family 123 with comparator=UTF8Type and 
column_metadata=[{ column_name:world, validation_class:IntegerType, 
index_type:0, index_name:IdxName }, " +
                                                                                
"{ column_name:world2, validation_class:LongType, index_type:KEYS, 
index_name:LongIdxName}, " +
                                                                                
"{ column_name:617070, validation_class:UTF8Type, index_type:KEYS }, " +

Reply via email to