diff --git a/CHANGES.txt b/CHANGES.txt index 75e856c3c0..04fa0bf8bd 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,4 +1,5 @@ 1.1.5 + * add SecondaryIndex.reload API (CASSANDRA-4581) * use millis + atomicint for commitlog segment creation instead of nanotime, which has issues under some hypervisors (CASSANDRA-4601) * fix FD leak in slice queries (CASSANDRA-4571) diff --git a/src/java/org/apache/cassandra/db/index/SecondaryIndex.java b/src/java/org/apache/cassandra/db/index/SecondaryIndex.java index 3732086c0e..8d734ff8ef 100644 --- a/src/java/org/apache/cassandra/db/index/SecondaryIndex.java +++ b/src/java/org/apache/cassandra/db/index/SecondaryIndex.java @@ -65,6 +65,14 @@ public abstract class SecondaryIndex */ public abstract void init(); + /** + * Reload an existing index following a change to its configuration, + * or that of the indexed column(s). Differs from init() in that we expect + * expect new resources (such as CFS for a KEYS index) to be created by + * init() but not here + */ + public abstract void reload() throws IOException; + /** * Validates the index_options passed in the ColumnDef * @throws ConfigurationException diff --git a/src/java/org/apache/cassandra/db/index/SecondaryIndexManager.java b/src/java/org/apache/cassandra/db/index/SecondaryIndexManager.java index 7258835349..15064c7b57 100644 --- a/src/java/org/apache/cassandra/db/index/SecondaryIndexManager.java +++ b/src/java/org/apache/cassandra/db/index/SecondaryIndexManager.java @@ -99,10 +99,11 @@ public class SecondaryIndexManager if (cdef.getIndexType() != null && !indexedColumnNames.contains(cdef.name)) addIndexedColumn(cdef); - for (ColumnFamilyStore cfs : getIndexesBackedByCfs()) + Set reloadedIndexes = Collections.newSetFromMap(new IdentityHashMap()); + for (SecondaryIndex index : indexesByColumn.values()) { - cfs.metadata.reloadSecondaryIndexMetadata(baseCfs.metadata); - cfs.reload(); + if (reloadedIndexes.add(index)) + index.reload(); } } diff --git a/src/java/org/apache/cassandra/db/index/keys/KeysIndex.java b/src/java/org/apache/cassandra/db/index/keys/KeysIndex.java index 3ee782b6ff..bbdedce011 100644 --- a/src/java/org/apache/cassandra/db/index/keys/KeysIndex.java +++ b/src/java/org/apache/cassandra/db/index/keys/KeysIndex.java @@ -181,4 +181,10 @@ public class KeysIndex extends PerColumnSecondaryIndex { return indexCfs.getMemtableDataSize(); } + + public void reload() throws IOException + { + indexCfs.metadata.reloadSecondaryIndexMetadata(baseCfs.metadata); + indexCfs.reload(); + } } diff --git a/test/unit/org/apache/cassandra/db/SecondaryIndexColumnSizeTest.java b/test/unit/org/apache/cassandra/db/SecondaryIndexColumnSizeTest.java index 89479e9eeb..645131b18e 100644 --- a/test/unit/org/apache/cassandra/db/SecondaryIndexColumnSizeTest.java +++ b/test/unit/org/apache/cassandra/db/SecondaryIndexColumnSizeTest.java @@ -137,7 +137,11 @@ public class SecondaryIndexColumnSizeTest public void deleteFromIndex(DecoratedKey key, List indexedColumnsInRow) { } - + + @Override + public void reload() + { + } } @@ -210,6 +214,11 @@ public class SecondaryIndexColumnSizeTest @Override public void updateColumn(DecoratedKey valueKey, ByteBuffer rowKey, IColumn col) throws IOException { - } + } + + @Override + public void reload() + { + } } }