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

  1. Wait until the minimum password update interval has elapsed since the last change
  2. Change the password only once per interval window rather than repeatedly
  3. 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)