apache/cassandra · error · ConfigurationException
internode_max_message_size must no exceed internode_applicat
Error message
internode_max_message_size must no exceed internode_application_send_queue_reserve_global_capacity
What it means
Cassandra's DatabaseDescriptor validates at startup that internode_max_message_size fits within the internode application send/receive queue reserve capacities. This throw fires when maxMessageSize exceeds internode_application_send_queue_reserve_global_capacity. It prevents a configuration where messages can never be buffered by the global send queue.
Source
Thrown at src/java/org/apache/cassandra/config/DatabaseDescriptor.java:1216
throw new ConfigurationException("legacy_ssl_storage_port_enabled is true (enabled) with internode encryption disabled (none). Enable encryption or disable the legacy ssl storage port.");
}
}
if (conf.internode_max_message_size != null)
{
long maxMessageSize = conf.internode_max_message_size.toBytes();
if (maxMessageSize > conf.internode_application_receive_queue_reserve_endpoint_capacity.toBytes())
throw new ConfigurationException("internode_max_message_size must no exceed internode_application_receive_queue_reserve_endpoint_capacity", false);
if (maxMessageSize > conf.internode_application_receive_queue_reserve_global_capacity.toBytes())
throw new ConfigurationException("internode_max_message_size must no exceed internode_application_receive_queue_reserve_global_capacity", false);
if (maxMessageSize > conf.internode_application_send_queue_reserve_endpoint_capacity.toBytes())
throw new ConfigurationException("internode_max_message_size must no exceed internode_application_send_queue_reserve_endpoint_capacity", false);
if (maxMessageSize > conf.internode_application_send_queue_reserve_global_capacity.toBytes())
throw new ConfigurationException("internode_max_message_size must no exceed internode_application_send_queue_reserve_global_capacity", false);
}
else
{
long maxMessageSizeInBytes =
Math.min(conf.internode_application_receive_queue_reserve_endpoint_capacity.toBytes(),
conf.internode_application_send_queue_reserve_endpoint_capacity.toBytes());
conf.internode_max_message_size = new DataStorageSpec.IntBytesBound(maxMessageSizeInBytes);
}
validateMaxConcurrentAutoUpgradeTasksConf(conf.max_concurrent_automatic_sstable_upgrades);
if (conf.default_keyspace_rf < conf.minimum_replication_factor_fail_threshold)
{
throw new ConfigurationException(String.format("default_keyspace_rf (%d) cannot be less than minimum_replication_factor_fail_threshold (%d)",
conf.default_keyspace_rf, conf.minimum_replication_factor_fail_threshold));
}
View on GitHub (pinned to 88fd0f6a0e)
Solutions
- Increase internode_application_send_queue_reserve_global_capacity in cassandra.yaml to at least internode_max_message_size
- Lower internode_max_message_size to fit within the configured global send queue reserve capacity
- Also check internode_application_send_queue_reserve_endpoint_capacity and internode_application_receive_queue_reserve_endpoint_capacity, which are validated similarly just above
Example fix
// before (cassandra.yaml) internode_max_message_size: 64MiB internode_application_send_queue_reserve_global_capacity: 32MiB // after internode_max_message_size: 64MiB internode_application_send_queue_reserve_global_capacity: 128MiB
Defensive patterns
Strategy: validation
Validate before calling
if (conf.internode_max_message_size.toBytes() > conf.internode_application_send_queue_reserve_global_capacity.toBytes()) throw new IllegalArgumentException("internode_max_message_size exceeds global send queue reserve capacity"); Try / catch
try { DatabaseDescriptor.toolInitialization(); } catch (ConfigurationException e) { logger.error("Invalid internode message/queue config", e); System.exit(1); } Prevention
- Keep internode_max_message_size below all four queue reserve capacities (send/receive, endpoint/global)
- Validate cassandra.yaml with a config linter before rollout
- When raising message size, raise queue reserves proportionally
When it happens
Trigger: Calling DatabaseDescriptor.applySimpleConfig (via toolInitialization or applyAll) with cassandra.yaml where internode_max_message_size > internode_application_send_queue_reserve_global_capacity in bytes.
Common situations: Operators raise internode_max_message_size for large batches/mutations but forget to also raise the send/receive queue reserve capacities; copying settings from a tuned cluster without matching queue capacities.
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
- repair_session_max_tree_depth should not be < 10, but was ${
- Write thresholds require top partitions tracking to be enabl
- Load CIDR groups cache operation not supported by %s
- Unsupported parameter '%s' for %s, supported parameters are
- JAAS login configuration missing for JMX authenticator setup
AI-assisted analysis of apache/cassandra@88fd0f6a0e (2026-09-10).
Data as JSON: /api/errors/70af7ba293cdf777.
Report an issue: GitHub.