Updated Branches: refs/heads/cassandra-1.1 47783861a -> f58a51bc5
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/cassandra-1.1 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; } }