apache/cassandra · warning
Storage-attached index is no longer queryable. Please restar
Error message
Storage-attached index is no longer queryable. Please restart this node to repair it.
What it means
makeIndexNonQueryable removes a StorageAttachedIndex from the SecondaryIndexManager's queryable set, marks it BUILD_FAILED, and logs this WARN. Afterwards queries will not use the index and will fall back (or error if the query requires the index), and a node restart is required to rebuild and restore the index to a queryable state.
Source
Thrown at src/java/org/apache/cassandra/index/sai/StorageAttachedIndex.java:802
/**
* @return the total memory usage (in bytes) of per-column index on-disk data structure
*/
public long indexFileCacheSize()
{
return view().getIndexes()
.stream()
.mapToLong(SSTableIndex::indexFileCacheSize)
.sum();
}
/**
* Removes this index from the {@code SecondaryIndexManager}'s set of queryable indexes.
*/
public void makeIndexNonQueryable()
{
baseCfs.indexManager.makeIndexNonQueryable(this, Status.BUILD_FAILED);
logger.warn(indexIdentifier.logMessage("Storage-attached index is no longer queryable. Please restart this node to repair it."));
}
/**
* Validate maximum term size for given row
*/
public void validateTermSizeForRow(DecoratedKey key, Row row, boolean isClientMutation, ClientState state)
{
AbstractAnalyzer analyzer = hasAnalyzer() ? analyzer() : null;
if (indexTermType.isNonFrozenCollection())
{
Iterator<ByteBuffer> bufferIterator = indexTermType.valuesOf(row, FBUtilities.nowInSeconds());
while (bufferIterator != null && bufferIterator.hasNext())
validateTermSizeForCell(analyzer, key, bufferIterator.next(), isClientMutation, state);
}
else if (indexTermType.isFrozenCollection() && indexTermType.indexTargetType() != IndexTarget.Type.FULL)
{
Iterator<ByteBuffer> bufferIterator = indexTermType.valuesOfFrozenCollection(row, FBUtilities.nowInSeconds());
while (bufferIterator != null && bufferIterator.hasNext())View on GitHub (pinned to 88fd0f6a0e)
Solutions
- Restart the node as the message says — startup rebuilds/reloads SAI components and re-marks the index buildable.
- Inspect earlier log lines for the triggering exception to address the root cause (disk errors, format mismatch).
- If restart does not restore it, run nodetool rebuild_index to force a full rebuild of the SAI index.
- Until repaired, avoid queries that require the index or expect fallback scans.
Defensive patterns
Strategy: fallback
Prevention
- Plan restart/rebuild procedures for nodes running SAI indexes.
- Monitor SAI component I/O errors early; they precede makeIndexNonQueryable.
- Keep a runbook: restart node, then nodetool rebuild_index if the index stays BUILD_FAILED.
- Avoid unclean shutdowns which can corrupt SAI segment files.
When it happens
Trigger: Runtime failure of the index — e.g. an SAI SSTable component becoming unreadable during query or flush, a ValidationException while loading per-SSTable index contexts, or corruption detected by SAI at query time that disqualifies the whole index.
Common situations: Disk corruption of .sc SAI component files; interrupted compaction leaving inconsistent SAI components; OOM or I/O errors during index segment reads; nodes with multiple data directories hitting known vector index issues.
Understand the failure class
Background: "Invalid state transition" errors: "status must be X, actually Y", "already rejected/charging/uninstalled", "cannot ... while running" — what they mean when a library rejects your call — this error's family across 31 libraries.
Related errors
- An error occurred while scrubbing the partition with key '%s
- {} failed for index component {} on SSTable {}
- No rows to index during flush of SSTable {}.
- Attempted to release storage-attached index segment builder
- Failed to update per-column components for SSTable {}
AI-assisted analysis of apache/cassandra@88fd0f6a0e (2026-09-10).
Data as JSON: /api/errors/2d42427f7a146c39.
Report an issue: GitHub.