aeron-io/aeron · error · IllegalArgumentException
key length out of bounds
Error message
key length out of bounds: <keyLength>
What it means
Thrown by ClientConductor.addCounter when the provided key length is negative or exceeds CountersManager.MAX_KEY_LENGTH. Counter keys live in a fixed-size buffer managed by the counters manager, so out-of-bounds lengths cannot be represented.
Solutions
- Shrink the key payload so keyLength <= CountersManager.MAX_KEY_LENGTH.
- Fix keyOffset/keyLength computation and validate 0 <= keyLength before calling.
- Store large metadata externally and keep only a small id/handle in the key.
Example fix
// before
int keyLength = serialized.length; // may exceed CountersManager.MAX_KEY_LENGTH
client.addCounter(typeId, keyBuffer, 0, keyLength, labelBuffer, 0, labelLength);
// after
int keyLength = Math.min(serialized.length, CountersManager.MAX_KEY_LENGTH); // or validate and fail with your own message
if (serialized.length > CountersManager.MAX_KEY_LENGTH) throw new IllegalStateException("counter key too large"); Defensive patterns
Strategy: validation
Validate before calling
if (keyLength < 0 || keyLength > CountersManager.MAX_KEY_LENGTH) throw new IllegalArgumentException("keyLength=" + keyLength);
client.addCounter(typeId, keyBuffer, keyOffset, keyLength, labelBuffer, labelOffset, labelLength); Try / catch
try { client.addCounter(typeId, keyBuffer, keyOffset, keyLength, labelBuffer, labelOffset, labelLength); } catch (IllegalArgumentException e) { log.error("counter key invalid: {}", e.getMessage()); } Prevention
- Check CountersManager.MAX_KEY_LENGTH before encoding key metadata.
- Store large metadata outside the counter key.
- Assert keyOffset + keyLength fits within the key buffer.
When it happens
Trigger: Calling addCounter(typeId, keyBuffer, keyOffset, keyLength, labelBuffer, labelOffset, labelLength) with keyLength < 0 or keyLength > CountersManager.MAX_KEY_LENGTH (also keyOffset+keyLength overflowing the provided buffer).
Common situations: Serializing a custom metadata object into the key buffer larger than the max key length; passing buffer.remaining() where the offset was wrong; uninitialized length variables defaulting oddly or computed as negative.
Understand the failure class
Background: "value must be between 0 and 1" / "out of range" / "must not be negative" errors: fixing range-validation failures across open-source libraries — this error's family across 42 libraries.
Related errors
- label length out of bounds
- label length exceeds MAX_LABEL_LENGTH: <label.length()>
- counter id is negative
- counter id out of range: 0 - maxCounterId=
- existing max write time counter detected for archiveId=
AI-assisted analysis of aeron-io/aeron@6d60124e15 (2026-09-12).
Data as JSON: /api/errors/ead27b5e788e0237.
Report an issue: GitHub.
Appendix: source
Thrown at aeron-client/src/main/java/io/aeron/ClientConductor.java:1134
Counter addCounter(
final int typeId,
final DirectBuffer keyBuffer,
final int keyOffset,
final int keyLength,
final DirectBuffer labelBuffer,
final int labelOffset,
final int labelLength)
{
clientLock.lock();
try
{
ensureActive();
ensureNotReentrant();
if (keyLength < 0 || keyLength > CountersManager.MAX_KEY_LENGTH)
{
throw new IllegalArgumentException("key length out of bounds: " + keyLength);
}
if (labelLength < 0 || labelLength > CountersManager.MAX_LABEL_LENGTH)
{
throw new IllegalArgumentException("label length out of bounds: " + labelLength);
}
final long registrationId = driverProxy.addCounter(
typeId, keyBuffer, keyOffset, keyLength, labelBuffer, labelOffset, labelLength);
awaitResponse(registrationId);
return (Counter)resourceByRegIdMap.get(registrationId);
}
finally
{
clientLock.unlock();
}View on GitHub (pinned to 6d60124e15)