You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by jb...@apache.org on 2012/02/10 00:18:47 UTC

[3/3] git commit: add nodetool rebuild_index patch by Vijay; reviewed by jbellis for CASSANDRA-3583

add nodetool rebuild_index
patch by Vijay; reviewed by jbellis for CASSANDRA-3583


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

Branch: refs/heads/cassandra-1.1
Commit: 12d26f869d966a842e6b01b13e338051c9c85f68
Parents: e5be952
Author: Jonathan Ellis <jb...@apache.org>
Authored: Thu Feb 9 17:18:18 2012 -0600
Committer: Jonathan Ellis <jb...@apache.org>
Committed: Thu Feb 9 17:18:18 2012 -0600

----------------------------------------------------------------------
 CHANGES.txt                                        |    1 +
 .../org/apache/cassandra/db/ColumnFamilyStore.java |   34 +++++++++++++--
 src/java/org/apache/cassandra/db/Table.java        |    5 ++
 .../apache/cassandra/db/filter/QueryFilter.java    |    2 +-
 .../apache/cassandra/db/index/SecondaryIndex.java  |   10 ++++
 .../cassandra/db/index/SecondaryIndexManager.java  |   24 ++++++++++-
 .../apache/cassandra/service/StorageService.java   |    5 ++
 .../cassandra/service/StorageServiceMBean.java     |    6 ++-
 src/java/org/apache/cassandra/tools/NodeCmd.java   |   11 +++++
 src/java/org/apache/cassandra/tools/NodeProbe.java |    5 ++
 10 files changed, 96 insertions(+), 7 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/12d26f86/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index 8b97c73..63323e4 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,4 +1,5 @@
 1.1-dev
+ * add nodetool rebuild_index (CASSANDRA-3583)
  * add nodetool rangekeysample (CASSANDRA-2917)
  * Fix streaming too much data during move operations (CASSANDRA-3639)
  * Nodetool and CLI connect to localhost by default (CASSANDRA-3568)

http://git-wip-us.apache.org/repos/asf/cassandra/blob/12d26f86/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/ColumnFamilyStore.java b/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
index 85698d6..bf4a000 100644
--- a/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
+++ b/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
@@ -28,10 +28,7 @@ import java.util.concurrent.atomic.AtomicLong;
 import java.util.regex.Pattern;
 import javax.management.*;
 
-import com.google.common.collect.AbstractIterator;
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.Iterables;
-import com.google.common.collect.Sets;
+import com.google.common.collect.*;
 
 import org.apache.cassandra.db.compaction.LeveledManifest;
 import org.apache.cassandra.service.CacheService;
@@ -512,6 +509,35 @@ public class ColumnFamilyStore implements ColumnFamilyStoreMBean
         logger.info("Done loading load new SSTables for " + table.name + "/" + columnFamily);
     }
 
+    public static void rebuildSecondaryIndex(String ksName, String cfName, String... idxNames)
+    {
+        ColumnFamilyStore cfs = Table.open(ksName).getColumnFamilyStore(cfName);
+
+        SortedSet<ByteBuffer> indexes = new TreeSet<ByteBuffer>(cfs.metadata.comparator);
+        if (idxNames.length == 0)
+            indexes.addAll(cfs.indexManager.getIndexedColumns());
+        for (String idxName : idxNames)
+            indexes.add(cfs.indexManager.getColumnByIdxName(idxName));
+
+        Collection<SSTableReader> sstables = cfs.getSSTables();    
+        try
+        {
+            cfs.indexManager.setIndexRemoved(indexes);
+            SSTableReader.acquireReferences(sstables);
+            logger.info(String.format("User Requested secondary index re-build for %s/%s indexes", ksName, cfName));
+            cfs.indexManager.maybeBuildSecondaryIndexes(sstables, indexes);
+            cfs.indexManager.setIndexBuilt(indexes);
+        }
+        catch (IOException e)
+        {
+            throw new IOError(e);
+        }
+        finally
+        {
+            SSTableReader.releaseReferences(sstables);
+        }
+    }
+
     /**
      * @return the name of the column family
      */

http://git-wip-us.apache.org/repos/asf/cassandra/blob/12d26f86/src/java/org/apache/cassandra/db/Table.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/Table.java b/src/java/org/apache/cassandra/db/Table.java
index 1fdb3ae..ce38217 100644
--- a/src/java/org/apache/cassandra/db/Table.java
+++ b/src/java/org/apache/cassandra/db/Table.java
@@ -486,6 +486,11 @@ public class Table
         return replicationStrategy;
     }
 
+    /**
+     * @param key row to index
+     * @param cfs ColumnFamily to index row in
+     * @param indexedColumns columns to index, in comparator order
+     */
     public static void indexRow(DecoratedKey<?> key, ColumnFamilyStore cfs, SortedSet<ByteBuffer> indexedColumns)
     {
         if (logger.isDebugEnabled())

http://git-wip-us.apache.org/repos/asf/cassandra/blob/12d26f86/src/java/org/apache/cassandra/db/filter/QueryFilter.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/filter/QueryFilter.java b/src/java/org/apache/cassandra/db/filter/QueryFilter.java
index b50e5d1..eb9813f 100644
--- a/src/java/org/apache/cassandra/db/filter/QueryFilter.java
+++ b/src/java/org/apache/cassandra/db/filter/QueryFilter.java
@@ -180,7 +180,7 @@ public class QueryFilter
      * @return a QueryFilter object that will return columns matching the given names
      * @param key the row to slice
      * @param path path to the level to slice at (CF or SuperColumn)
-     * @param columns the column names to restrict the results to
+     * @param columns the column names to restrict the results to, sorted in comparator order
      */
     public static QueryFilter getNamesFilter(DecoratedKey<?> key, QueryPath path, SortedSet<ByteBuffer> columns)
     {

http://git-wip-us.apache.org/repos/asf/cassandra/blob/12d26f86/src/java/org/apache/cassandra/db/index/SecondaryIndex.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/index/SecondaryIndex.java b/src/java/org/apache/cassandra/db/index/SecondaryIndex.java
index 5f7d7c6..9571073 100644
--- a/src/java/org/apache/cassandra/db/index/SecondaryIndex.java
+++ b/src/java/org/apache/cassandra/db/index/SecondaryIndex.java
@@ -96,6 +96,16 @@ public abstract class SecondaryIndex
         return SystemTable.isIndexBuilt(baseCfs.table.name, getNameForSystemTable(columnName));
     }
     
+    public void setIndexBuilt(ByteBuffer columnName)
+    {
+        SystemTable.setIndexBuilt(baseCfs.table.name, getNameForSystemTable(columnName));
+    }
+
+    public void setIndexRemoved(ByteBuffer columnName)
+    {
+        SystemTable.setIndexRemoved(baseCfs.table.name, getNameForSystemTable(columnName));
+    }
+    
     /**
      * Called at query time
      * Creates a implementation specific searcher instance for this index type

http://git-wip-us.apache.org/repos/asf/cassandra/blob/12d26f86/src/java/org/apache/cassandra/db/index/SecondaryIndexManager.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/index/SecondaryIndexManager.java b/src/java/org/apache/cassandra/db/index/SecondaryIndexManager.java
index 610bd2a..3758e9b 100644
--- a/src/java/org/apache/cassandra/db/index/SecondaryIndexManager.java
+++ b/src/java/org/apache/cassandra/db/index/SecondaryIndexManager.java
@@ -103,7 +103,7 @@ public class SecondaryIndexManager
      * Caller must acquire and release references to the sstables used here.
      *
      * @param sstables the data to build from
-     * @param columns the list of columns to index
+     * @param columns the list of columns to index, ordered by comparator
      * @throws IOException 
      */
     public void maybeBuildSecondaryIndexes(Collection<SSTableReader> sstables, SortedSet<ByteBuffer> columns) throws IOException
@@ -309,6 +309,16 @@ public class SecondaryIndexManager
         return indexList;
     }
     
+    public ByteBuffer getColumnByIdxName(String idxName)
+    {        
+        for (Map.Entry<ByteBuffer, SecondaryIndex> entry : indexesByColumn.entrySet())
+        {
+            if (entry.getValue().getIndexName().equals(idxName)) 
+                return entry.getKey();
+        }
+        throw new RuntimeException("Unknown Index Name: " + idxName);
+    }
+    
     /**
      * @return all CFS from indexes which use a backing CFS internally (KEYS)
      */
@@ -578,4 +588,16 @@ public class SecondaryIndexManager
         
         return indexSearchers.get(0).search(clause, range, maxResults, dataFilter, maxIsColumns);
     }
+
+    public void setIndexBuilt(Collection<ByteBuffer> indexes)
+    {
+        for (ByteBuffer colName : indexes)
+            indexesByColumn.get(colName).setIndexBuilt(colName);
+    }
+    
+    public void setIndexRemoved(Collection<ByteBuffer> indexes)
+    {
+        for (ByteBuffer colName : indexes)
+            indexesByColumn.get(colName).setIndexBuilt(colName);
+    }
 }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/12d26f86/src/java/org/apache/cassandra/service/StorageService.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/service/StorageService.java b/src/java/org/apache/cassandra/service/StorageService.java
index 4c79373..c1681b9 100644
--- a/src/java/org/apache/cassandra/service/StorageService.java
+++ b/src/java/org/apache/cassandra/service/StorageService.java
@@ -2904,4 +2904,9 @@ public class StorageService implements IEndpointStateChangeSubscriber, StorageSe
             sampledKeys.add(key.getToken().toString());
         return sampledKeys;
     }
+    
+    public void rebuildSecondaryIndex(String ksName, String cfName, String... idxNames)
+    {
+        ColumnFamilyStore.rebuildSecondaryIndex(ksName, cfName, idxNames);
+    }
 }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/12d26f86/src/java/org/apache/cassandra/service/StorageServiceMBean.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/service/StorageServiceMBean.java b/src/java/org/apache/cassandra/service/StorageServiceMBean.java
index e8f0dd7..6af63b7 100644
--- a/src/java/org/apache/cassandra/service/StorageServiceMBean.java
+++ b/src/java/org/apache/cassandra/service/StorageServiceMBean.java
@@ -373,5 +373,9 @@ public interface StorageServiceMBean
      * @return set of Tokens as Strings
      */
     public List<String> getRangeKeySample();
-    
+
+    /**
+     * rebuild the specified indexes
+     */
+    public void rebuildSecondaryIndex(String ksName, String cfName, String... idxNames);
 }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/12d26f86/src/java/org/apache/cassandra/tools/NodeCmd.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/tools/NodeCmd.java b/src/java/org/apache/cassandra/tools/NodeCmd.java
index 25645c4..2b19074 100644
--- a/src/java/org/apache/cassandra/tools/NodeCmd.java
+++ b/src/java/org/apache/cassandra/tools/NodeCmd.java
@@ -120,6 +120,7 @@ public class NodeCmd
         VERSION,
         DESCRIBERING,
         RANGEKEYSAMPLE,
+        REBUILD_INDEX,
     }
 
     
@@ -173,6 +174,7 @@ public class NodeCmd
         addCmdHelp(header, "getcompactionthreshold <keyspace> <cfname>", "Print min and max compaction thresholds for a given column family");
         addCmdHelp(header, "cfhistograms <keyspace> <cfname>", "Print statistic histograms for a given column family");
         addCmdHelp(header, "refresh <keyspace> <cf-name>", "Load newly placed SSTables to the system without restart.");
+        addCmdHelp(header, "rebuild_index <keyspace> <cf-name> <idx1,idx1>", "a full rebuilds of native secondry index for a given column family. IndexNameExample: Standard3.IdxName,Standard3.IdxName1");
 
         // Three args
         addCmdHelp(header, "getendpoints <keyspace> <cf> <key>", "Print the end points that owns the key");
@@ -771,6 +773,15 @@ public class NodeCmd
                     probe.loadNewSSTables(arguments[0], arguments[1]);
                     break;
 
+                case REBUILD_INDEX:
+                    if (arguments.length < 2) { badUse("rebuild_index requires ks and cf args"); }
+                    if (arguments.length >= 3)
+                        probe.rebuildIndex(arguments[0], arguments[1], arguments[2].split(","));
+                    else
+                        probe.rebuildIndex(arguments[0], arguments[1]);
+                    
+                    break;
+
                 case GOSSIPINFO : nodeCmd.printGossipInfo(System.out); break;
 
                 case STOP:

http://git-wip-us.apache.org/repos/asf/cassandra/blob/12d26f86/src/java/org/apache/cassandra/tools/NodeProbe.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/tools/NodeProbe.java b/src/java/org/apache/cassandra/tools/NodeProbe.java
index 469c2a5..46d4c63 100644
--- a/src/java/org/apache/cassandra/tools/NodeProbe.java
+++ b/src/java/org/apache/cassandra/tools/NodeProbe.java
@@ -619,6 +619,11 @@ public class NodeProbe
         ssProxy.loadNewSSTables(ksName, cfName);
     }
 
+    public void rebuildIndex(String ksName, String cfName, String... idxNames)
+    {
+        ssProxy.rebuildSecondaryIndex(ksName, cfName, idxNames);
+    }
+
     public String getGossipInfo()
     {
         return fdProxy.getAllEndpointStates();