apache/cassandra · error · ConfigurationException

Invalid value for 'provide_overlapping_tombstones'…

Error message

Invalid value %s for 'provide_overlapping_tombstones' compaction sub-option - must be one of the following [%s].

What it means

Thrown by CompactionParams.create() when the compaction sub-option 'provide_overlapping_tombstones' has a value that is not a valid TombstoneOption enum name. Cassandra parses the string (case-insensitively, after uppercasing) into a TombstoneOption and rejects anything unrecognized.

Solutions

  1. Set the option to one of the values printed in the message, e.g. 'UNRECOGNIZED', 'DISABLED' or 'ALLOWED' (check TombstoneOption.values() for your version).
  2. If you meant a boolean, remove the option entirely and use the default.
  3. Run cqlsh DESCRIBE / check the compaction class docs for supported sub-options of your STCS/LCS/UCS/TWCS class.
  4. Fix the config-management template that emits the wrong literal.

Example fix

// before
ALTER TABLE t WITH compaction = {'class':'SizeTieredCompactionStrategy','provide_overlapping_tombstones':'true'};
// after
ALTER TABLE t WITH compaction = {'class':'SizeTieredCompactionStrategy','provide_overlapping_tombstones':'ALLOWED'};
Defensive patterns

Strategy: validation

Validate before calling

Set<String> valid = Arrays.stream(TombstoneOption.values()).map(Enum::name).collect(Collectors.toSet());
if (opt != null && !valid.contains(opt.toUpperCase(Locale.ROOT)))
    throw new IllegalArgumentException("provide_overlapping_tombstones must be one of " + valid);

Try / catch

try { schema.alterTableWithCompaction(opts); } catch (ConfigurationException e) {
    if (e.getMessage().contains("provide_overlapping_tombstones")) {
        opts.remove("provide_overlapping_tombstones"); // retry with default
    }
}

Prevention

When it happens

Trigger: ALTER TABLE ... WITH compaction = {'class': '...', 'provide_overlapping_tombstones': '<bad>'} or setting the option programmatically via CompactionParams.fromMap()/create() with a misspelled or unsupported value.

Common situations: Typo like 'true'/'false' instead of a valid TombstoneOption value; copying config from another Cassandra version that allowed a different value set; generated config tooling emitting boolean strings.

Understand the failure class

Background: Invalid enum value errors: "Unknown type", "Invalid scope", "must be one of" — when a string is not on the library's allowed list — this error's family across 23 libraries.

Related errors


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

Appendix: source

Thrown at src/java/org/apache/cassandra/schema/CompactionParams.java:136

    {
        this.klass = klass;
        this.options = ImmutableMap.copyOf(options);
        this.isEnabled = isEnabled;
        this.tombstoneOption = tombstoneOption;
        this.onlyPurgeRepairedTombstones = Boolean.parseBoolean(options.get(AbstractCompactionStrategy.ONLY_PURGE_REPAIRED_TOMBSTONES));
    }

    public static CompactionParams create(Class<? extends AbstractCompactionStrategy> klass, Map<String, String> options)
    {
        boolean isEnabled = options.containsKey(Option.ENABLED.toString())
                          ? Boolean.parseBoolean(options.get(Option.ENABLED.toString()))
                          : DEFAULT_ENABLED;
        String overlappingTombstoneParm = toUpperCaseLocalized(options.getOrDefault(Option.PROVIDE_OVERLAPPING_TOMBSTONES.toString(),
                                                               DEFAULT_PROVIDE_OVERLAPPING_TOMBSTONES_PROPERTY_VALUE.toString()));
        Optional<TombstoneOption> tombstoneOptional = TombstoneOption.forName(overlappingTombstoneParm);
        if (!tombstoneOptional.isPresent())
        {
            throw new ConfigurationException(format("Invalid value %s for 'provide_overlapping_tombstones' compaction sub-option - must be one of the following [%s].",
                                                    overlappingTombstoneParm,
                                                    StringUtils.join(TombstoneOption.values(), ", ")));
        }
        TombstoneOption tombstoneOption = tombstoneOptional.get();

        Map<String, String> allOptions = new HashMap<>(options);
        if (supportsThresholdParams(klass))
        {
            allOptions.putIfAbsent(Option.MIN_THRESHOLD.toString(), Integer.toString(DEFAULT_MIN_THRESHOLD));
            allOptions.putIfAbsent(Option.MAX_THRESHOLD.toString(), Integer.toString(DEFAULT_MAX_THRESHOLD));
        }

        return new CompactionParams(klass, allOptions, isEnabled, tombstoneOption);
    }

    public static CompactionParams stcs(Map<String, String> options)
    {
        return create(SizeTieredCompactionStrategy.class, options);

View on GitHub (pinned to 88fd0f6a0e)