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

  1. Restart the node as the message says — startup rebuilds/reloads SAI components and re-marks the index buildable.
  2. Inspect earlier log lines for the triggering exception to address the root cause (disk errors, format mismatch).
  3. If restart does not restore it, run nodetool rebuild_index to force a full rebuild of the SAI index.
  4. Until repaired, avoid queries that require the index or expect fallback scans.
Defensive patterns

Strategy: fallback

Prevention

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


AI-assisted analysis of apache/cassandra@88fd0f6a0e (2026-09-10). Data as JSON: /api/errors/2d42427f7a146c39. Report an issue: GitHub.