apache/cassandra · error · ConfigurationException

internode_max_message_size must no exceed…

Error message

internode_max_message_size must no exceed internode_application_send_queue_reserve_endpoint_capacity

What it means

For symmetry with the receive path, internode_max_message_size cannot exceed the per-endpoint reserved capacity of the internode send queue; a max-size message must fit in the reserved send buffer. DatabaseDescriptor throws this ConfigurationException when maxMessageSize > internode_application_send_queue_reserve_endpoint_capacity.

Solutions

  1. Raise internode_application_send_queue_reserve_endpoint_capacity_in_bytes to at least internode_max_message_size_in_bytes
  2. Lower internode_max_message_size_in_bytes to fit within the send-queue reserve
  3. Remove overrides and use defaults

Example fix

# before (cassandra.yaml)
internode_max_message_size_in_bytes: 104857600
internode_application_send_queue_reserve_endpoint_capacity_in_bytes: 8388608
# after
internode_max_message_size_in_bytes: 104857600
internode_application_send_queue_reserve_endpoint_capacity_in_bytes: 134217728
Defensive patterns

Strategy: validation

Validate before calling

if (conf.internode_max_message_size != null &&
    conf.internode_max_message_size.toBytes() > conf.internode_application_send_queue_reserve_endpoint_capacity.toBytes())
    throw new IllegalArgumentException("internode_max_message_size must not exceed send-queue endpoint reserve");

Try / catch

try { DatabaseDescriptor.applyConfig(conf); } catch (ConfigurationException e) { if (e.getMessage().contains("send_queue_reserve_endpoint_capacity")) { /* raise send reserve or lower message size */ } }

Prevention

When it happens

Trigger: cassandra.yaml sets internode_max_message_size_in_bytes greater than internode_application_send_queue_reserve_endpoint_capacity_in_bytes (after both receive-queue checks pass) during applySimpleConfig.

Common situations: Tuning only the receive-side reserves for large messages; memory-reduction exercises that shrank send queues; version upgrades where send-queue default shrank below a previously set message size.

Understand the failure class

Background: Conflicting config options: "cannot be used together" — configuration validation errors across open-source libraries — this error's family across 162 libraries.

Related errors


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

Appendix: source

Thrown at src/java/org/apache/cassandra/config/DatabaseDescriptor.java:1213

            if (conf.server_encryption_options.legacy_ssl_storage_port_enabled &&
                conf.server_encryption_options.tlsEncryptionPolicy() == EncryptionOptions.TlsEncryptionPolicy.UNENCRYPTED)
            {
                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)",

View on GitHub (pinned to 88fd0f6a0e)