apache/cassandra · error · ConfigurationException

SASI only supports Murmur3Partitioner.

Error message

SASI only supports Murmur3Partitioner.

What it means

SASIIndex.validateOptions is invoked when creating a SASI index. SASI's on-disk formats and tokenizers are implemented only for Murmur3Partitioner, so if the table uses any other partitioner (e.g. ByteOrderedPartitioner, RandomPartitioner) it throws ConfigurationException("SASI only supports Murmur3Partitioner.").

Source

Thrown at src/java/org/apache/cassandra/index/sasi/SASIIndex.java:157

        for (SSTableReader sstable : index.init(tracker.getView().liveSSTables()))
        {
            Map<ColumnMetadata, ColumnIndex> perSSTable = toRebuild.get(sstable);
            if (perSSTable == null)
                toRebuild.put(sstable, (perSSTable = new HashMap<>()));

            perSSTable.put(index.getDefinition(), index);
        }

        CompactionManager.instance.submitIndexBuild(new SASIIndexBuilder(baseCfs, toRebuild));
    }

    /**
     * Called via reflection at {@link IndexMetadata#validateCustomIndexOptions}
     */
    public static Map<String, String> validateOptions(Map<String, String> options, TableMetadata metadata)
    {
        if (!(metadata.partitioner instanceof Murmur3Partitioner))
            throw new ConfigurationException("SASI only supports Murmur3Partitioner.");

        String targetColumn = options.get("target");
        if (targetColumn == null)
            throw new ConfigurationException("unknown target column");

        Pair<ColumnMetadata, IndexTarget.Type> target = TargetParser.parse(metadata, targetColumn);
        if (target == null)
            throw new ConfigurationException("failed to retrieve target column for: " + targetColumn);

        if (target.left.isComplex())
            throw new ConfigurationException("complex columns are not yet supported by SASI");

        if (target.left.isPartitionKey())
            throw new ConfigurationException("partition key columns are not yet supported by SASI");

        IndexMode.validateAnalyzer(options, target.left);

        IndexMode mode = IndexMode.getMode(target.left, options);

View on GitHub (pinned to 88fd0f6a0e)

Solutions

  1. Recreate the keyspace/table with Murmur3Partitioner (the default) before creating SASI indexes
  2. Use SAI or legacy secondary indexes instead if the partitioner cannot change
  3. Verify partitioner in system.local or cassandra.yaml before creating indexes

Example fix

// before
CREATE KEYSPACE ks WITH partitioner = 'org.apache.cassandra.dht.ByteOrderedPartitioner' ...;
CREATE CUSTOM INDEX idx ON ks.t (col) USING 'org.apache.cassandra.index.sasi.SASIIndex';
// after
CREATE KEYSPACE ks WITH partitioner = 'org.apache.cassandra.dht.Murmur3Partitioner' ...;
CREATE CUSTOM INDEX idx ON ks.t (col) USING 'org.apache.cassandra.index.sasi.SASIIndex';
Defensive patterns

Strategy: validation

Validate before calling

Row r = session.execute("SELECT partitioner FROM system.local").one();
if (!r.getString("partitioner").endsWith("Murmur3Partitioner"))
    throw new IllegalStateException("SASI requires Murmur3Partitioner");

Try / catch

try {
    session.execute(createIndexCql);
} catch (ConfigurationException e) {
    if (e.getMessage().contains("Murmur3Partitioner")) {
        // recreate keyspace with default partitioner or choose a different index
    }
}

Prevention

When it happens

Trigger: CREATE CUSTOM INDEX ... USING 'org.apache.cassandra.index.sasi.SASIIndex' on a table whose keyspace was created with a non-Murmur3 partitioner.

Common situations: Legacy clusters migrated from RandomPartitioner/ByteOrderedPartitioner; copied keyspaces using non-default partitioners; misconfigured cassandra.yaml partitioner when creating the schema.

Related errors


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