Fix CQL3 index dropping

patch by slebresne; reviewed by jbellis for CASSANDRA-4192


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

Branch: refs/heads/trunk
Commit: f58a51bc5f9815b554a52f93b48d70670a55047e
Parents: 4778386
Author: Sylvain Lebresne <sylv...@datastax.com>
Authored: Mon May 14 08:51:03 2012 +0200
Committer: Sylvain Lebresne <sylv...@datastax.com>
Committed: Mon May 14 08:51:03 2012 +0200

----------------------------------------------------------------------
 CHANGES.txt                                        |    1 +
 .../org/apache/cassandra/config/CFMetaData.java    |   31 ++++++++++----
 .../cql3/statements/DropIndexStatement.java        |   17 +++++---
 3 files changed, 33 insertions(+), 16 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/f58a51bc/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index 9246433..b37bd83 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -40,6 +40,7 @@
    (CASSANDRA-4187)
  * Fix exception during move when localhost is the only source (CASSANDRA-4200)
  * (cql3) Allow paging through non-ordered partitioner results (CASSANDRA-3771)
+ * (cql3) Fix drop index
 Merged from 1.0:
  * Fix super columns bug where cache is not updated (CASSANDRA-4190)
  * fix maxTimestamp to include row tombstones (CASSANDRA-4116)

http://git-wip-us.apache.org/repos/asf/cassandra/blob/f58a51bc/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 e36ea2d..ce4ed76 100644
--- a/src/java/org/apache/cassandra/config/CFMetaData.java
+++ b/src/java/org/apache/cassandra/config/CFMetaData.java
@@ -849,10 +849,18 @@ public final class CFMetaData
      */
     public void addDefaultIndexNames() throws ConfigurationException
     {
+        Set<String> existingNames = existingIndexNames(null);
         for (ColumnDefinition column : column_metadata.values())
         {
             if (column.getIndexType() != null && column.getIndexName() == null)
-                column.setIndexName(getDefaultIndexName(cfName, comparator, 
column.name));
+            {
+                String baseName = getDefaultIndexName(cfName, comparator, 
column.name);
+                String indexName = baseName;
+                int i = 0;
+                while (existingNames.contains(indexName))
+                    indexName = baseName + '_' + (++i);
+                column.setIndexName(indexName);
+            }
         }
     }
 
@@ -941,14 +949,7 @@ public final class CFMetaData
         validateAlias(valueAlias, "Value");
 
         // initialize a set of names NOT in the CF under consideration
-        Set<String> indexNames = new HashSet<String>();
-        for (ColumnFamilyStore cfs : ColumnFamilyStore.all())
-        {
-            if (!cfs.getColumnFamilyName().equals(cfName))
-                for (ColumnDefinition cd : 
cfs.metadata.getColumn_metadata().values())
-                    indexNames.add(cd.getIndexName());
-        }
-
+        Set<String> indexNames = existingIndexNames(cfName);
         for (ColumnDefinition c : column_metadata.values())
         {
             AbstractType<?> comparator = getColumnDefinitionComparator(c);
@@ -995,6 +996,18 @@ public final class CFMetaData
         return this;
     }
 
+    private static Set<String> existingIndexNames(String cfToExclude)
+    {
+        Set<String> indexNames = new HashSet<String>();
+        for (ColumnFamilyStore cfs : ColumnFamilyStore.all())
+        {
+            if (cfToExclude == null || 
!cfs.getColumnFamilyName().equals(cfToExclude))
+                for (ColumnDefinition cd : 
cfs.metadata.getColumn_metadata().values())
+                    indexNames.add(cd.getIndexName());
+        }
+        return indexNames;
+    }
+
     private static void validateAlias(ByteBuffer alias, String msg) throws 
ConfigurationException
     {
         if (alias != null)

http://git-wip-us.apache.org/repos/asf/cassandra/blob/f58a51bc/src/java/org/apache/cassandra/cql3/statements/DropIndexStatement.java
----------------------------------------------------------------------
diff --git 
a/src/java/org/apache/cassandra/cql3/statements/DropIndexStatement.java 
b/src/java/org/apache/cassandra/cql3/statements/DropIndexStatement.java
index ab47100..12d04c1 100644
--- a/src/java/org/apache/cassandra/cql3/statements/DropIndexStatement.java
+++ b/src/java/org/apache/cassandra/cql3/statements/DropIndexStatement.java
@@ -29,12 +29,12 @@ import org.apache.cassandra.thrift.InvalidRequestException;
 
 public class DropIndexStatement extends SchemaAlteringStatement
 {
-    public final CharSequence index;
+    public final String indexName;
 
     public DropIndexStatement(String indexName)
     {
         super(new CFName());
-        index = indexName;
+        this.indexName = indexName;
     }
 
     public void announceMigration() throws InvalidRequestException, 
ConfigurationException
@@ -51,7 +51,7 @@ public class DropIndexStatement extends 
SchemaAlteringStatement
         }
 
         if (updatedCfm == null)
-            throw new InvalidRequestException("Index '" + index + "' could not 
be found in any of the column families of keyspace '" + keyspace() + "'");
+            throw new InvalidRequestException("Index '" + indexName + "' could 
not be found in any of the column families of keyspace '" + keyspace() + "'");
 
         MigrationManager.announceColumnFamilyUpdate(updatedCfm);
     }
@@ -60,11 +60,14 @@ public class DropIndexStatement extends 
SchemaAlteringStatement
     {
         for (ColumnDefinition column : cfm.getColumn_metadata().values())
         {
-            if (column.getIndexType() != null && column.getIndexName() != null 
&& column.getIndexName().equals(index))
+            if (column.getIndexType() != null && column.getIndexName() != null 
&& column.getIndexName().equals(indexName))
             {
-                column.setIndexName(null);
-                column.setIndexType(null, null);
-                return cfm;
+                CFMetaData cloned = cfm.clone();
+                ColumnDefinition toChange = 
cloned.getColumn_metadata().get(column.name);
+                assert toChange.getIndexName() != null && 
toChange.getIndexName().equals(indexName);
+                toChange.setIndexName(null);
+                toChange.setIndexType(null, null);
+                return cloned;
             }
         }
 

Reply via email to