apache/cassandra · error · OverloadedException
Password for role can only be changed every %sms.
Error message
Password for role %s can only be changed every %sms.
What it means
InvalidRequestException from enforcePasswordUpdateRateLimit (invoked by alterRole): the role's salted_hash writetime shows the password was changed within the configured minimum interval, so another change is rejected. The read compares PASSWORD_UPDATE_MIN_INTERVAL_MS against the elapsed time since salted_hash_writetime.
Solutions
- Wait until the minimum password update interval has elapsed since the last change
- Change the password only once per interval window rather than repeatedly
- Adjust the password update rate limit guardrail/setting if a legitimate operational need requires more frequent rotation
Defensive patterns
Strategy: validation
When it happens
Trigger: Thrown at src/java/org/apache/cassandra/auth/CassandraRoleManager.java:736 when the library encounters an invalid state.
Common situations: See trigger scenarios.
AI-assisted analysis of apache/cassandra@88fd0f6a0e (2026-09-10).
Data as JSON: /api/errors/2bf4e23adf95d936.
Report an issue: GitHub.
Appendix: source
Thrown at src/java/org/apache/cassandra/auth/CassandraRoleManager.java:736
ResultMessage.Rows rows = select(loadRoleWithWritetimeStatement, options);
boolean hasRecentPasswordUpdates = !rows.result.isEmpty();
if (hasRecentPasswordUpdates)
{
UntypedResultSet.Row row = UntypedResultSet.create(rows.result).one();
hasRecentPasswordUpdates = row.has("salted_hash_writetime")
&& PASSWORD_UPDATE_MIN_INTERVAL_MS >= (Clock.Global.currentTimeMillis() - TimeUnit.MICROSECONDS.toMillis(row.getLong("salted_hash_writetime")));
}
if (!hasRecentPasswordUpdates)
{
recentPasswordUpdates.put(roleName, Boolean.TRUE);
logger.info(String.format("Password changing for role %s by %s", roleName, performer.getName()));
return;
}
}
String failure = String.format("Password for role %s can only be changed every %sms.", roleName, PASSWORD_UPDATE_MIN_INTERVAL_MS);
logger.warn(String.format("%s [performer: %s]", failure, performer.getName()));
throw new OverloadedException(failure);
}
private static ByteBuffer byteBuf(String str)
{
return UTF8Type.instance.decompose(str);
}
/**
* Executes the provided query.
* This shouldn't be used during setup as this will directly return an error if the manager is not setup yet. Setup tasks
* should use QueryProcessor.process directly.
*/
@VisibleForTesting
UntypedResultSet process(String query, ConsistencyLevel consistencyLevel)
throws RequestValidationException, RequestExecutionException
{
return QueryProcessor.process(query, consistencyLevel);
}View on GitHub (pinned to 88fd0f6a0e)