public class SecondaryIndexManager extends java.lang.Object implements IndexRegistry, INotificationConsumer
Callable<?>
. These are primarily the
management tasks for an index implementation. Most of them are currently executed in a blocking
fashion via submission to SIM's blockingExecutor. This provides the desired behaviour in pretty
much all cases, as tasks like flushing an index needs to be executed synchronously to avoid potentially
deadlocking on the FlushWriter or PostFlusher. Several of these Callable<?>
returning methods on Index could
then be defined with as void and called directly from SIM (rather than being run via the executor service).
Separating the task defintion from execution gives us greater flexibility though, so that in future, for example,
if the flush process allows it we leave open the possibility of executing more of these tasks asynchronously.
this#rebuildIndexesBlocking(Set)
or builds of new sstables
added via SSTableAddedNotification
s, guaranteeing
the following:
Modifier and Type | Field and Description |
---|---|
ColumnFamilyStore |
baseCfs
The underlying column family containing the source data for these indexes
|
static int |
DEFAULT_PAGE_SIZE |
EMPTY, NON_DAEMON
Constructor and Description |
---|
SecondaryIndexManager(ColumnFamilyStore baseCfs) |
Modifier and Type | Method and Description |
---|---|
java.util.concurrent.Future<?> |
addIndex(IndexMetadata indexDef,
boolean isNewCF)
Adds and builds a index
|
int |
calculateIndexingPageSize()
Return the page size used when indexing an entire partition
|
void |
deletePartition(UnfilteredRowIterator partition,
int nowInSec)
Delete all data from all indexes for this partition.
|
void |
dropAllIndexes()
Remove all indexes
|
void |
executePreJoinTasksBlocking(boolean hadBootstrap)
Performs a blocking execution of pre-join tasks of all indexes
|
void |
flushAllIndexesBlocking()
Perform a blocking flush all indexes
|
void |
flushAllNonCFSBackedIndexesBlocking()
Performs a blocking flush of all custom indexes
|
void |
flushIndexesBlocking(java.util.Set<Index> indexes)
Perform a blocking flush of selected indexes
|
java.util.Set<ColumnFamilyStore> |
getAllIndexColumnFamilyStores() |
java.util.Optional<Index> |
getBestIndexFor(RowFilter.Expression expression) |
Index |
getBestIndexFor(RowFilter rowFilter)
Called at query time to choose which (if any) of the registered index implementations to use for a given query.
|
java.util.List<java.lang.String> |
getBuiltIndexNames() |
java.util.Set<IndexMetadata> |
getDependentIndexes(ColumnMetadata column) |
Index |
getIndex(IndexMetadata metadata) |
Index |
getIndexByName(java.lang.String indexName) |
static java.lang.String |
getIndexName(ColumnFamilyStore cfs)
Returns the index name
|
static java.lang.String |
getIndexName(java.lang.String cfName)
Returns the index name
|
static ColumnFamilyStore |
getParentCfs(ColumnFamilyStore cfs)
Returns the parent of the specified
ColumnFamilyStore . |
static java.lang.String |
getParentCfsName(java.lang.String cfName)
Returns the parent name of the specified
ColumnFamilyStore . |
void |
handleNotification(INotification notification,
java.lang.Object sender) |
boolean |
hasIndexes() |
void |
indexPartition(DecoratedKey key,
java.util.Set<Index> indexes,
int pageSize)
When building an index against existing data in sstables, add the given partition to the index
|
void |
invalidateAllIndexesBlocking() |
boolean |
isIndexBuilding(java.lang.String indexName)
Checks if the specified index has any running build task.
|
static boolean |
isIndexColumnFamily(java.lang.String cfName)
Checks if the specified
ColumnFamilyStore is the one secondary index. |
static boolean |
isIndexColumnFamilyStore(ColumnFamilyStore cfs)
Checks if the specified
ColumnFamilyStore is a secondary index. |
boolean |
isIndexQueryable(Index index)
Checks if the specified index is queryable.
|
boolean |
isIndexWritable(Index index)
Checks if the specified index is writable.
|
java.util.Collection<Index> |
listIndexes() |
void |
markAllIndexesRemoved()
Called when dropping a Table
|
CleanupTransaction |
newCleanupTransaction(DecoratedKey key,
RegularAndStaticColumns regularAndStaticColumns,
int nowInSec)
Transaction for use when removing partitions during cleanup
|
CompactionTransaction |
newCompactionTransaction(DecoratedKey key,
RegularAndStaticColumns regularAndStaticColumns,
int versions,
int nowInSec)
Transaction for use when merging rows during compaction
|
UpdateTransaction |
newUpdateTransaction(PartitionUpdate update,
WriteContext ctx,
int nowInSec)
Transaction for updates on the write path.
|
void |
rebuildIndexesBlocking(java.util.Set<java.lang.String> indexNames)
Does a blocking full rebuild/recovery of the specifed indexes from all the sstables in the base table.
|
void |
registerIndex(Index index) |
void |
reload()
Drops and adds new indexes associated with the underlying CF
|
void |
removeIndex(java.lang.String indexName) |
static void |
shutdownAndWait(long timeout,
java.util.concurrent.TimeUnit units) |
void |
truncateAllIndexesBlocking(long truncatedAt)
Truncate all indexes
|
void |
unregisterIndex(Index index) |
void |
validate(PartitionUpdate update)
Called at write time to ensure that values present in the update
are valid according to the rules of all registered indexes which
will process it.
|
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
obtain
public static final int DEFAULT_PAGE_SIZE
public final ColumnFamilyStore baseCfs
public SecondaryIndexManager(ColumnFamilyStore baseCfs)
public void reload()
public java.util.concurrent.Future<?> addIndex(IndexMetadata indexDef, boolean isNewCF)
indexDef
- the IndexMetadata describing the indexisNewCF
- true if the index is added as part of a new table/columnfamily (i.e. loading a CF at startup),
false for all other cases (i.e. newly added index)public boolean isIndexQueryable(Index index)
index
- the indextrue
if the specified index is queryable, false
otherwisepublic boolean isIndexWritable(Index index)
index
- the indextrue
if the specified index is writable, false
otherwisepublic boolean isIndexBuilding(java.lang.String indexName)
indexName
- the index nametrue
if the index is building, false
otherwisepublic void removeIndex(java.lang.String indexName)
public java.util.Set<IndexMetadata> getDependentIndexes(ColumnMetadata column)
public void markAllIndexesRemoved()
public void rebuildIndexesBlocking(java.util.Set<java.lang.String> indexNames)
indexNames
- the list of indexes to be rebuiltpublic static boolean isIndexColumnFamilyStore(ColumnFamilyStore cfs)
ColumnFamilyStore
is a secondary index.cfs
- the ColumnFamilyStore
to check.true
if the specified ColumnFamilyStore
is a secondary index,
false
otherwise.public static boolean isIndexColumnFamily(java.lang.String cfName)
ColumnFamilyStore
is the one secondary index.cfName
- the name of the ColumnFamilyStore
to check.true
if the specified ColumnFamilyStore
is a secondary index,
false
otherwise.public static ColumnFamilyStore getParentCfs(ColumnFamilyStore cfs)
ColumnFamilyStore
.cfs
- the ColumnFamilyStore
ColumnFamilyStore
public static java.lang.String getParentCfsName(java.lang.String cfName)
ColumnFamilyStore
.cfName
- the ColumnFamilyStore
nameColumnFamilyStore
public static java.lang.String getIndexName(ColumnFamilyStore cfs)
cfs
- the ColumnFamilyStore
public static java.lang.String getIndexName(java.lang.String cfName)
cfName
- the ColumnFamilyStore
namepublic Index getIndexByName(java.lang.String indexName)
public void truncateAllIndexesBlocking(long truncatedAt)
public void dropAllIndexes()
public void invalidateAllIndexesBlocking()
public void flushAllIndexesBlocking()
public void flushIndexesBlocking(java.util.Set<Index> indexes)
public void flushAllNonCFSBackedIndexesBlocking()
public void executePreJoinTasksBlocking(boolean hadBootstrap)
public java.util.List<java.lang.String> getBuiltIndexNames()
public java.util.Set<ColumnFamilyStore> getAllIndexColumnFamilyStores()
public boolean hasIndexes()
public void indexPartition(DecoratedKey key, java.util.Set<Index> indexes, int pageSize)
public int calculateIndexingPageSize()
public void deletePartition(UnfilteredRowIterator partition, int nowInSec)
TODO : improve cleanup transaction to batch updates and perform them async
public Index getBestIndexFor(RowFilter rowFilter)
This is a two step processes, firstly compiling the set of searchable indexes then choosing the one which reduces the search space the most.
In the first phase, if the command's RowFilter contains any custom index expressions, the indexes that they specify are automatically included. Following that, the registered indexes are filtered to include only those which support the standard expressions in the RowFilter.
The filtered set then sorted by selectivity, as reported by the Index implementations' getEstimatedResultRows method.
Implementation specific validation of the target expression, either custom or standard, by the selected index should be performed in the searcherFor method to ensure that we pick the right index regardless of the validity of the expression.
This method is only called once during the lifecycle of a ReadCommand and the result is cached for future use when obtaining a Searcher, getting the index's underlying CFS for ReadOrderGroup, or an estimate of the result size from an average index query.
rowFilter
- RowFilter of the command to be executedpublic java.util.Optional<Index> getBestIndexFor(RowFilter.Expression expression)
getBestIndexFor
in interface IndexRegistry
public void validate(PartitionUpdate update) throws InvalidRequestException
validate
in interface IndexRegistry
update
- PartitionUpdate containing the values to be validated by registered Index implementationsInvalidRequestException
public void registerIndex(Index index)
registerIndex
in interface IndexRegistry
public void unregisterIndex(Index index)
unregisterIndex
in interface IndexRegistry
public Index getIndex(IndexMetadata metadata)
getIndex
in interface IndexRegistry
public java.util.Collection<Index> listIndexes()
listIndexes
in interface IndexRegistry
public UpdateTransaction newUpdateTransaction(PartitionUpdate update, WriteContext ctx, int nowInSec)
public CompactionTransaction newCompactionTransaction(DecoratedKey key, RegularAndStaticColumns regularAndStaticColumns, int versions, int nowInSec)
public CleanupTransaction newCleanupTransaction(DecoratedKey key, RegularAndStaticColumns regularAndStaticColumns, int nowInSec)
public void handleNotification(INotification notification, java.lang.Object sender)
handleNotification
in interface INotificationConsumer
public static void shutdownAndWait(long timeout, java.util.concurrent.TimeUnit units) throws java.lang.InterruptedException, java.util.concurrent.TimeoutException
java.lang.InterruptedException
java.util.concurrent.TimeoutException
Copyright © 2009-2021 The Apache Software Foundation