apache/cassandra · error · IllegalArgumentException

Unable to parse property for check_data_resurrection…

Error message

Unable to parse ${MINIMUM_THRESHOLD_CONFIG_PROPERTY} property for check_data_resurrection startup check.

What it means

IllegalArgumentException thrown by DataResurrectionCheck.getMinimumThresholdMillis when the value supplied for the check_data_resurrection startup-check property (MINIMUM_THRESHOLD_CONFIG_PROPERTY) cannot be parsed as a DurationSpec.LongSecondsBound. The startup check guards against data resurrection after node downtime, and the custom threshold must be a valid seconds-based duration.

Solutions

  1. Set the property to a plain number of seconds (e.g. 600) or a valid DurationSpec format such as '10m'/'1h' that LongSecondsBound accepts.
  2. Remove the property entirely to fall back to the default (0 / gc_grace-only) behavior.
  3. Check cassandra-env.sh / JVM options for the exact property name and value; fix the malformed entry and restart.
  4. Consult DurationSpec documentation for accepted units and magnitudes to avoid bound overflow.

Example fix

// before (in jvm-server options / system property)
-Dcassandra.check_data_resurrection.minimum_threshold=10minutes
// after
-Dcassandra.check_data_resurrection.minimum_threshold=600
Defensive patterns

Strategy: validation

Validate before calling

String v = System.getProperty("cassandra.check_data_resurrection.minimum_threshold");
if (v != null) {
    try { new org.apache.cassandra.config.DurationSpec.LongSecondsBound(v); }
    catch (Exception e) { throw new IllegalStateException("Invalid threshold value: " + v, e); }
}

Prevention

When it happens

Trigger: Setting the system property for the check_data_resurrection startup check to a non-numeric or non-duration value (e.g. '10m', 'fast', '100000000000000' overflowing the long seconds bound) so new DurationSpec.LongSecondsBound(value) throws, with value provided but unparseable.

Common situations: Typos in cassandra-env.jspublish/system properties when tuning the startup check; using duration units unsupported by LongSecondsBound (it expects seconds-formatted values); copy-pasting values from other tools that accept different duration syntax.

Understand the failure class

Background: "Invalid value" and "allowed values are" config errors: what your library rejected and how to fix it — this error's family across 41 libraries.

Related errors


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

Appendix: source

Thrown at src/java/org/apache/cassandra/service/DataResurrectionCheck.java:175

        LOGGER.trace("Resolved heartbeat file for data resurrection check: " + heartbeatFile);

        return heartbeatFile;
    }

    static long getMinimumThresholdMillis(Map<String, Object> config)
    {
        String minimumThresholdConfigValue = (String) config.get(MINIMUM_THRESHOLD_CONFIG_PROPERTY);
        long minimumThresholdInMs;
        if (minimumThresholdConfigValue != null)
        {
            try
            {
                minimumThresholdInMs = new DurationSpec.LongSecondsBound(minimumThresholdConfigValue).to(MILLISECONDS);
            }
            catch (Throwable t)
            {
                throw new IllegalArgumentException("Unable to parse " + MINIMUM_THRESHOLD_CONFIG_PROPERTY
                                                   + " property for check_data_resurrection startup check.");
            }
        }
        else
        {
            minimumThresholdInMs = 0;
        }

        if (minimumThresholdInMs == 0)
        {
            LOGGER.warn(MINIMUM_THRESHOLD_CONFIG_PROPERTY + " property for check_data_resurrection startup check " +
                        "is not set or is set to 0s. Consider increasing the default value as the startup check " +
                        "might prevent the startup of the node when gc_grace_seconds for user tables " +
                        "is set very low and the node is restarted.");
        }

        return minimumThresholdInMs;
    }

View on GitHub (pinned to 88fd0f6a0e)