public class SecondaryIndexManager extends java.lang.Object implements IndexRegistry
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.
The primary exception to the above is the Callable returned from Index#addIndexedColumn. This may
involve a significant effort, building a new index over any existing data. We perform this task asynchronously;
as it is called as part of a schema update, which we do not want to block for a long period. Building non-custom
indexes is performed on the CompactionManager.
This class also provides instances of processors which listen to updates to the base table and forward to
registered Indexes the info required to keep those indexes up to date.
There are two variants of these processors, each with a factory method provided by SIM:
IndexTransaction: deals with updates generated on the regular write path.
CleanupTransaction: used when partitions are modified during compaction or cleanup operations.
Further details on their usage and lifecycles can be found in the interface definitions below.
Finally, the bestIndexFor method is used at query time to identify the most selective index of those able
to satisfy any search predicates defined by a ReadCommand's RowFilter. It returns a thin IndexAccessor object
which enables the ReadCommand to access the appropriate functions of the Index at various stages in its lifecycle.
e.g. the getEstimatedResultRows is required when StorageProxy calculates the initial concurrency factor for
distributing requests to replicas, whereas a Searcher instance is needed when the ReadCommand is executed locally on
a target replica.Modifier and Type | Field and Description |
---|---|
ColumnFamilyStore |
baseCfs
The underlying column family containing the source data for these indexes
|
static int |
DEFAULT_PAGE_SIZE |
Constructor and Description |
---|
SecondaryIndexManager(ColumnFamilyStore baseCfs) |
Modifier and Type | Method and Description |
---|---|
java.util.concurrent.Future<?> |
addIndex(IndexMetadata indexDef)
Adds and builds a index
|
void |
buildAllIndexesBlocking(java.util.Collection<SSTableReader> sstables) |
void |
buildIndexBlocking(Index 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 |
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() |
Index |
getBestIndexFor(ReadCommand command)
Called at query time to choose which (if any) of the registered index implementations to use for a given query.
|
java.util.Optional<Index> |
getBestIndexFor(RowFilter.Expression expression) |
java.util.List<java.lang.String> |
getBuiltIndexNames() |
java.util.Set<IndexMetadata> |
getDependentIndexes(ColumnDefinition 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 . |
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()
Remove all indexes
|
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.
|
java.util.Collection<Index> |
listIndexes() |
void |
markAllIndexesRemoved()
Called when dropping a Table
|
void |
markIndexBuilt(java.lang.String indexName)
Marks the specified index as build.
|
void |
markIndexRemoved(java.lang.String indexName)
Marks the specified index as removed.
|
CleanupTransaction |
newCleanupTransaction(DecoratedKey key,
PartitionColumns partitionColumns,
int nowInSec)
Transaction for use when removing partitions during cleanup
|
CompactionTransaction |
newCompactionTransaction(DecoratedKey key,
PartitionColumns partitionColumns,
int versions,
int nowInSec)
Transaction for use when merging rows during compaction
|
UpdateTransaction |
newUpdateTransaction(PartitionUpdate update,
OpOrder.Group opGroup,
int nowInSec)
Transaction for updates on the write path.
|
void |
rebuildIndexesBlocking(java.util.Collection<SSTableReader> sstables,
java.util.Set<java.lang.String> indexNames)
Does a full, blocking rebuild of the indexes specified by columns from the sstables.
|
void |
registerIndex(Index index)
IndexRegistry methods
|
void |
reload()
Drops and adds new indexes associated with the underlying CF
|
void |
removeIndex(java.lang.String indexName) |
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.
|
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)
indexDef
- the IndexMetadata describing the indexpublic boolean isIndexQueryable(Index index)
index
- the indextrue
if the specified index is queryable, false
otherwisepublic void removeIndex(java.lang.String indexName)
public java.util.Set<IndexMetadata> getDependentIndexes(ColumnDefinition column)
public void markAllIndexesRemoved()
public void rebuildIndexesBlocking(java.util.Collection<SSTableReader> sstables, java.util.Set<java.lang.String> indexNames)
sstables
- the data to build fromindexNames
- the list of indexes to be rebuiltpublic void buildAllIndexesBlocking(java.util.Collection<SSTableReader> sstables)
public void buildIndexBlocking(Index index)
public 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 void markIndexBuilt(java.lang.String indexName)
This method is public as it need to be accessible from the Index
implementations
indexName
- the index namepublic void markIndexRemoved(java.lang.String indexName)
This method is public as it need to be accessible from the Index
implementations
indexName
- the index namepublic Index getIndexByName(java.lang.String indexName)
public void truncateAllIndexesBlocking(long truncatedAt)
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)
public Index getBestIndexFor(ReadCommand command)
command
- ReadCommand to be executedpublic java.util.Optional<Index> getBestIndexFor(RowFilter.Expression expression)
public void validate(PartitionUpdate update) throws InvalidRequestException
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, OpOrder.Group opGroup, int nowInSec)
public CompactionTransaction newCompactionTransaction(DecoratedKey key, PartitionColumns partitionColumns, int versions, int nowInSec)
public CleanupTransaction newCleanupTransaction(DecoratedKey key, PartitionColumns partitionColumns, int nowInSec)
Copyright © 2017 The Apache Software Foundation