apache/cassandra · error · IllegalArgumentException
Unknown table '{tblName}' in keyspace '{ksName}'
Error message
Unknown table '{tblName}' in keyspace '{ksName}' What it means
IllegalArgumentException from StorageService.getPaxosBallotLowBound when the requested table does not exist in the given keyspace. The keyspace was resolved (it exists), but ColumnFamilyStore lookup returned nothing for tblName, so the JMX call for a paxos ballot low bound is rejected.
Source
Thrown at src/java/org/apache/cassandra/service/StorageService.java:5614
{
return PaxosCommit.getEnableDcLocalCommit();
}
public void setPaxosDcLocalCommitEnabled(boolean enabled)
{
PaxosCommit.setEnableDcLocalCommit(enabled);
logger.info("paxos dc local commit {} via jmx", enabled ? "enabled" : "disabled");
}
public String getPaxosBallotLowBound(String ksName, String tblName, String key)
{
Keyspace keyspace = Keyspace.open(ksName);
if (keyspace == null)
throw new IllegalArgumentException("Unknown keyspace '" + ksName + "'");
ColumnFamilyStore cfs = keyspace.getColumnFamilyStore(tblName);
if (cfs == null)
throw new IllegalArgumentException("Unknown table '" + tblName + "' in keyspace '" + ksName + "'");
TableMetadata table = cfs.metadata.get();
DecoratedKey dk = table.partitioner.decorateKey(table.partitionKeyType.fromString(key));
return cfs.getPaxosRepairHistory().ballotForToken(dk.getToken()).toString();
}
public Long getRepairRpcTimeout()
{
return DatabaseDescriptor.getRepairRpcTimeout(MILLISECONDS);
}
public void setRepairRpcTimeout(Long timeoutInMillis)
{
checkState(timeoutInMillis > 0);
DatabaseDescriptor.setRepairRpcTimeout(timeoutInMillis);
logger.info("RepairRpcTimeout set to {}ms via JMX", timeoutInMillis);
}
public void evictHungRepairs()View on GitHub (pinned to 88fd0f6a0e)
Solutions
- List tables with `DESCRIBE TABLES` / `SELECT table_name FROM system_schema.tables WHERE keyspace_name = '...'` and correct the table name.
- Verify identifier casing matches the CREATE TABLE statement.
- If the table was dropped/renamed, point the call at the new table name.
Example fix
// before
String ballot = ssProxy.getPaxosBallotLowBound("ks", "MyTable", key); // table is actually 'mytable'
// after
String ballot = ssProxy.getPaxosBallotLowBound("ks", "mytable", key); Defensive patterns
Strategy: validation
Validate before calling
KeyspaceMetadata ks = Schema.instance.getKeyspaceMetadata(ksName);
if (ks == null || ks.tables.get(tblName) == null) throw new IllegalArgumentException("table " + tblName + " not found in " + ksName); Try / catch
try { return ssProxy.getPaxosBallotLowBound(ksName, tblName, key); }
catch (IllegalArgumentException e) { if (e.getMessage().contains("Unknown table")) { /* correct table name */ } throw e; } Prevention
- List tables per keyspace from system_schema.tables before calling
- Use bare table names with exact casing
- Watch for table renames during migrations
When it happens
Trigger: Calling getPaxosBallotLowBound with a table name not present in the named keyspace, or a dropped/renamed table.
Common situations: Typo in table name; table renamed after a migration; querying a table that exists in another keyspace; case mismatch (quoted vs unquoted identifiers).
Understand the failure class
Background: 'Could not be found', 'does not exist', 'not found in database': the resource-not-found family when an ID, slug, key, or URI lookup comes back empty — this error's family across 20 libraries.
Related errors
- Unknown keyspace '{ksName}'
- %s is not a valid JMX resource name
- JAAS login configuration missing for JMX authenticator setup
- Authentication error
- Unrecognized Callback:
AI-assisted analysis of apache/cassandra@88fd0f6a0e (2026-09-10).
Data as JSON: /api/errors/8d64758be09a86f4.
Report an issue: GitHub.