apache/cassandra · info
Overriding max local pause time from ms to ms
Error message
Overriding {} max local pause time from {}ms to {}ms What it means
FailureDetector reads the max local pause time (cassandra.max_local_pause_in_ms, default 5000) at startup. If the value differs from the built-in default, it logs a warning that the operator is overriding how long local pauses (GC/scheduler stalls) are tolerated before phrasing nodes as failed. The value is converted to nanoseconds and used for phi/pause detection.
Solutions
- No action needed if the override is intentional — this is an informational warning confirming the custom value took effect.
- To silence the warning, remove the override so the default (5000ms) is used.
- Validate the chosen pause value against your JVM GC pause targets; too low causes spurious node flapping in gossip.
Example fix
// before (cassandra.yaml) cassandra.max_local_pause_in_ms: 10000 // warns: overriding from 5000 // after # remove the setting to use the default and silence the warning # cassandra.max_local_pause_in_ms: 5000
Defensive patterns
Strategy: validation
Validate before calling
# Check whether the override is intentional before starting the node grep 'cassandra.max_local_pause_in_ms' /etc/cassandra/cassandra.yaml # Compare with default 5000; if unset, expect no warning
Prevention
- Only override max local pause time when you have measured your JVM's actual GC pause distribution.
- Keep the override documented in your runbook so the warning is recognizable.
- Re-evaluate the value after JVM/GC changes (e.g. G1 vs CMS, heap size changes).
- Set it consistently across all nodes in the cluster to avoid divergent failure detection.
When it happens
Trigger: Setting cassandra.max_local_pause_in_ms in cassandra.yaml (or overriding the system property) to any value other than the default, then starting the node.
Common situations: Tuning failure detection on VMs or containers with expected long GC pauses; operators lowering or raising the pause budget without realizing the warning is informational.
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
- A maximum number of tokens per node is supported
- accord.cache_size option was set incorrectly to
- accord.journal_directory must not be the same as any…
- Allowing java.lang.System.* access in UDFs is dangerous and…
- be positive
AI-assisted analysis of apache/cassandra@88fd0f6a0e (2026-09-10).
Data as JSON: /api/errors/85c40d9375f8a0f1.
Report an issue: GitHub.
Appendix: source
Thrown at src/java/org/apache/cassandra/gms/FailureDetector.java:91
* Check the paper and the <i>IFailureDetector</i> interface for details.
*/
public class FailureDetector implements IFailureDetector, FailureDetectorMBean
{
private static final Logger logger = LoggerFactory.getLogger(FailureDetector.class);
public static final String MBEAN_NAME = "org.apache.cassandra.net:type=FailureDetector";
private static final int SAMPLE_SIZE = 1000;
protected static final long INITIAL_VALUE_NANOS = TimeUnit.NANOSECONDS.convert(getInitialValue(), TimeUnit.MILLISECONDS);
private static final int DEBUG_PERCENTAGE = 80; // if the phi is larger than this percentage of the max, log a debug message
private static final long MAX_LOCAL_PAUSE_IN_NANOS = getMaxLocalPause();
private long lastInterpret = preciseTime.now();
private long lastPause = 0L;
private static long getMaxLocalPause()
{
long pause = MAX_LOCAL_PAUSE_IN_MS.getLong();
if (!String.valueOf(pause).equals(MAX_LOCAL_PAUSE_IN_MS.getDefaultValue()))
logger.warn("Overriding {} max local pause time from {}ms to {}ms",
MAX_LOCAL_PAUSE_IN_MS.getKey(), MAX_LOCAL_PAUSE_IN_MS.getDefaultValue(), pause);
return pause * 1000000L;
}
public static final IFailureDetector instance = newFailureDetector();
public static final Predicate<InetAddressAndPort> isEndpointAlive = instance::isAlive;
public static final Predicate<Replica> isReplicaAlive = r -> isEndpointAlive.test(r.endpoint());
// this is useless except to provide backwards compatibility in phi_convict_threshold,
// because everyone seems pretty accustomed to the default of 8, and users who have
// already tuned their phi_convict_threshold for their own environments won't need to
// change.
private final double PHI_FACTOR = 1.0 / Math.log(10.0); // 0.434...
private final ConcurrentHashMap<InetAddressAndPort, ArrivalWindow> arrivalSamples = new ConcurrentHashMap<>();
private final List<IFailureDetectionEventListener> fdEvntListeners = new CopyOnWriteArrayList<>();
View on GitHub (pinned to 88fd0f6a0e)